Forum Webscript.Ru

Программирование => Perl => Тема начата: Alniger от 17 Мая 2006, 12:16:19

Название: Определение номера элемента в массиве
Отправлено: Alniger от 17 Мая 2006, 12:16:19
Зравствуйте, webscript.ru

Помогите, решить задачу:

Существует массив
@var1=(2000,6000,9000,12000);
есть переменная $mas1=6000;
соответсвенно есть элемент в массиве @var1 равный $mas1 => он же @var1[1];
Каким образом можно определить этот номер элемента в массиве и записать его в переменную $nomelem (должно получиться $nomelem=1);

Заранее благодарю, за Вашу помощь.
Название: Определение номера элемента в массиве
Отправлено: arto от 17 Мая 2006, 12:41:35
my $nomelem = 0; print grep { defined } map { $cnt++; $_ == $mas1 ? $cnt : undef } @var1;
Название: Определение номера элемента в массиве
Отправлено: arto от 17 Мая 2006, 12:42:24
my $nomelem = 0; print grep { defined } map { $nomelem++; $_ == $mas1 ? $nomelem-1 : undef } @var1;
Название: Определение номера элемента в массиве
Отправлено: Alniger от 17 Мая 2006, 13:02:02
Прописал програмку, проходит но:
#!/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.
Название: Определение номера элемента в массиве
Отправлено: arto от 17 Мая 2006, 13:19:29
# 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>
Название: Определение номера элемента в массиве
Отправлено: Alniger от 17 Мая 2006, 13:21:46
Прописал програмку, проходит но:
#!/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.
Название: Определение номера элемента в массиве
Отправлено: Zerokool от 17 Мая 2006, 14:48:34
Самый быстрый способ:
foreach (@var1) { ++$i; if ($var1[$i-1] == $_) { $nomelem = $i-1 }}
На перле тока так. Ибо не питон.

P.S. Извращенцы :)))
Название: Определение номера элемента в массиве
Отправлено: Alniger от 17 Мая 2006, 14:59:45
Спасибо Вам огромнейшее!!!
Название: Определение номера элемента в массиве
Отправлено: arto от 17 Мая 2006, 15:29:31
# 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
Название: Определение номера элемента в массиве
Отправлено: Zerokool от 17 Мая 2006, 17:33:29
arto, все понял. Очень интересно и странно для меня.
какая ось? какой перл?
Название: Определение номера элемента в массиве
Отправлено: Kannabismus от 17 Мая 2006, 18:17:10
-2 секунды на исполнение это просто высший пилотаж!
Название: Определение номера элемента в массиве
Отправлено: Zerokool от 17 Мая 2006, 21:18:56
На 10000000 итераций это, в принципе, хуйня, но вывод все же очень интересный. Вопрос открыт.
Название: Определение номера элемента в массиве
Отправлено: arto от 18 Мая 2006, 00:06:14
# 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

#
Название: Определение номера элемента в массиве
Отправлено: xames от 18 Мая 2006, 07:07:03
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)
Название: Определение номера элемента в массиве
Отправлено: arto от 18 Мая 2006, 10:15:31
# 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)
Название: Определение номера элемента в массиве
Отправлено: Zerokool от 18 Мая 2006, 13:24:41
просто офигеваю. А у кого какой проц, робяты? Я сам юзаю Перл, как у arto.
Название: Определение номера элемента в массиве
Отправлено: Alniger от 22 Мая 2006, 13:50:53
Спасибо ребята, Все получилось и работает.