Я нашел в Модуле записанное для цикла как это
for( @array ) {
my $scalar = $_;
...
...
}
Есть ли Различие между этим и следующим способом записать для цикла?
for my $scalar ( @array ) {
...
...
}
Да, в первом примере цикл for
действует как актуализатор (настройка $ _
, который является аргументом по умолчанию для многих функций Perl) над элементами в массиве. Это имеет побочный эффект маскирования значения $ _
за пределами цикла for
. ] $ _
имеет динамическую область видимости и будет виден во всех функциях, вызываемых из цикла for
. Вы должны в первую очередь использовать эту версию цикла for
, когда планируете используя $ _
для его специальных возможностей.
Кроме того, в первом примере $ scalar
является копией значения в массиве, тогда как во втором примере $ scalar
является псевдонимом значения в множество. Это имеет значение, если вы планируете устанавливать значение массива внутри цикла. Или, как услужливо указывает daotoad, первая форма полезна, когда вам нужна копия элемента массива для работы, например, с деструктивными вызовами функций ( chomp, s ///, tr /// ...
).
И, наконец, первый пример будет немного медленнее.
$ _
- это "пространство ввода по умолчанию и сопоставления с образцом". Другими словами, если вы читаете из дескриптора файла в верхней части цикла while или запускаете цикл foreach и не называете переменную цикла, для вас настроен $ _
.
Однако, если вы пишете цикл foreach и называете переменную цикла, $ _ не устанавливается. Это можно обосновать следующим кодом:
1. #!/usr/bin/perl -w
2. @array = (1,2,3);
3. foreach my $elmnt (@array)
4. {
5. print "$_ ";
6. }
Результатом будет «Использование неинициализированного значения в конкатенации (.)»
Однако, если вы замените строку 3 на:
foreach (@array)
, на выходе будет «1 2 3», как и ожидалось.
Теперь в вашем случае всегда лучше называть переменную цикла в цикле foreach, чтобы сделать код более читабельным (perl уже сильно проклят за то, что он менее читабелен), таким образом также не будет необходимости в явном назначении в переменную $ _
и связанные с этим проблемы с областью видимости.