В 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
Всяка от тези променливи може да се използва независимо от другите. Всъщност, единственият начин, по който те са свързани е, че всички те се съдържат в *_
glob.
Тъй като сигилите варират в зависимост от масиви и хешове, когато осъществявате достъп до елемент, вие използвате знаците в скоби, за да определите коя променлива имате достъп:
$_[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
в скаларния слот на *_
globus, известен още като $_
. В този момент $_
съдържа псевдоним на елемента от масива. Локализацията ще се развие в края на цикъла. 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