代码之家  ›  专栏  ›  技术社区  ›  Marius

如何创建哈希数组并在Perl中循环它们?

  •  4
  • Marius  · 技术社区  · 15 年前

    我试图创建一个哈希数组,但在数组中循环时遇到了问题。我尝试过此代码,但它不起作用:

    for  ($i = 0; $i<@pattern; $i++){
      while(($k, $v)= each $pattern[$i]){
        debug(" $k: $v");
      }
    }
    
    3 回复  |  直到 14 年前
        1
  •  24
  •   Chris Lutz    15 年前

    首先,你为什么不 use 惯性导航与制导 strict warnings ?下面几行应该在您创建的每个Perl程序的顶部,就在后面 #!/usr/bin/perl . 总是 .

    use strict;
    use warnings;
    

    我知道你不是因为我很确定你会收到一些很好的错误信息 严格的 警告 从这一点,以及从代码中的许多其他地方,根据变量的使用来判断。

    其次,你为什么不这样做:

    for my $i (@pattern) {
      ..
    }
    

    循环遍历 @pattern ,将它们分配给 $i 一次一个。然后,在循环中,当需要特定元素时,只需使用 一美元 . 改变到 一美元 将反映在 @图案 当循环退出时, 一美元 会超出范围,基本上是自己清理。

    第三,为了拉里·沃尔的爱, 拜托 声明变量时使用 my 使他们本地化。这真的没那么难,我保证你会成为一个更好的人。

    第四,也是最后一个,您的阵列存储 参考文献 散列,而不是散列。如果它们存储了哈希,那么您的代码将是错误的,因为哈希以 % 不是 $ .实际上,引用(任何类型)都是标量值,因此从 $ . 所以我们需要 撤销引用 他们得到哈希:

    for my $i (@pattern) {
      while(my($k, $v) = each %{$i}) {
        debug(" $k: $v");
      }
    }
    

    或者,你的方式:

    for  (my $i = 0; $i<@pattern; $i++) { # added a my() for good measure
      while(my($k, $v) = each %{$pattern[$i]}) {
        debug(" $k: $v");
      }
    }
    
        2
  •  6
  •   Chas. Owens    15 年前

    试试这个:

    for my $hashref (@pattern) {
        for my $key (keys %$hashref) {
            debug "$key: $hashref->{$key}";
        }
    }
    

    你所尝试的最大的问题是 each $pattern[$i] . 这个 each 函数需要哈希,但 $pattern[$i] 返回哈希引用(即对哈希的引用)。您可以通过取消引用来修复代码 $模式[美元] 作为散列:

    while(my($k, $v) = each %{$pattern[$i]}) {
    

    另外,要注意每个函数,它可以 leave the hash iterator in an incomplete state .

        3
  •  4
  •   William Pursell    15 年前

    请参阅Perl数据结构手册的文档: perldoc perldsc