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

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

6 голосов
/ 11 марта 2010

Я нашел в модуле цикл for, написанный следующим образом

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

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

for my $scalar ( @array ) {
    ...
    ...
}

Ответы [ 3 ]

11 голосов
/ 11 марта 2010

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

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

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

3 голосов
/ 11 марта 2010

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

2 голосов
/ 11 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...