【发布时间】: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
【问题讨论】:
我尝试在 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
【问题讨论】:
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;
}
【讨论】:
使用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";
}
【讨论】:
您需要使用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}; }
【讨论】: