[英]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.