取消引用传递给子例程的哈希引用

时间:2013-04-02 20:23:24

标签: perl

我正在研究一些示例代码,我试图弄清楚为什么它与$ args周围的括号一起工作。没有它,我没有得到价值。

sub random_dice{
  my ($args) = @_;
  my $number_of_rolls = $args->{number_of_rolls} || 6;
  ...
}

# I don't understand why it works with the brackets around $args
my $r = random_dice({number_of_rolls=>5});

3 个答案:

答案 0 :(得分:5)

它的工作原理是因为您将匿名哈希传递给random_dice子例程。

my ($args) = @_; # sets $args as element of @_. Not as an array

$ args现在是对哈希

的引用
$args = {
   number_of_rolls => 5
};

这通常用作在Perl

中具有命名参数的方法

答案 1 :(得分:3)

像这样:

my $args = @_;

赋值在标量上下文中进行,因此$ args被赋值为1(数组中元素的数量)。

但是像这样:

my ($args) = @_;

分配在列表上下文中进行。右侧数组中的值被解压缩并分配给左侧数组的元素。

答案 2 :(得分:2)

如果你想使用更简单的

my $r = random_dice( number_of_rolls => 5 );

sub必须改为

sub random_dice{
  my %args = @_;
  my $number_of_rolls = $args{number_of_rolls} || 6;
  ...
}