2010-09-13 60 views
2

我有這樣的代碼如何以特定順序打印Perl哈希值?

#!/usr/bin/perl 
use strict; 

my @a = ("b","a","d","c"); 
my %h = ("a",1,"b",2,"c",3,"d",4); 

#print '"' . join('","', @a), "\"\n"; 

print "\n"; 
foreach my $key (@a) { 
    print '"' . $h{$key} . '",'; 
} 
print "\n"; 

輸出

"2","1","4","3", 

但我想,它只是輸出

"2","1","4","3" 

注意,最後 '' 是不存在的。

是否有可能例如按特定順序打印哈希,或者其他一些技巧來獲得我想要的輸出?

更新:

根據friedo的回答,我能夠把它弄清楚。

print '"' . join('","', @h{@a}), "\"\n"; 

弗裏多的回答沒有引用值附近的引號。

+1

' 「\」 \ n 「'好寫爲'QQ {」 \ n}' – 2010-09-13 21:57:11

+0

像'gbacon'的意志的情況下工作,其中'@了'具有零'基於map'解決方案元素。您的解決方案將打印:'「」\ n',這相當於'@ a'中的一個元素的值爲空字符串。 – daotoad 2010-09-13 22:36:18

回答

5

您可以使用hash slice來獲取值,然後使用join用逗號將它們粘在一起。

print join ",", @h{@a}; 
+3

這不包括請求的雙引號。 – 2010-09-13 20:10:24

10
print join("," => map qq["$_"], @h{@a}), "\n"; 

在這條線的心臟是@h{@a},一個hash slice這意味着相同

($h{"b"}, $h{"a"}, $h{"d"}, $h{"c"}) 

的明顯優點是表達的經濟性。

移出一個等級,我們找到map運算符:對於@h{@a}中的每個值,使用qq["$_"]將它用雙引號括起來。由於結果中需要雙引號,因此代碼使用qq//來切換分隔符。否則,你會被卡在"\"$_\""或串聯鏈中,就像你的問題一樣。

最後,join在映射值之間插入逗號。在這種情況下,=>是相同的逗號操作,但我在這裏用它代替

join(",", ...) 

我覺得這是因爲逗號視覺上令人不快被勉強在一起。

您可能會傾向於在沒有括號的情況下編寫join,但這樣做會使"\n"join發生衝突,而不是print

3

使用join在值之間放置逗號而不在末尾,並且map將每個值用雙引號括起來。

print join(",", map { qq|"$h{$_}"| } @a);