Вопрос о foreach-значении

Я нашел в Модуле записанное для цикла как это

for( @array ) {
    my $scalar = $_;
    ...
    ...
}

Есть ли Различие между этим и следующим способом записать для цикла?

for my $scalar ( @array ) {
    ...
    ...
}
6
задан Andy Lester 11 March 2010 в 15:51
поделиться

3 ответа

Да, в первом примере цикл for действует как актуализатор (настройка $ _ , который является аргументом по умолчанию для многих функций Perl) над элементами в массиве. Это имеет побочный эффект маскирования значения $ _ за пределами цикла for . ] $ _ имеет динамическую область видимости и будет виден во всех функциях, вызываемых из цикла for . Вы должны в первую очередь использовать эту версию цикла for , когда планируете используя $ _ для его специальных возможностей.

Кроме того, в первом примере $ scalar является копией значения в массиве, тогда как во втором примере $ scalar является псевдонимом значения в множество. Это имеет значение, если вы планируете устанавливать значение массива внутри цикла. Или, как услужливо указывает daotoad, первая форма полезна, когда вам нужна копия элемента массива для работы, например, с деструктивными вызовами функций ( chomp, s ///, tr /// ... ).

И, наконец, первый пример будет немного медленнее.

11
ответ дан 8 December 2019 в 14:42
поделиться

$ _ - это "пространство ввода по умолчанию и сопоставления с образцом". Другими словами, если вы читаете из дескриптора файла в верхней части цикла 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 уже сильно проклят за то, что он менее читабелен), таким образом также не будет необходимости в явном назначении в переменную $ _ и связанные с этим проблемы с областью видимости.

3
ответ дан 8 December 2019 в 14:42
поделиться

Я не могу объяснить лучше, чем doc может

2
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: