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

San*_*ing 2 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";
Run Code Online (Sandbox Code Playgroud)

那个输出

"2","1","4","3",
Run Code Online (Sandbox Code Playgroud)

但我想它只是输出

"2","1","4","3"
Run Code Online (Sandbox Code Playgroud)

请注意,最后','不在那里.

是否有可能以特定的顺序打印哈希,或者其他一些技巧来获得我想要的输出?

更新:

根据friedo的回答,我能够做到对了.

print '"' . join('","', @h{@a}), "\"\n";
Run Code Online (Sandbox Code Playgroud)

弗里多的答案没有关于价值观的引用.

Gre*_*con 10

print join("," => map qq["$_"], @h{@a}), "\n";
Run Code Online (Sandbox Code Playgroud)

这一行的核心是@h{@a}一个散列片,意思是相同的

($h{"b"}, $h{"a"}, $h{"d"}, $h{"c"})
Run Code Online (Sandbox Code Playgroud)

明显的优势是表达的经济性.

移出一个级别,我们找到map运算符:对于每个值@h{@a},使用双引号将其包装qq["$_"].因为您希望结果中有双引号,所以代码用于qq//切换分隔符.否则,你会"\"$_\""遇到问题中的问题或串联链.

最后,join在映射值之间插入逗号.在这种情况下,=>与逗号运算符相同,但我在这里使用它而不是

join(",", ...)
Run Code Online (Sandbox Code Playgroud)

由于逗号被挤在一起,我觉得这看起来很不愉快.

你可能很想写join没有括号,但这样做会"\n"引起争论join而不是print.


fri*_*edo 5

您可以使用哈希切片来获取值,然后使用join逗号将它们粘在一起.

print join ",", @h{@a};
Run Code Online (Sandbox Code Playgroud)

  • 这不包括请求的双引号. (3认同)