Forum Webscript.Ru
Программирование => Perl => Тема начата: Paul56 от 28 Августа 2007, 20:33:47
-
о гуру перла, подскажите как мне решить следующую ситуацию:
есть:
$dannie=2 # Эта цифра может быть разной от 0 до 8 она передаётся через http
@massiv = ("A", "B", "C", "D", "E", "F");
Надо чтобы второй элемент массива стал первым, как правельно написать ?
-
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
Это если через дополнительную переменную. Можно и идиомами, но выигрыша, скорее всего, не будет.
-
Я бы сделал так:
use strict;
my @massiv = ("A", "B", "C", "D", "E", "F");
my $dannie=2;
unshift @massiv,splice(@massiv,$dannie-1,1);
print "@massiv\\n";
Просто не люблю плодить переменные, хотя читабельности это не добавляет.
-
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)
-
Алекс, а у меня другие рузультаты, только ты не заметил, что я добавил еще одну операцию вычитания, для удобства, если ее убрать то вот что получается:
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:
У тебя медленнее сервер
Это мой бук, на сервак не претендующий :-P