【问题标题】:Dereferencing hash reference passed to a subroutine [duplicate]取消引用传递给子例程的哈希引用[重复]
【发布时间】:2013-04-03 04:40:25
【问题描述】:

我正在研究一些示例代码,并试图弄清楚为什么它可以与 $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});

【问题讨论】:

标签: perl


【解决方案1】:

之所以有效,是因为您将匿名哈希传递给您的 random_dice 子例程。

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

$args 现在是对哈希的引用

$args = {
   number_of_rolls => 5
};

这通常用作在 Perl 中具有命名参数的方法

【讨论】:

    【解决方案2】:

    像这样:

    my $args = @_;
    

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

    但是像这样:

    my ($args) = @_;
    

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

    【讨论】:

      【解决方案3】:

      如果你想使用更简单的

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

      sub 必须更改为

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

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 1970-01-01
        • 2016-12-04
        • 2011-10-22
        • 2013-02-06
        • 1970-01-01
        • 2011-10-11
        • 2011-06-21
        • 1970-01-01
        相关资源
        最近更新 更多