如何按特定顺序打印Perl哈希?

时间:2010-09-13 19:57:43

标签: arrays perl hash

我有这段代码

#!/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";

弗里多的答案没有围绕价值观的引用。

3 个答案:

答案 0 :(得分: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的参数。

答案 1 :(得分:5)

您可以使用hash slice获取值,然后使用join将逗号括在一起。

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

答案 2 :(得分:3)

使用join在值之间添加逗号而不是在结尾处,并使用map将每个值包装在双引号中。

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