【问题标题】:perl loop hash using each keyword on foreach loopperl 循环散列在 foreach 循环中使用每个关键字
【发布时间】:2014-08-02 13:19:09
【问题描述】:

我尝试在 for each 循环中使用 each 来遍历哈希。看起来 $k $v 没有更新。谁能解释一下?

%hash = (a=>5,b=>6);
foreach( my ($k,$v) = each %hash){
    print "\neach loop : $k $v\n";
}

output :
each loop : a 5
each loop : a 5

【问题讨论】:

    标签: perl hash foreach


    【解决方案1】:

    foreach 获取一个值列表,并为每个值执行一次循环体,每次都分配一些变量($_,如果未指定):

    foreach ( 1, 2, 3 ) {
      print "The value is $_\n";
    }
    

    在您的情况下,您给了它一个包含两件事的列表,即从哈希中获取的第一个键和值。此外,您还分配了这两个新变量 $key$value 作为键和值。因此,您的循环执行了两次,而这些变量始终保持不变。

    从哈希中迭代键和值的更好方法是迭代键列表,每次取一个值:

    foreach my $key ( keys %hash ) {
      my $value = $hash{$key};
      ...
    }
    

    或者,您可能会喜欢List::Util 1.39 版中的pairs 功能:

    foreach my $pair ( pairs %hash ) {
       my $key   = $pair->key;
       my $value = $pair->value;
    }
    

    【讨论】:

      【解决方案2】:

      使用while 循环。

      #!/usr/bin/perl
      use strict;
      use warnings;
      my %hash = (a=>5,b=>6);
      while (my ($key, $value) = each %hash) {
                print "Key is $key, value is $value\n";
      }
      

      Demo

      另见:Is perl's each function worth using?

      【讨论】:

      • 您好,感谢您的代码。我想知道为什么使用 foreach 循环不能按预期工作。
      • @LeoNerd 在他的回答中解释了这一点。
      【解决方案3】:

      您需要使用while 而不是foreach

      my %hash = (a=>5,b=>6);
      while( my ($k,$v) = each %hash){
          print "\neach loop : $k $v\n";
      }
      

      但是,each() 具有您需要注意的 gotachas,因此我更喜欢只使用 keys,如下所示:

      for my $k (keys %hash) { my $v = $hash{$k};  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        相关资源
        最近更新 更多