Forum Webscript.Ru
Программирование => Perl => Тема начата: Alniger от 17 Мая 2006, 12:16:19
-
Зравствуйте, webscript.ru
Помогите, решить задачу:
Существует массив
@var1=(2000,6000,9000,12000);
есть переменная $mas1=6000;
соответсвенно есть элемент в массиве @var1 равный $mas1 => он же @var1[1];
Каким образом можно определить этот номер элемента в массиве и записать его в переменную $nomelem (должно получиться $nomelem=1);
Заранее благодарю, за Вашу помощь.
-
my $nomelem = 0; print grep { defined } map { $cnt++; $_ == $mas1 ? $cnt : undef } @var1;
-
my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;
-
Прописал програмку, проходит но:
#!/usr/bin/perl -w
$mas1=5.2;
@var1=(2.1,2.8,3.6,4.8,5.2);
print "Content-Type: text/html\\n\\n";
my $nomelem = 0;
print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;
Как значение присвоить к переменной $nomelem2 допустим.
А то результат получается
print "$nomelem"; #5
а правильно 4.
-
# perl -de0
DB<1> @var1=(2.1,2.8,3.6,4.8,5.2);
DB<2> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 5.2 ? $nomelem-1 : undef } @var1;
4
DB<3> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 2.1 ? $nomelem-1 : undef } @var1;
0
DB<4> my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == 4.8 ? $nomelem-1 : undef } @var1;
3
DB<5>
-
Прописал програмку, проходит но:
#!/usr/bin/perl -w
$mas1=5.2;
@var1=(2.1,2.8,3.6,4.8,5.2);
print "Content-Type: text/html\\n\\n";
my $nomelem = 0;
print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;
Как значение присвоить к переменной $nomelem2 допустим.
А то результат получается
print "$nomelem"; #5
а правильно 4.
-
Самый быстрый способ:
foreach (@var1) { ++$i; if ($var1[$i-1] == $_) { $nomelem = $i-1 }}
На перле тока так. Ибо не питон.
P.S. Извращенцы :)))
-
Спасибо Вам огромнейшее!!!
-
# perl -MBenchmark=timethese -de0
DB<1> @var1=(2000,6000,9000,12000);
DB<2> timethese (10_000_000,{\'A\' => q|$i = 0;foreach (@var1) { ++$i; if ($var1[$i-1] == $_) { $nomelem = $i-1 }}|,\'B\' => q|$nomelem = 0;map { $_ == 6000 ? last : $nomelem++ } @var1;|})
Benchmark: timing 10000000 iterations of A, B...
A: 40 wallclock secs (38.48 usr + 0.02 sys = 38.50 CPU) @ 259740.26/s (n=10000000)
B: -2 wallclock secs (-2.21 usr + 0.00 sys = -2.21 CPU) @ -4524886.88/s (n=10000000)
(warning: too few iterations for a reliable count)
DB<3> $nomelem = 0;map { $_ == 6000 ? last : $nomelem++ } @var1
DB<4> print $nomelem
1
-
arto, все понял. Очень интересно и странно для меня.
какая ось? какой перл?
-
-2 секунды на исполнение это просто высший пилотаж!
-
На 10000000 итераций это, в принципе, хуйня, но вывод все же очень интересный. Вопрос открыт.
-
# perl -v | head -2
This is perl, v5.8.8 built for i386-linux-thread-multi
# uname -srvpio
Linux 2.6.16-1.2080_FC5 #1 Tue Mar 28 03:38:34 EST 2006 athlon i386 GNU/Linux
#
-
timethese (10_000_000,{
\'A\' => q|for($i=0;$i \'B\' => q|foreach (@var1) { ++$i; if ($var1[$i-1] == $mas1) { $nomelem = $i-1;last }}|});
Benchmark: timing 10000000 iterations of A, B...
A: 38 wallclock secs (34.97 usr + 0.00 sys = 34.97 CPU) @ 285951.22/s
(n=10000000)
B: 83 wallclock secs (79.12 usr + 0.06 sys = 79.18 CPU) @ 126288.14/s
(n=10000000)
-
# perl -MBenchmark=timethese -de0
DB<1> @var1 = map { int rand 10240 } 1..10240
DB<2> $mas1 = 6000
DB<3> timethese (100_000,{ \'A\' => q|for($i=0;$i q|$nomelem = 0; foreach (@var1) { if ($var1[$nomelem++] == $mas1) { $nomelem--; last }}|});
Benchmark: timing 100000 iterations of A, B...
A: 411 wallclock secs (365.74 usr + 4.51 sys = 370.25 CPU) @ 270.09/s (n=100000)
B: 281 wallclock secs (243.22 usr + 3.32 sys = 246.54 CPU) @ 405.61/s (n=100000)
-
просто офигеваю. А у кого какой проц, робяты? Я сам юзаю Перл, как у arto.
-
Спасибо ребята, Все получилось и работает.