0

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

M => 1
S => 50

我想做这样的事情:

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

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

1M50S

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

4

4 回答 4

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
于 2012-05-18T19:37:40.480 回答
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
于 2012-05-18T19:29:18.067 回答
1

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

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

还有一条不洁的路

%time=(M=>1,S=>50);
$var=join"",map{"$time{$_}$_"}('M','S');
#=> $var='1M50S'
于 2012-05-18T19:31:51.653 回答
0

如果MIDNSHP=X所有键都按您想要的顺序排列,那么写

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

如果哈希可能包含少于一组完整的键,则使用它来代替

my $var = join '', map "$hash{$_}$_", grep $hash{$_}, split //, 'MIDNSHP=X';
于 2012-05-18T20:36:05.973 回答