【问题标题】:Perl: reference to a hash to pass to another routinePerl:引用散列以传递给另一个例程
【发布时间】:2015-12-24 01:33:18
【问题描述】:

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

for( @{$listref} ){...

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

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

这是我遇到问题的地方。我尝试了不同的东西,但没有运气。

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

%args = @{$_};

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

我认为我需要做的是取消引用散列以将其发送过来。那正确吗?

提前感谢您的帮助

【问题讨论】:

  • 欢迎来到本站。这个问题得到了密切的投票。可能还有其他问题已经解决了这个问题 - 您可能想要使用搜索框。但是,我已经标记了您的代码并清理了语法,以使其更易于阅读。如果您不喜欢我所做的,您可以回滚我的更改和/或通过edit 进行自己的更改。另外,请查看tourhelp center 以更好地了解该网站的运作方式。
  • 谢谢@GreenMatt。我确实花了一个多小时在谷歌和这个网站上寻找答案。感谢清理我的代码

标签: perl hash


【解决方案1】:

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

如果您需要使用保存散列引用的变量,那么最好命名该变量而不是使用默认标量 $_

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

使用 & 符号 & 字符调用子例程是错误的,自 17 年前 Perl v5.5 出现以来一直如此

你的循环应该是这样的

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;

【讨论】:

  • 非常感谢@Borodin...我以为我很接近了:-)
  • @MikeCarvilleGleTech:不客气。请注意,我添加了您可能更喜欢的另一种更简洁的形式
【解决方案2】:

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

但是,您的问题是,您使用语法取消引用实际上是哈希引用的数组引用,从而混淆了哈希和数组。实际上,您应该收到一条错误消息,基本上是在说同样的话:

不是 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;
}

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

【讨论】:

  • 谢谢@Matt Jacob 答案和其他答案一样有效。感谢您花时间解释它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2014-07-27
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多