Perl:引用传递给另一个例程的哈希

时间:2015-12-23 15:46:51

标签: perl hash

在上传excel电子表格的代码中,它为我提供了数组ref:

中的数据
for( @{$listref} ){...

我使用$_->{'whateverthehashkeyis'}访问它并且没有问题。

我需要做的是将我在循环的当前迭代中访问的哈希传递给另一个子例程。

这是我遇到问题的地方。我尝试过不同的事情但没有运气。

这不起作用,但它应该是我需要做的一个例子

%args = @{$_};

$results = &format_trading_card_preview_item(\%args);
....
sub format_trading_card_preview_item
{
    my %args = shift;

我认为我需要做的是取消引用哈希来发送它。是对的吗?

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:3)

看起来$listref是对哈希引用数组的引用。

如果您需要使用包含哈希引用的变量,那么如果您命名该变量而不是使用默认标量$_

,则会更好

取消引用哈希并将其复制到%args也没有意义,只是引用那个哈希并将其作为参数传递给子例程

调用带有和号&字符的子程序是错误的,自从Perl v5.5在17年前登陆以来一直如此

你的循环应该是这样的

for my $item ( @$listref ) {
    format_trading_card_preview_item($item);
}

在子程序中,它很大程度上取决于你想要对传入的哈希做什么,但是你没有说什么,所以最好把它留作参考并写一下

sub format_trading_card_preview_item {
    my ($item) = @_;
    ...
}

或者您可以使用for语句修饰符形式,就像这样

format_trading_card_preview_item($_) for @$listref;

答案 1 :(得分:1)

要回答您的问题,您无需取消引用哈希引用,以便将其传递给另一个子例程。创建一个浅拷贝,然后引用该新哈希是低效的,但它在技术上可以正常工作。

但是,您的问题是,您通过使用语法在实际上是哈希引用的内容上取消引用数组引用来混淆哈希和数组。事实上,你应该得到一条错误信息基本上说同样的事情:

  

不是foo.pl行的ARRAY引用...

你真正想做的是这样的事情:

for my $href (@$listref) {  # variable names could be better
    # do something
    my $results = format_trading_card_preview_item($href);
    # do something else
}

sub format_trading_card_preview_item {
    my $args = shift;
    print $args->{foo};
    return 42;
}

有关Perl引用和嵌套数据结构的更多信息,请查看perlreftutperlref