在foreach循环上使用每个关键字的perl循环哈希

时间:2014-06-12 09:13:28

标签: perl hash foreach

我试图在每个循环中使用每个循环遍历哈希。看起来$ 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

3 个答案:

答案 0 :(得分:4)

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

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

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

从散列中迭代键和值的更好方法是迭代键列表,每次都取值:

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

或者,您可能会从pairs版本1.39:

中享受List::Util功能
foreach my $pair ( pairs %hash ) {
   my $key   = $pair->key;
   my $value = $pair->value;
}

答案 1 :(得分:3)

使用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?

答案 2 :(得分:1)

您需要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};  }