Perl中@_的含义是什么?

时间:2010-12-30 14:42:12

标签: perl variables

Perl中@_的含义是什么?

9 个答案:

答案 0 :(得分:110)

perldoc perlvar是第一个检查任何特殊名称的Perl变量信息的地方。

引用:

  

@_:在子例程中,数组@_包含传递给该子例程的参数。

可以在perlvar链接的perldoc perlsub (Perl subroutines)中找到更多详细信息:

  

传入的任何参数都显示在   数组@_

     

因此,如果您使用两个参数调用函数,那么   将存储在$_[0]$_[1]

中      

数组@_本地数组,但是它   元素是实际标量参数的别名。   特别是,如果   一个元素$ _ [0]被更新了   相应的参数更新(或   如果不是,则会发生错误   可更新)。

     

如果参数是数组   或者不存在的哈希元素   当函数被调用时,那个   元素仅在(和如果)时创建   它被修改或引用它   拍摄。 (Perl的一些早期版本   无论是否创建了元素   元素已分配给。)分配给   整个数组@_删除了   别名,并且不会更新任何   参数。

答案 1 :(得分:23)

通常,您使用@_变量扩展传递给 sub 的参数:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

perlcritic声称这是正确的。

答案 2 :(得分:9)

问题是Perl中@_ 的含义是什么。这个问题的答案是,只要$_在Perl中表示@_同样意味着他们

似乎没有人提到含义的这一重要方面 - 以及他们的

因此,它们既可以用作代词,也可以用作主题词。

它们通常具有名义上的前因,但并非总是如此。

答案 3 :(得分:8)

首先点击search for perl @_this

  

@_是子目录的传入参数列表。

它也有更长,更详细的解释。

答案 4 :(得分:5)

所有Perl的“特殊变量”都列在perlvar文档页面中。

答案 5 :(得分:5)

在大多数情况下,您还可以对个别变量使用shift:

$var1 = shift;

这是一个你应该进一步研究的主题,因为Perl有许多有趣的方法来访问子例程中的外部信息。

答案 6 :(得分:2)

此外,如果函数返回一个数组,但调用该函数时不将其返回的数据分配给任何变量,如下所示。这里调用了split(),但它没有分配给任何变量。我们可以稍后通过@_:

访问其返回的数据
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

这将拆分字符串$str并设置数组@_

答案 7 :(得分:1)

@用于数组。

在子例程中或在Perl中调用函数时,可以传递参数列表。在这种情况下,@_可用于将参数列表传递给函数:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

函数调用

Average(10, 20, 30);

如果您观察上述代码,请参阅foreach $item(@_)行...此处传递输入参数。

答案 8 :(得分:0)

永远不要尝试编辑@_变量!!!!他们必须不被触及..或者你得到一些意想不到的效果。例如......

final BroadcastReceiver receiver = new AlarmReceiver();
final IntentFilter intentFilter = new IntentFilter(ALARM_RECEIVER_INTENT_TRIGGER);
context.registerReceiver(receiver, intentFilter);

在调用sub1 $ size之前包含1234.但是在500之后(!!)所以你不要编辑这个值!您可以传递两个或更多值并在子例程中更改它们,所有这些值都将被更改!我从来没有见过这种效果。我见过的程序也会留下@_ array readonly。只有你可以安全地传递变量不改变内部子程序 你必须始终这样做:

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

将@_分配给本地子程序过程变量,然后使用它们。 此外,在一些返回数组的深度递归算法中,您可以使用此方法来减少用于本地变量的内存。只有返回@_数组才一样。