Forum Webscript.Ru

Программирование => Perl => Тема начата: Forza от 06 Июня 2004, 13:47:55

Название: индекс массива в foreach
Отправлено: Forza от 06 Июня 2004, 13:47:55
Каким образом можно в цикле foreach обратиться к индексу (номеру) текущего обрабатываемого элемента массива? Может быть, какая-нибудь временная переменная это хранит?

p.s. Попробовал поискать в Яндексе ответ по ключевым словам – пока не нашёл.
p.s.2. Я в курсе, что это реализуемо с помощью for. Но если использовать foreach, то всё выглядело бы красивей и компактней.
Название: индекс массива в foreach
Отправлено: synthez от 06 Июня 2004, 17:04:04
$c = 0;
foreach (@array)
{
  $array[$c]; # что-нить с ним делаем
  $c++;
}

или не так?

а зачем тебе вообще foreach, если можно обойтись другими управляющими структурами?
Название: индекс массива в foreach
Отправлено: Forza от 06 Июня 2004, 17:57:50
У меня есть два массива одинаковой длины с длинными громоздкими названиями, т.к. они ещё в хеш хешей засунуты. :)
Поэтому, чтобы их гонять по  for, надо сначала в условии завершения указать их длину, а потом в теле цикла ссылаться на их значения, выписывая длинющие штуки типа $hash{$table}{detail}[$i].
Если же пусть цикл foreach по одному из массивов и как-нибудь догадываться об индексе текущего элемента, таких конструкций, как выше, в тексте было бы меньше.

В крайней случае буду сам вести счётчик, как ты предложил.
Название: индекс массива в foreach
Отправлено: Forza от 06 Июня 2004, 19:37:11
Или, может быть, можно "засунуть" в foreach $var (@mas) упоминание двух массивов и двух переменных, которые принимают значения элементов массивов с одинаковыми индексами?
А?

Т.е. мне надо покрасивее оформить синхронный перебор значений двух (а иногда и трёх :)) массивов.
Название: индекс массива в foreach
Отправлено: synthez от 06 Июня 2004, 19:51:11
Forza
массивы всегда одинаковой длины?
Название: индекс массива в foreach
Отправлено: synthez от 06 Июня 2004, 22:21:53
если массивы разные, то надо получить длину того который подлинее и также обработать, например:


foreach $n (0..$end)
{
   # действия над элементами массивов с одинаковым индексом
   ...
   $array1[$n]
   $array2[$n]
   ....
}
Название: индекс массива в foreach
Отправлено: Forza от 06 Июня 2004, 23:11:48
synthez, да, массивы одинаковой длины.
То, что ты предлагаешь, будет работать, как и самостоятельный инкремент счётчика в цикле foreach (что предлагалось выше).
Просто я думал и надеялся :), что есть какой-нибудь простой и удобный способ для синхронного перебора нескольких массивов. Это или указание их обоих в заголовке foreach, или доступ к индексу массива через какую-нибудь временную переменную.
Название: индекс массива в foreach
Отправлено: Wyclef от 07 Июня 2004, 13:26:00
Forza
Не понятно, чего ты в итоге хочешь добиться, но вот... может поможет:
my @array1 = (1, 4, 2, 3);
my @array2 = (4, 3, 2, 1);

print \'Before: \', join(\', \', @array2), "\\n";

[b]@array2[/b] = map { $array1[$_] != $array2[$_] ? $array1[$_] : $array2[$_] } 0 .. [b]$#array1[/b];

print \'After: \', join(\', \', @array2), "\\n";
Название: индекс массива в foreach
Отправлено: Phoinix от 07 Июня 2004, 15:23:13
Forza



# Вариант 1

for my $i (0..@array1 - 1) {
   print $array1[$i];
   print $array2[$i];
}

# Вариант 2

for (my $i = 0; $i < @array1; $i++) {
   print $array1[$i];
   print $array2[$i];
}
Название: индекс массива в foreach
Отправлено: commander от 07 Июня 2004, 17:33:57
Вариантов тьма... :
# Вариант 3
$i=0;
while (@array1->[$i]) {
   print $array1[$i];
   print $array2[$i];
   $i++
}

# Вариант 4

for (my $i = 0; @array1->[$i]; $i++) {
   print $array1[$i];
   print $array2[$i];
}

#Вариант 5

$i=0;
for $el(@array1)
{
   print $el;
   print $array2[$i];
   $i++
}

и т.д.
:)
Название: индекс массива в foreach
Отправлено: Phoinix от 07 Июня 2004, 17:45:42
synthez

Цитировать
foreach $n (0..$end)
{
...


Кстати, и что это такое? Сам найдешь ошибку или подсказать???
Название: индекс массива в foreach
Отправлено: synthez от 07 Июня 2004, 18:11:43
foreach (0..$end-1) так?
Название: индекс массива в foreach
Отправлено: commander от 07 Июня 2004, 18:15:41
synthez
Ну а теперь давайте играть в угадалки... :)
нет не так...
Название: индекс массива в foreach
Отправлено: synthez от 07 Июня 2004, 18:16:46
а если так :


$end = $#array;

foreach $n (0..$end)
{ ...


правильно?
Название: индекс массива в foreach
Отправлено: synthez от 07 Июня 2004, 18:22:28
Phoinix
Я тебя не понял? =)
Ну давай подскажи как правильнее
Название: индекс массива в foreach
Отправлено: Phoinix от 07 Июня 2004, 18:51:35
synthez

Уже увидел ("$end - 1"), только насчет вот этой конструкции не понял...

Цитировать
$end = $#array;


$end = @array;

Пиши в следующий раз код полностью, что бы не пришлось домысливать

my $end = @array;
foreach my $n (0..$end) {
  print $array[$n]
}
Название: индекс массива в foreach
Отправлено: synthez от 07 Июня 2004, 19:04:27
Phoinix
иногда забываю, что с нуля начинаеться =)
Название: индекс массива в foreach
Отправлено: Mog. от 08 Июня 2004, 08:41:13
Короче, вариантов много, но все они сводятся к разного рода счетчикам иттерации цикла перебора массива, т.к. встроенного механизма получения индекса массива в цикле типа
for(@array)
{
действие;
}
вроде как нету.