В Perl имя _
может относиться к ряду различных переменных:
Общие из них:
$_ the default scalar (set by foreach, map, grep)
@_ the default array (set by calling a subroutine)
Менее распространенные:
%_ the default hash (not used by anything by default)
_ the default file handle (used by file test operators)
&_ an unused subroutine name
*_ the glob containing all of the above names
Каждая из этих переменных может использоваться независимо от других. На самом деле, единственный способ, которым они связаны, состоит в том, что все они содержатся в глобусе *_
.
Поскольку сигилы различаются в зависимости от массивов и хэшей, при доступе к элементу вы используете символы квадратных скобок, чтобы определить, к какой переменной вы обращаетесь:
$_[0] # element of @_
$_{...} # element of %_
$$_[0] # first element of the array reference stored in $_
$_->[0] # same
Цикл for
/foreach
может принимать для использования имя переменной, а не $_
, и это может быть понятнее в вашей ситуации:
for my $result (@results) {...}
В общем, если ваш код длиннее нескольких строк или вложен, вы должны называть переменные, а не полагаться на переменные по умолчанию.
Поскольку ваш вопрос был больше связан с именами переменных, чем с областью действия, я не обсуждал фактическую область действия цикла foreach, но в целом следующий код эквивалентен тому, что у вас есть.
for (my $i = 0; $i < $#results; $i++) {
local *_ = \$results[$i];
...
}
Строка local *_ = \$results[$i]
устанавливает $i
th элемент @results
в скалярный слот глобуса *_
, он же $_
. На данный момент $_
содержит псевдоним элемента массива. Локализация завершится в конце цикла. local
создает динамическую область видимости, поэтому любые подпрограммы, вызываемые из цикла, будут видеть новое значение $_
, если они также не локализуют его. Существует гораздо больше подробностей об этих концепциях, но я думаю, что они выходят за рамки вашего вопроса.
person
Eric Strom
schedule
20.09.2011
foreach my $result (@results)
бесконечно лучше с точки зрения удобства обслуживания/читабельности кода по сравнению сforeach (@results)
. Тот факт, что Perl очень снисходителен к компромиссу между типизированными символами и удобочитаемостью, не означает, что вы не должны всегда ошибаться в отношении удобочитаемости. Всегда кодируйте так, как будто следующий разработчик, поддерживающий ваш код, — буйный психотик, который знает, где вы живете :) - person DVK   schedule 21.09.2011$_
, он возникает из-за непонимания соглашений об именах Perl. - person Wolf   schedule 24.02.2017