簡體   English   中英

Perl中的雙哈希值

[英]Double hash values in Perl

使用哈希時,Perl有非常方便的values關鍵字來處理哈希值。

假設我有一個雙哈希,即像這樣創建的東西:

my %dh = map { {$_->{id1}}{$_->{id2}} => $_ } @arr;

然后values %dh返回哈希數組。 要訪問值,我需要這樣的東西:

for my $key1 (keys %dh) {
    for my $val (values %{ $dh{$key1} }) {
        # stuff...
    }
}

有沒有更好的方式來做到這一點,避免for循環? values %{ values %dh }

此外,抱歉語法不好,我對Perl很新。

您可以再次使用map來提取它。 不要有任何幻想 - 它仍然在循環。 它可能更優雅:

for my $val ( map { values %$_ } values %dh ) {
    #do stuff
}

這或多或少做了同樣的事情 - 它會使你的哈希變平 - 從%dh獲取values - 這將是一個哈希引用列表 - 然后將values拉出來。 (我認為應該這樣做,但沒有測試數據,我無法確定)。

注意 - values的返回順序是未定義的,因此您將以隨機順序獲取它們。 如果您願意,可以通過keys控制排序(也許可以sort )。

map作用是簡單地評估代碼塊,並將結果作為列表返回。 這就是為什么map { $_ => 1 } qw ( one two three )有效 - 它實際上返回一對值, 當你將它分配給一個哈希時,它被視為鍵值對。

use Data::Dumper;

my @stuff = map { $_ => 1 } qw ( one two three );
print Dumper \@stuff;
my %hash = map { $_ => 1 } qw ( one two three ); 
print Dumper \%hash;

所以 - map在這里返回2個值,你可以寫成:

my @stuff = map { $_,  1 } qw ( one two three );

因為當然, =>實際上只是一個逗號(引用一些額外的功能)。

因此,在對數組進行解引用時,您可以執行相同的操作 - values返回map每個元素的值列表。

為清楚起見:

use Data::Dumper;
my @stuff = ( [ 1, 2, 3 ], [4, 5, 6], [7, 8, 9] );
print Dumper \@stuff;
my @newstuff = map { @$_ } @stuff; 
print Dumper \@newstuff;

基本上做同樣的事情 - 遍歷@stuff每個哈希引用(因為這是在perl中實現多維數組的方式),然后“解包”它們,返回結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM