我有这段代码
#!/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";
弗里多的答案没有围绕价值观的引用。
答案 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);