だから私はこのようなハッシュテーブルを持っています:
M => 1
S => 50
私はこのようなことをしたい:
$var = map { "$hash{$_}"."$_\n" } keys %hash;
print $var;
印刷する変数は次のようになります。
1M50S
残念ながら、マップステートメントは機能しません:(そして、はい、ifステートメントにあり、条件に応じて変化するため、変数に割り当てる必要があります。これを行うためのきれいな方法はありますか?
逆を使用するだけです:
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
たとえば、最初に値 + キーを連結してから、結合を行うことができます。
%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
keys %hash
つまり、その順序が必要な場合とそうでない場合があります。
ここでは順序付きリストを使用してキーを指定することをお勧めします。
そして汚れた道があります
%time=(M=>1,S=>50);
$var=join"",map{"$time{$_}$_"}('M','S');
#=> $var='1M50S'
MIDNSHP=X
すべてのキーが必要な順序になっている場合は、次のように記述します
my $var = join '', map "$hash{$_}$_", split //, 'MIDNSHP=X';
ハッシュに含まれるキーのセットが完全ではない可能性がある場合は、代わりにこれを使用してください
my $var = join '', map "$hash{$_}$_", grep $hash{$_}, split //, 'MIDNSHP=X';