我是Perl的新手,我就像这样使用它们
$_
foreach (@list) {
print "$_\n";
}
@_
sub search {
my ($no, @list) = @_;
}
这些下划线变量究竟如何在Perl中起作用?它们有用的其他结构是什么?
答案 0 :(得分:50)
这是一个问题,表明你真的应该正在阅读一本书,也许还有其余的perl标签faqs。
尽管如此,$_
是一个上下文变量,由某些构造隐式创建,并由某些内置函数隐式使用。以下是一些例子:
while(<>) {
next if /^#/;
last if /^q(?:uit)?$/;
say "Howdy!" if /^hello$/;
}
这做了很多工作设置和检查$_
变量,相当于:
while(defined($_ = <>)) {
next if $_ =~ /^#/;
last if $_ =~ /^q(?:uit)?$/;
say "Howdy!" if $_ =~ /^hello$/;
}
设置$_
的其他构造包括:foreach
循环,given
块,map
和grep
操作以及catch
块{ {3}}
使用$_
的其他构造包括:裸print;
语句,s///
替换运算符和tr///
音译运算符。
我建议:在学习Perl时,不要隐式使用$_
。全部写出来(如上面的第二个例子中所示),以便在脑海中强化实际发生的事情。就像你在学习外语时一样,在学会了语言之前,你应该学会正确而细致地说话。 $_
对于编写更短,更简洁的代码非常有用,并且通过专注于正在进行的处理而不是正在进行的变量实际上可以更清楚,但只有在您学习了第二种性质的操作正在使用{ {1}}。否则,这只是一个令人困惑的混乱。
如其他地方所述,$_
是子程序的参数列表。
答案 1 :(得分:4)
这些是Perl中的特殊变量。请参阅 Perl - Special Variables 。
答案 2 :(得分:1)
这个问题总是会出现,因为它是perl的自动魔术(我是用这个词补上的)。
foreach (@array_list){
print $_ . "\n";
}
等效于:
foreach my $item (@array_list){
print $item . "\n";
}
区别在于,当没有变量供循环使用时,perl会自动设置默认的$_
来提供每个项目。
类似地,在调用子例程(或方法-对象中的{subroutine})时,由于参数始终是列表,因此perl将参数放入@_
数组中的子例程中。
另一方面,当内置子例程(或任何编写良好的子例程)需要参数且不带参数调用时,通常会在$_
或@_
上运行,具体取决于是否期望一个或多个参数。某些子例程/方法(aka函数)可能适用于标量或列表值,并且它们通常默认为标量上下文,并且默认情况下为$_
上的函数。有时,该名称清楚表明它需要一个列表(数组或哈希),然后默认输入为@_
。
请记住,另一面是在谈论子例程输入,其输出取决于其他因素。实际上,子例程输出通常仅通过返回标量值或列表值来设置$_
或@_
。
有关如何编写基于上下文返回值的子例程的更多信息,请参见wantarray
,下面是它的一个很好的细分:
https://www.perl.com/pub/2006/02/23/advanced_subroutines.html/