Программирование > Perl

Сортировка массива

(1/2) > >>

Paul56:
о гуру перла, подскажите как мне решить следующую ситуацию:

есть:

$dannie=2 # Эта цифра может быть разной от 0 до 8 она передаётся через http

@massiv = ("A", "B", "C", "D", "E", "F");

Надо чтобы второй элемент массива стал первым, как правельно написать ?

NeoNox:

--- Цитировать ---Paul56:
как правельно написать
--- Конец цитаты ---

ПравЕльно написать "правИльно".
А скрипт может иметь такой вид

perl -de0

Loading DB routines from perl5db.pl version 1.27
Editor support available.

Enter h or `h h\' for help, or `man perldebug\' for more help.

main::(-e:1):   0
                                                                                  DB<1> @massiv = ("A", "B", "C", "D", "E", "F")

                                                                                  DB<2> $massiv_t = $massiv[0]

                                                                                  DB<3> $dannie=2

                                                                                  DB<4> $massiv[0] = $massiv[$dannie]

                                                                                  DB<5> $massiv[$dannie] = $massiv_t

                                                                                  DB<6> p @massiv
CBADEF

Это если через дополнительную переменную. Можно и идиомами, но выигрыша, скорее всего, не будет.

vladsu:
Я бы сделал так:

--- Код: ---
use strict;

my @massiv = ("A", "B", "C", "D", "E", "F");
my $dannie=2;

unshift @massiv,splice(@massiv,$dannie-1,1);

print "@massiv\\n";

--- Конец кода ---

Просто не люблю плодить переменные, хотя читабельности это не добавляет.

NeoNox:
perl -MBenchmark -de0

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h\' for help, or `man perldebug\' for more help.

main::(-e:1):   0
  DB sub a1 () { my @massiv = ("A", "B", "C", "D", "E", "F"); my $massiv_t = $massiv[0]; my $dannie=2; $massiv[0] = $massiv[$dannie]; $massiv[$dannie] = $massiv_t; }

  DB sub a2 () { my @massiv = ("A", "B", "C", "D", "E", "F"); my $dannie=2; unshift @massiv,splice(@massiv,$dannie-1,1); }

  DB timethese (100000,{ "simple" => \\&a1, "unshift" => \\&a2 })
Benchmark: timing 100000 iterations of simple, unshift...
    simple:  0 wallclock secs (-0.01 usr +  0.00 sys = -0.01 CPU) @ -10000000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
   unshift:  0 wallclock secs ( 0.04 usr +  0.00 sys =  0.04 CPU) @ 2500000.00/s (n=100000)
            (warning: too few iterations for a reliable count)

  DB timethese (1000000,{ "simple" => \\&a1, "unshift" => \\&a2 })
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  1 wallclock secs (-0.10 usr +  0.00 sys = -0.10 CPU) @ -10000000.00/s (n=1000000)
            (warning: too few iterations for a reliable count)
   unshift:  1 wallclock secs ( 0.35 usr +  0.00 sys =  0.35 CPU) @ 2857142.86/s (n=1000000)
            (warning: too few iterations for a reliable count)

vladsu:
Алекс, а у меня другие рузультаты, только ты не заметил, что я добавил еще одну операцию вычитания, для удобства, если ее убрать то вот что получается:

--- Код: ---
use strict;
use Benchmark;

timethese(1_000_000, {
               \'simple\'  => sub { my @massiv = ("A", "B", "C", "D", "E", "F");my $massiv_t = $massiv[0]; my $dannie=2; $massiv[0] = $massiv[$dannie]; $massiv[$dannie] = $massiv_t; },
               \'unshift\' => sub { my @massiv = ("A", "B", "C", "D", "E", "F");my $dannie=2;unshift @massiv,splice(@massiv,$dannie,1); },
           });

--- Конец кода ---



--- Код: ---
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  4 wallclock secs ( 3.52 usr +  0.00 sys =  3.52 CPU) @ 284090.91/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.54 usr +  0.00 sys =  3.54 CPU) @ 282485.88/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  5 wallclock secs ( 3.60 usr +  0.00 sys =  3.60 CPU) @ 277777.78/s (n=1000000)
   unshift:  4 wallclock secs ( 3.59 usr +  0.00 sys =  3.59 CPU) @ 278551.53/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  4 wallclock secs ( 3.59 usr +  0.00 sys =  3.59 CPU) @ 278551.53/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.01 sys =  3.56 CPU) @ 280898.88/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.52 usr +  0.00 sys =  3.52 CPU) @ 284090.91/s (n=1000000)
   unshift:  4 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.66 usr +  0.00 sys =  3.66 CPU) @ 273224.04/s (n=1000000)
   unshift:  3 wallclock secs ( 3.56 usr +  0.00 sys =  3.56 CPU) @ 280898.88/s (n=1000000)

--- Конец кода ---


Так что с точки зрения производительности все равно, сплайс то тоже работает через переменную.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии