在Perl中使用特殊变量$ _和@_有什么区别?

org*_*hup 14 perl

请解释一下究竟差别$_和@_在Perl.何时使用,由示例代码给出.

小智 25

在子例程中,数组@_给出传递给给定子例程的参数.例如:

use strict;
use warnings;

sub print_em
{
  foreach my $arg (@_)
  {
    print "You passed in $arg.\n";
  }
}

print_em("foo","bar","baz");
Run Code Online (Sandbox Code Playgroud)

输出是

You passed in foo.
You passed in bar.
You passed in baz.
Run Code Online (Sandbox Code Playgroud)

标量$_通常用作循环中的变量.例如:

use strict;
use warnings;

# Note that we are not declaring a variable
# that takes on the values 1 through 5.
foreach(1..5) 
{
  print "$_\n";
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

同样,我们可以略微重写print_em上面的子程序

sub print_em
{
  foreach(@_)
  {
    print "You passed in $_.\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更紧凑

sub print_em{ print "You passed in $_.\n" foreach(@_);}
Run Code Online (Sandbox Code Playgroud)

该变量$_也可以用作某些函数的"默认参数".例如:

use strict;
use warnings;

$_="foobar";

if(/bar/) #We do not have to write $_=~/bar/
{
  print "matched!\n";
}
Run Code Online (Sandbox Code Playgroud)

当然,这是产出matched!.

看看perldoc perlvar有关这些和Perl的其他"神奇变量"的更多信息.


小智 9

Jack Maney的回复涵盖了您的确切问题,但我也想注意一些事情:您不应该被变量的名称部分所迷惑.这个信号也很重要.$_并且@_是完全不同的变量,因为$foo和@foo,$bar以及%bar.Perl将它们彼此完全分开存储.