Отсутствует переменная $ on цикла - PullRequest
4 голосов
/ 07 июня 2010
#!/usr/bin/perl
use strict;
use warnings;

my @array = qw[a b c];
foreach my($a,$b,$c) (@array) {
    print "$a , $b , $c\n";
}

Я получаю следующую ошибку:

Отсутствует переменная $ on в цикле

Что не так?

Я использую: perl v5.10.1 (*) built for x86_64-linux-thread-multi

Ответы [ 5 ]

13 голосов
/ 07 июня 2010

Чтобы получить несколько элементов списка за одну итерацию, используйте что-то вроде List :: MoreUtils :: natatime или используйте splice:

my @tmparray = @array; # don't trash original array
while ( my ($a,$b,$c) = splice(@tmparray,0,3) ) {
    print "$a , $b , $c\n";
}

Или реорганизуйте свои данные в несколько массивов и используйте один из алгоритмов :: Loops:: MapCar * функции для циклического перебора нескольких массивов одновременно.

8 голосов
/ 07 июня 2010

Я не знаю, что foreach может съесть более одного параметра за раз в Perl. Я могу читать документацию неправильно.

5 голосов
/ 07 июня 2010

Как упоминалось в других ответах, Perl напрямую не поддерживает итерацию по нескольким значениям в цикле for. Это одна из проблем, которые я рассмотрел в моем модуле List :: Gen :

use List::Gen;

my @array = qw/a b c d e f/;

for (every 3 => @array) {
    print "@$_\n";
}

выходы:

a b c
d e f

Редактировать: Срезы списка, которые создает List::Gen, связываются с исходным списком, так что вы можете изменить значения в срезе, чтобы изменить исходный список. Эта функциональность не представляется возможной с несколькими другими решениями, опубликованными для этого вопроса.

2 голосов
/ 08 июня 2010

Block :: NamedVar обеспечивает nfor, что DWIM.Это удобнее, чем альтернативные способы итерации.

use Block::NamedVar;

my @array = qw[a b c];
nfor my($a,$b,$c) (@array) {
    print "$a , $b , $c\n";
}
1 голос
/ 07 июня 2010

Я думаю, вы упускаете точку цикла foreach Он проходит через все значения в массиве. Он обрабатывает одно значение за раз. Вот правильный код:

#!/usr/bin/perl
use strict;
use warnings;

my @array = qw[a b c];
foreach my $z (@array) {
    print "$z\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...