Perl Hash Keys +值变量

时间:2012-05-18 19:23:44

标签: perl hash

所以我有一个这样的哈希表:

M => 1
S => 50

我想做这样的事情:

$var = map { "$hash{$_}"."$_\n" } keys %hash;
print $var;

这样我最终得到一个打印变量,如下所示:

1M50S

不幸的是,map语句不起作用:( 是的,它必须分配给变量,因为它在if语句中并根据条件而变化。这样做有一个很好的干净方法吗?

4 个答案:

答案 0 :(得分:4)

使用反向:

my %hash = (M => 1, S => 50);
my $var = reverse %hash;
## use the next line instead if you need sorting
#my $var = join '', map { $_ . $hash{ $_ } } reverse sort keys %hash;
## or this
#my $var = reverse map { $_ => $hash{ $_ } } reverse sort keys %hash;
print $var; ## outputs 1M50S

答案 1 :(得分:1)

例如,您可以先连接值+键,然后再进行连接:

%hash = (M => 1, S => 50);
$var = join("", map {$hash{$_} . $_}  keys %hash);
print $var . "\n" ;

补充:如果你想按值排序,那么它们就是数字:

%hash = (M => 1, S => 50, Z => 6);
$var = join("", map {$hash{$_} . $_}  sort { $hash{$a} <=> $hash{$b} } keys %hash);
print $var . "\n" ;

1M6Z50S

答案 2 :(得分:1)

你必须知道keys %hash是无序的,这意味着它的顺序可能是也可能不是你想要的。

我建议在此处使用有序列表来指定密钥。

并且有一种不洁的方式

%time=(M=>1,S=>50);
$var=join"",map{"$time{$_}$_"}('M','S');
#=> $var='1M50S'

答案 3 :(得分:0)

如果MIDNSHP=X是您想要的所有键,那么请写

my $var = join '', map "$hash{$_}$_", split //, 'MIDNSHP=X';

如果哈希可能包含少于一组完整的密钥,那么请改用

my $var = join '', map "$hash{$_}$_", grep $hash{$_}, split //, 'MIDNSHP=X';
相关问题