【问题标题】:Iterate through hash values in perl遍历perl中的哈希值
【发布时间】:2010-11-10 23:59:45
【问题描述】:

我有一个哈希值,比如说 20 个值。

它是这样初始化的:

my $line = $_[0]->[0];

    foreach my $value ($line) {
        print $value;
    }

现在,当我尝试获取 $line 中每个散列的值时,它会说: 在 file.pl 第 89 行的 print 中使用未初始化的值

有没有办法遍历哈希的每个值?

我也试过了:

my %line = $_[0]->[0];

    foreach my $key (keys %line) {
        print %line->{$key};
    }

但这也行不通: 在第 89 行的 file.pl 中找到了预期大小均匀的列表的参考

有人知道该怎么做吗?应该没那么难……

【问题讨论】:

  • 我很困惑。当然在我看来你已经初始化了一个标量,而不是一个哈希。
  • 在第二个示例中,您尝试将其设为哈希,但您仍在分配标量 - 也许它是哈希引用?
  • 使用 Perl 调试器并使用 x 命令打印出您的 arglist。

标签: perl hash


【解决方案1】:

迭代哈希中的值:

for my $value (values %hash) {
  print $value;
}

【讨论】:

    【解决方案2】:

    您的第一个示例中的$line 是标量,而不是散列。

    如果是散列引用,请使用%{$line} 取消引用。

    【讨论】:

    • 啊,我明白了!现在它正在使用:我的 $line = $_[0]->[0]; foreach my $value (values %{$line}) { print $value . "\n"; }
    【解决方案3】:

    首先,您必须了解散列和散列引用之间的区别。

    您的初始赋值$_[0]->[0] 的含义类似于:获取当前函数的第一个参数 ($_[0]),取消引用它 (->) 并认为它是一个数组并检索它的第一个值 ([0]) .该值不能是列表或哈希,它必须是标量(字符串、整数、浮点数、引用)。

    这里有一些例子:

    my %hash = ( MyKey => "MyValue");
    my $hashref = \%hash;
    # The next line print all elements of %hash
    foreach (keys %hash) { print $_ }
    # And is equivalent to
    foreach (keys %{$hashref}) { print $_ }
    $hash{MyKey} == $hashref->{MyKey}; # is true
    

    详情请咨询http://perldoc.perl.org/perlreftut.html

    【讨论】:

    • 不,$_[0] 不是函数。它是@_ 的第一个(标量)元素。所以$_[0]->[0]——与$_[0][0]${ $_[0] }[0]相同——采用@_的第一个标量元素,将其解释为对数组的引用,并返回该假定引用数组的第一个元素。
    • 从来没有说过 $_[0] 是一个函数。
    【解决方案4】:

    警告告诉您$_[0]->[0]什么都没有。它不会死并告诉您您没有索引任何内容,因此$_[0] 可能是一个数组引用,但第一个插槽中没有任何内容——或者它可能指向一个空数组。

    • 无论是空字符串还是 0,它都不会报错。
    • 如果那里有任何参考,您可以打印一些东西,即使只有:BLAH(0x80af74)。 (其中“BLAH”是“ARRAY”、“HASH”、“SCALAR”、“REF”、“GLOB”、“IO”...之一)

    我的建议是你这样做:

    use Data::Dumper;
    say Data::Dumper->Dump( [ $_[0] ] ); # or even say Data::Dumper->Dump( [ \@_ ] )
    

    然后查看输出。

    一旦你在$_[0]->[0] 得到了一个hashref,那么如果你必须遍历这个hash,最好的方法是:

    while ( my ( $key, $value ) = each %$hashref ) { 
       do_stuff_with_key_and_value( $key, $value );
    }
    

    each

    最后,您似乎对印记有些困惑。请参阅此链接的最后一部分,以尝试解释印记('$''@''%'不是变量名称的一部分,而是指示我们想要什么从中取回。 Perl compilation woes

    【讨论】:

      猜你喜欢
      • 2022-07-21
      • 2011-10-28
      • 2013-01-16
      • 2012-08-22
      • 2013-12-30
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多