解决方案

在Perl中遍历hash的所有键

# 方法 1
while (my ($key, $value) = each(%hash)) {
    # Something
}

# 方法 2
foreach my $key (keys(%hash)) {
    # Something
}

如果我们只想要键,并且不打算读取任何值,请使用keys():

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

如果只需要这些值,请使用values():

foreach my $val (values %hash) { ... }

如果需要键和值,请使用each():

keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }

如果打算以任何方式更改哈希键,但在迭代过程中删除当前键,则不得使用each()。例如,以下代码使用keys()可以很好地创建一组新的具有加倍值的大写键集:

%h = (a => 1, b => 2);

foreach my $k (keys %h)
{
  $h{uc $k} = $h{$k} * 2;
}

产生预期的结果散列:

(a => 1, A => 2, b => 2, B => 4)

但是使用each()做同样的事情:

%h = (a => 1, b => 2);

keys %h;
while(my($k, $v) = each %h)
{
  $h{uc $k} = $h{$k} * 2; # BAD IDEA!
}

会产生错误的结果。例如:

(a => 1, A => 2, b => 2, B => 8)

但是,这是安全的:

keys %h;
while(my($k, $v) = each %h)
{
  if(...)
  {
    delete $h{$k}; # This is safe
  }
}
在perl中如何遍历hash哈希键
日期:2020-03-24 13:42:18 来源:oir作者:oir