【问题标题】:Weird perl behaviour regarding references关于引用的奇怪 perl 行为
【发布时间】:2016-02-05 15:37:05
【问题描述】:

我有一段代码,在子例程中我有一个哈希,我将它的引用推送到一个数组。然后我返回那个数组:

sub subroutine1 {
    my @arr;
    my %hash = ("a", "b", "c", "d");
    foreach $key (keys %hash) {
        #I'm doing something
    }
    push @arr, \%hash;
    return @arr;
}

但后来当我使用子程序的返回值时,这个值是哈希引用,而不是包含一个元素的数组,该元素是哈希引用。

所以上面的代码可以为我工作,而无需费心将哈希引用放入数组中——我可以只是返回哈希引用。无论哪种方式都适合我,所以我选择较短的。

我的问题是,perl 为什么要这样做?这是预期的行为吗?

这里是我调用子程序的地方:在另一个子程序中。我还使用了一个统计模块,我对其进行了所有取消引用。

sub subroutine2 {
    my @other_arr;
    for ($i = 0; $i < $val; $i++) {
         push @other_arr, subroutine1($somedata);
    }
    foreach my $key (@keys) { # the keys of the hash are available from elsewhere
        my $keystat = Statistics::Descriptive::Full->new(); 
        for (my $i =0; $i < @other_arr; $i++) {
            $keystat->add_data(${$other_arr[$i]}{$key});
        }
    }
    # other stuff
}

【问题讨论】:

  • 你是如何调用子程序并使用返回的?也许添加一个例子。
  • 你的调用代码是什么样的?这与引用无关,与列表有关。
  • 因为我不耐烦,所以我会做一个猜测:-)。你正在做类似my ($x) = subroutine(); 的事情。这是在列表上下文中调用subroutine,然后将返回列表的第一个元素分配给$x。返回列表的第一个(并且仅在这种情况下)元素是哈希引用,因此哈希引用被分配给 $x。所以你是对的,如果你返回的数组只有一个哈希引用,直接返回哈希引用。

标签: perl reference


【解决方案1】:

子程序在 perl 中从不返回数组,它们只返回(0 个或更多)标量列表。

如果您在标量上下文中调用 sub,您的 return @arr 将获取该上下文并返回 @arr 中的元素数。如果在列表上下文中调用它,@arr 的元素将作为列表返回。

如果您想要返回一个数组引用,请执行return \@arr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2014-11-14
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多