per*_*faq 7 perl hash hashtable
我想在Perl中处理哈希表的所有元素.我怎样才能做到这一点?
这是来自官方perlfaq的问题.我们将perlfaq导入Stack Overflow.
(这是官方的perlfaq答案,减去任何后续编辑)
有几种方法可以处理整个哈希.您可以获取密钥列表,然后浏览每个密钥,或一次获取一个键值对.
要浏览所有键,请使用键功能.这将提取哈希的所有键,并将它们作为列表返回给您.然后,您可以通过正在处理的特定键获取值:
foreach my $key ( keys %hash ) {
my $value = $hash{$key}
...
}
Run Code Online (Sandbox Code Playgroud)
获得密钥列表后,可以在处理哈希元素之前处理该列表.例如,您可以对键进行排序,以便按词法顺序处理它们:
foreach my $key ( sort keys %hash ) {
my $value = $hash{$key}
...
}
Run Code Online (Sandbox Code Playgroud)
或者,您可能只想处理某些项目.如果你只想处理以text:开头的键,你可以选择那些使用grep的键:
foreach my $key ( grep /^text:/, keys %hash ) {
my $value = $hash{$key}
...
}
Run Code Online (Sandbox Code Playgroud)
如果哈希非常大,您可能不想创建一长串密钥.为了节省一些内存,你可以使用each()一次获取一个键值对,它返回一个你还没有看到的对:
while( my( $key, $value ) = each( %hash ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
每个操作符以明显随机的顺序返回对,因此如果订购对您很重要,则必须坚持使用keys方法.
但是,each()运算符可能有点棘手.在使用它时,您不能添加或删除哈希的键,而不必在Perl内部重新处理所有元素后跳过或重新处理某些对.另外,哈希只有一个迭代器,所以如果你在同一个哈希上使用键,值或者每个迭代器,你可以重置迭代器并弄乱你的处理.看到每个条目在perlfunc更多细节.