【问题标题】:Trouble using prototypes to pass hash reference to subroutine in Perl?在 Perl 中使用原型将哈希引用传递给子例程时遇到问题?
【发布时间】:2017-03-13 03:10:16
【问题描述】:

所以我似乎无法将哈希引用传递给 Perl 中的子例程。我正在尝试使用原型传递引用,我认为这可能是问题所在。简而言之,当在子例程中取消引用哈希引用并尝试打印出一个键数组时,该数组是空的,而当我在子例程之外打印时,我可以确认它确实包含键。

子程序的前向定义:

sub getEvidenceCodeFilteredHash (\%$);

有问题的子程序。 say 函数用于查看子程序中发生了什么,到目前为止,只有 'ONE' 被打印出来:

sub getEvidenceCodeFilteredHash (\%$) {
    my ($hashRef, $evidenceCode);
    my %evidenceCodeFilteredHash;
    say "ONE";
    say (keys %{$hashRef});
    foreach (keys %{$hashRef}) {
            say "TWO";
            if ($_ ne '!gaf-version: 2.0') {
                    say "THREE";
                    ${$hashRef}{$_} =~ /^\S+?\s+?\S+?\s+?\S+?\s+?\S+?\s+?\S+?\s+?(\S+?)\s.$/;
                    if ($evidenceCode eq $1) {
                            say "FOUR";
                            $evidenceCodeFilteredHash{$_} = ${$hashRef}{$_};
                            say $evidenceCodeFilteredHash{$_};
                    }
            }
    }
    return %evidenceCodeFilteredHash;
}

在散列和标量上调用子例程:

my %evidenceCodeFilteredHash = getEvidenceCodeFilteredHash(%commonPairHash, $evidenceCode);

谢谢!

【问题讨论】:

  • 你忘了说... = @_;
  • 哦,天哪...谢谢您指出这一点!这是漫长的一天哈哈
  • 顺便说一句 -- avoid using sub prototypes. 它们令人困惑,并且与面向对象的代码不兼容。如果您需要通过引用将哈希传递给函数,请将其存储为 hashref,或在调用函数时获取引用 (\%h)。

标签: perl


【解决方案1】:

您从未为$hashRef$evidenceCode 分配任何内容。替换

my ($hashRef, $evidenceCode);

my ($hashRef, $evidenceCode) = @_;

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 2016-12-04
    • 1970-01-01
    • 2011-02-01
    • 2011-01-17
    • 1970-01-01
    • 2010-12-21
    • 2018-02-24
    • 2017-01-18
    相关资源
    最近更新 更多