Forum Webscript.Ru
Программирование => Perl => Тема начата: Forza от 06 Июня 2004, 13:47:55
-
Каким образом можно в цикле foreach обратиться к индексу (номеру) текущего обрабатываемого элемента массива? Может быть, какая-нибудь временная переменная это хранит?
p.s. Попробовал поискать в Яндексе ответ по ключевым словам – пока не нашёл.
p.s.2. Я в курсе, что это реализуемо с помощью for. Но если использовать foreach, то всё выглядело бы красивей и компактней.
-
$c = 0;
foreach (@array)
{
$array[$c]; # что-нить с ним делаем
$c++;
}
или не так?
а зачем тебе вообще foreach, если можно обойтись другими управляющими структурами?
-
У меня есть два массива одинаковой длины с длинными громоздкими названиями, т.к. они ещё в хеш хешей засунуты. :)
Поэтому, чтобы их гонять по for, надо сначала в условии завершения указать их длину, а потом в теле цикла ссылаться на их значения, выписывая длинющие штуки типа $hash{$table}{detail}[$i].
Если же пусть цикл foreach по одному из массивов и как-нибудь догадываться об индексе текущего элемента, таких конструкций, как выше, в тексте было бы меньше.
В крайней случае буду сам вести счётчик, как ты предложил.
-
Или, может быть, можно "засунуть" в foreach $var (@mas) упоминание двух массивов и двух переменных, которые принимают значения элементов массивов с одинаковыми индексами?
А?
Т.е. мне надо покрасивее оформить синхронный перебор значений двух (а иногда и трёх :)) массивов.
-
Forza
массивы всегда одинаковой длины?
-
если массивы разные, то надо получить длину того который подлинее и также обработать, например:
foreach $n (0..$end)
{
# действия над элементами массивов с одинаковым индексом
...
$array1[$n]
$array2[$n]
....
}
-
synthez, да, массивы одинаковой длины.
То, что ты предлагаешь, будет работать, как и самостоятельный инкремент счётчика в цикле foreach (что предлагалось выше).
Просто я думал и надеялся :), что есть какой-нибудь простой и удобный способ для синхронного перебора нескольких массивов. Это или указание их обоих в заголовке foreach, или доступ к индексу массива через какую-нибудь временную переменную.
-
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";
-
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];
}
-
Вариантов тьма... :
# Вариант 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++
}
и т.д.
:)
-
synthez
foreach $n (0..$end)
{
...
Кстати, и что это такое? Сам найдешь ошибку или подсказать???
-
foreach (0..$end-1) так?
-
synthez
Ну а теперь давайте играть в угадалки... :)
нет не так...
-
а если так :
$end = $#array;
foreach $n (0..$end)
{ ...
правильно?
-
Phoinix
Я тебя не понял? =)
Ну давай подскажи как правильнее
-
synthez
Уже увидел ("$end - 1"), только насчет вот этой конструкции не понял...
$end = $#array;
$end = @array;
Пиши в следующий раз код полностью, что бы не пришлось домысливать
my $end = @array;
foreach my $n (0..$end) {
print $array[$n]
}
-
Phoinix
иногда забываю, что с нуля начинаеться =)
-
Короче, вариантов много, но все они сводятся к разного рода счетчикам иттерации цикла перебора массива, т.к. встроенного механизма получения индекса массива в цикле типа
for(@array)
{
действие;
}
вроде как нету.