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

Posted

技术标签:

【中文标题】在 Perl 中,我如何处理整个哈希?【英文标题】:In Perl, how do I process an entire hash? 【发布时间】:2011-05-23 00:09:15 【问题描述】:

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


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

【问题讨论】:

【参考方案1】:

(这是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 ) ) 
    ...
    

each 运算符以明显随机的顺序返回对,所以如果排序对您很重要,您必须坚持使用 keys 方法。

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

【讨论】:

以上是关于在 Perl 中,我如何处理整个哈希?的主要内容,如果未能解决你的问题,请参考以下文章

我如何处理导航返回按钮视图层次结构?

我如何处理 PayPal 公钥?

我如何处理 .FirstOrDefault 方法?

使用 Haskell,我如何处理大量的 XML?

我如何处理 Windows 7 的 125% 或 150% 放大倍率 (Delphi)

使用继承和扫描仪简单计算我如何处理这些异常?