Forum Webscript.Ru

Программирование => Perl => Тема начата: Paul56 от 28 Августа 2007, 20:33:47

Название: Сортировка массива
Отправлено: Paul56 от 28 Августа 2007, 20:33:47
о гуру перла, подскажите как мне решить следующую ситуацию:

есть:

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

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

Надо чтобы второй элемент массива стал первым, как правельно написать ?
Название: Сортировка массива
Отправлено: NeoNox от 29 Августа 2007, 01:06:21
Цитировать
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 от 29 Августа 2007, 17:05:06
Я бы сделал так:

use strict;

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

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

print "@massiv\\n";

Просто не люблю плодить переменные, хотя читабельности это не добавляет.
Название: Сортировка массива
Отправлено: NeoNox от 29 Августа 2007, 17:37:41
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<1> 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<2> sub a2 () { my @massiv = ("A", "B", "C", "D", "E", "F"); my $dannie=2; unshift @massiv,splice(@massiv,$dannie-1,1); }

  DB<3> 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<4> 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 от 29 Августа 2007, 19:19:14
Алекс, а у меня другие рузультаты, только ты не заметил, что я добавил еще одну операцию вычитания, для удобства, если ее убрать то вот что получается:

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)


Так что с точки зрения производительности все равно, сплайс то тоже работает через переменную.
Название: Сортировка массива
Отправлено: NeoNox от 29 Августа 2007, 20:39:12
У тебя медленнее сервер ;)
Убедил.
Название: Сортировка массива
Отправлено: vladsu от 30 Августа 2007, 01:49:24
Цитировать
NeoNox:
У тебя медленнее сервер

Это мой бук, на сервак не претендующий :-P