Perl($ _,@ _)中下划线的意义是什么?

Laz*_*zer 40 perl

我是Perl的新手,我就像这样使用它们

$_

foreach (@list) {
    print "$_\n";
}
Run Code Online (Sandbox Code Playgroud)

@_

sub search {
    my ($no, @list) = @_;
}
Run Code Online (Sandbox Code Playgroud)

这些下划线变量究竟如何在Perl中起作用?它们有用的其他结构是什么?

Phi*_*ter 50

这是一个问题,表明你真的应该读一本书,也许其余的perl标签常见问题.

然而,$_是一个由某些构造隐式创建并由某些内置函数隐式使用的上下文变量.这里有些例子:

while(<>) {
    next if /^#/;
    last if /^q(?:uit)?$/;
    say "Howdy!" if /^hello$/;
}
Run Code Online (Sandbox Code Playgroud)

这做了很多工作设置和检查$_变量,相当于:

while(defined($_ = <>)) {
    next if $_ =~ /^#/;
    last if $_ =~ /^q(?:uit)?$/;
    say "Howdy!" if $_ =~ /^hello$/;
}
Run Code Online (Sandbox Code Playgroud)

设置的其他构造$_是:foreach循环,givenmapgrep操作,以及Try :: Tiny中的catch块.

其他使用的结构$_是:裸print;语句,s///替换运算符和tr///音译运算符.

我建议这样做:当你学习Perl时,不要$_暗中使用.全部写出来(如上面的第二个例子中所示),以便在脑海中强化实际发生的事情.就像你在学习外语时一样,在学会了语言之前,你应该学会正确而细致地说话.$_对于编写更短,更简洁的代码非常有用,并且通过专注于正在进行的处理而不是正在进行的变量实际上可以更清楚,但只有在您学习了操作正在使用的第二特性时才能更清楚$_.否则它只是一个令人困惑的混乱.

正如其他地方所提到的,@_是子程序的参数列表.

  • 正如OP注意到的那样,如果之后需要添加换行符,有时`print`的隐式调用无效.较新的Perl有命令`say`可以对`$ _`起作用,但为你添加了一个新行.`使用功能'说'`或`使用5.10.0`启用.菲利普,我知道你知道这就像你的例子,我只是在说明完整性. (4认同)
  • 您的`book`链接现在无效。 (2认同)

小智 5

这些是 Perl 中的特殊变量。请参阅Perl 特殊变量