在Perl中,如何处理整个哈希?

时间:2010-12-09 17:00:35

标签: perl hash hashtable

我想在Perl中处理哈希表的所有元素。我怎么能这样做?


这是来自official perlfaq的问题。我们是importing the perlfaq to Stack Overflow

1 个答案:

答案 0 :(得分:7)

(这是official perlfaq answer,减去任何后续修改)

有几种方法可以处理整个哈希。您可以获取keys的列表,然后浏览每个密钥,或一次抓取一个键值对。

要浏览所有密钥,请使用keys function。这将提取哈希的所有键,并将它们作为列表返回给您。然后,您可以通过正在处理的特定键获取值:

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

获得密钥列表后,可以在处理哈希元素之前处理该列表。例如,您可以对键进行排序,以便按词法顺序处理它们:

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

或者,您可能只想处理某些项目。如果您只想处理以text:开头的键,则可以选择使用grep:

的键
foreach my $key ( grep /^text:/, keys %hash ) {
    my $value = $hash{$key}
    ...
    }

如果哈希非常大,您可能不想创建一长串密钥。为了节省一些内存,您可以使用each()一次抓取一个键值对,返回一对您还没有看到的对:

while( my( $key, $value ) = each( %hash ) ) {
    ...
    }

每个操作符以明显随机的顺序返回对,因此如果命令对您很重要,则必须坚持使用keys方法。

each()运算符可能有点棘手。在使用它时,您不能添加或删除哈希的键,而不必在Perl内部重新处理所有元素后跳过或重新处理某些对。此外,哈希只有一个迭代器,因此如果在同一个哈希上使用keysvalueseach,则可以重置迭代器并搞乱处理。有关详细信息,请参阅each entry中的perlfunc