В 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
й элемент @results
в скалярную щель шара *_
, он же $_
.На данный момент $_
содержит псевдоним элемента массива.Локализация будет разматываться в конце цикла.local
создает динамическую область видимости, поэтому любые подпрограммы, вызываемые из цикла, увидят новое значение $_
, если только они не локализуют его.Об этих понятиях доступно гораздо больше деталей, но я думаю, что они выходят за рамки вашего вопроса.