Самый простой способ использовать это с while
цикл, который вызывает splice
на первых двух элементов массива каждый раз ,
while (my($var1, $var2) = splice(@array, 0, 2)) {
...
}
Однако, в отличие от foreach
, это постоянно делает двойной сдвиг на исходном массиве, так что, когда вы закончите, массив пуст. Кроме того, назначенными переменными являются копии, а не псевдонимы, такие как foreach
.
Если вам не нравится, что вы можете использовать в стиле С for
цикла:
for (my $i = 0; $i < @array; $i += 2) {
my($var1, $var2) = @array[$i, $i+1];
...
}
Это оставляет массив на месте, но не позволяет обновлять его пути foreach
делает. Для этого вам нужно напрямую обратиться к массиву.
my @pairlist = (
fee => 1,
fie => 2,
foe => 3,
fum => 4,
);
for (my $i = 0; $i < @pairlist; $i += 2) {
$pairlist[ $i + 0 ] x= 2;
$pairlist[ $i + 1 ] *= 2;
}
print "Array is @pairlist\n";
Это печатает:
Array is feefee 2 fiefie 4 foefoe 6 fumfum 8
Вы можете получить те в псевдонимами переменных, если вы попытаетесь достаточно трудно, но это, наверное, не стоит:
my @kvlist = (
fee => 1,
fie => 2,
foe => 3,
fum => 4,
);
for (my $i = 0; $i < @kvlist; $i += 2) {
our ($key, $value);
local(*key, $value) = \@kvlist[ $i, $i + 1 ];
$key x= 2;
$value *= 2;
}
print "Array is @kvlist\n";
Какие выводит ожидаемый измененный массив:
Array is feefee 2 fiefie 4 foefoe 6 fumfum 8
Обратите внимание, что пары, предлагаемые List::Pairwise модуля, которые были, но очень недавно добавили к основным List::Util модулю (и поэтому вы, вероятно, не можете использовать его), до сих пор не дает вам псевдонимы:
use List::Util 1.29 qw(pairs);
my @pairlist = (
fee => 1,
fie => 2,
foe => 3,
fum => 4,
);
for my $pref (pairs(@pairlist)) {
$pref->[0] x= 2;
$pref->[1] *= 2;
}
print "Array is @pairlist\n";
это печатает только:
Array is fee 1 fie 2 foe 3 fum 4
Так что не изменял массив вообще. К сожалению. :(
Конечно, если бы это было реальной хэш, вы можете удвоить значения тривиально:.
for my $value (values %hash) { $value *= 2 }
причин того, что работает, потому что те являются псевдонимами в фактические значения хэш
Вы не может менять ключи, так как они неизменны Однако, вы можете создать новый хэш, что это обновленная копия старого достаточно легко:.
my %old_hash = (
fee => 1,
fie => 2,
foe => 3,
fum => 4,
);
my %new_hash;
@new_hash{ map { $_ x 2 } keys %old_hash } =
map { $_ * 2 } values %old_hash;
print "Old hash is: ", join(" " => %old_hash), "\n";
print "New hash is: ", join(" " => %new_hash), "\n";
Это выводит
Old hash is: foe 3 fee 1 fum 4 fie 2
New hash is: foefoe 6 fiefie 4 fumfum 8 feefee 2
Вы ищете ['each'] (http://perldoc.perl.org/functions/ each.html)? Он иллюстрирует 'while (($ key, $ value) = each% ENV) { print" $ key = $ value \ n "; } 'среди прочих слов мудрости. Остерегайтесь поведения перезагрузки. См. Также [Почему во всех случаях хэширование Perl «каждый» повторяется во второй раз?] (Http://stackoverflow.com/questions/1123693/why-doesnt-perls-each-iterate-through-the-entire- hash-the-second-time) –