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