gpt4 book ai didi

perl - 迭代 Perl 哈希键的最安全方法是什么?

转载 作者:行者123 更新时间:2023-12-03 04:48:18 26 4
gpt4 key购买 nike

如果我有一个带有一堆(键,值)对的 Perl 哈希,迭代所有键的首选方法是什么?我听说使用 each 可能会在某种程度上产生意想不到的副作用。那么,这是真的吗?以下两种方法中的一种是最好的,还是有更好的方法?

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

# Method 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 文档中进行了描述:

% perldoc -f keys
% perldoc -f each

关于perl - 迭代 Perl 哈希键的最安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com