цикл по списку в Perl - PullRequest
       41

цикл по списку в Perl

5 голосов
/ 06 ноября 2011

Я начинаю изучать Perl, и это просто базовый цикл for, для которого я получаю странный вывод и надеюсь на некоторую ясность в этом..

Что это на самом деле означает и почему я получаю этот результат.

Ариан

Ответы [ 3 ]

17 голосов
/ 06 ноября 2011

Вы хотите это:

@numbers = (1,4,5,6,7,8,9);
foreach my $number (@numbers)
{
    print ("$number\n");
}

С помощью {1,4,5,6,7,8,9} вы фактически создаете ссылку на анонимный хеш, содержащий пары ключ-значение (1 => 4, 5 => 6, 7 => 8, 9 => undef). Когда вы пишете @numbers = {1,4,5,6,7,8,9};, эта ссылка становится единственным скаляром, хранящимся в массиве @numbers.

Кроме того, если вы просто хотите перебрать элементы, вам не нужно использовать «классический» стиль со счетчиком.

Вы можете сделать:

for my $number (1 .. 9) {
    print "$number\n";
}

Убедитесь, что у вас есть use strict; и use warnings; в начале каждого сценария Perl, который вы пишете. Эти директивы позволяют perl отлавливать ошибки и предупреждать о возможном ошибочном коде. Как новичок, вы можете объединить тех, кто warnings с диагностикой , чтобы получить более подробную информацию.

Это очень удобно, особенно когда вы начинаете с Perl, поскольку они помогают вам избежать попадания в ногу.

5 голосов
/ 06 ноября 2011

То, что вы делаете, это создание массива с хэш-ссылкой с индексом 0, то есть:

$numbers[0] = {
    1 => 4,
    5 => 6,
    7 => 8,
    9 => undef,
};

Если бы вы использовали строгий, вы бы увидели:

Global symbol "@numbers" requires explicit package name

И предупреждения сказали бы вам:

Odd number of elements in anonymous hash

Запустите все ваши сценарии Perl с чем-то вроде:

#!/usr/bin/perl -w
use strict;

(или use warnings;), и вы всегда сможете пойматьтакого рода ошибки сразу.Даже опытные программисты на Perl делают их время от времени.Там действительно никогда не было веских причин, чтобы оставить их (если только вы не играете в гольф).

1 голос
/ 06 ноября 2011

попробуй:

@numbers = (1,4,5,6,7,8,9);
foreach(@numbers) {
    print $_;
}
...