我在一個陣列內有一堆哈希值。當檢查我的鍵和值時,我得到了預期的輸出,除了一些特殊情況,因為它們參考了更多的陣列/哈希值。
考慮一下這樣的情況:
@AoH = ( { 'husband' => "homer", 'wife' => "marge" },
{ 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
{ '蔬菜' => { '番茄' => "紅色", '胡蘿卜' => "橙色"}. });
我的函式遍歷陣列并顯示我的鍵和值,如下所示:
sub function( ...){
print "$key => $value
"。
}
husband => homer
妻子 => 瑪吉
people => ARRAY(0x6b0d80)
Bob => 24
Lukas => 37
vegetables => HASH(0x2570d38)
番茄=>紅色
胡蘿卜=>橙色
現在我想訪問我的鍵和值,但是當得到像ARRAY或HASH這樣的值時,我想不考慮這個哈希值,不列印它。
是否有某種方法可以只訪問標量型別的值?
到目前為止,我試著這樣做:
if ($value eq 'ARRAY'/span>) {
}
elsif ($value eq ref {}) {
}
else {
print "$key => $value
"。
}
但是,它最后的列印結果與上面的完全一樣,并沒有忽略其他的資料結構。
uj5u.com熱心網友回復:
對于像你這樣的任意資料結構,你可以使用Data::Traverse:
use warnings;
use strict;
use Data::Traverse qw(traverse)。
my @AoH = ( { 'husband' => "homer", 'wife' => "mage" },
{ 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
{ '蔬菜' => { '番茄' => "紅色", '胡蘿卜' => "橙色"}. });
traverse { print "$a => $b
" if /HASH/ } @AoH;
輸出:
wife => marge
丈夫=> homer
Bob => 24
Lukas => 37
胡蘿卜=>橙色
番茄=>紅色
uj5u.com熱心網友回復:
下面的演示代碼沒有使用外部模塊,為教育目的而提供。
use strict;
use warnings;
use feature 'say';
my @AoH = ( { 'husband' => "homer", 'wife' => "mage" },
{ 'people' => [{'Bob'=> 24, 'Lukas'=> 37}] },
{ '蔬菜' => { '番茄' => "紅色", '胡蘿卜' => "橙色"}. });
drill_in( @AoH )。
sub drill_in {
my $data = shift;
if( ref $data eq 'ARRAY' ) {
drill_in($_) for @$data;
} elsif ( ref $data eq 'HASH'/span> ) {
while( my($k, $v ) = each %{$data} ) {
(ref $v eq 'ARRAY' or ref $v eq'HASH') ? drill_in($v) : say "$k => $v"/span>。
}
}
}
輸出
husband =>/span> homer
妻子=>瑪吉
Lukas => 37
Bob => 24
tomato => red
胡蘿卜 => 橙色
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/311384.html
標籤:
