所以我有一個哈希表是這樣的:Perl的哈希鍵+值變量
M => 1
S => 50
我想要做這樣的事情:
$var = map { "$hash{$_}"."$_\n" } keys %hash;
print $var;
,讓我結束了一個變量打印看起來像:
1M50S
不幸的是,地圖語句不工作:( 是的它必須是分配編輯到一個變量,因爲它在一個if語句中並根據條件而變化。有沒有一個很好的乾淨的方式來做到這一點?
所以我有一個哈希表是這樣的:Perl的哈希鍵+值變量
M => 1
S => 50
我想要做這樣的事情:
$var = map { "$hash{$_}"."$_\n" } keys %hash;
print $var;
,讓我結束了一個變量打印看起來像:
1M50S
不幸的是,地圖語句不工作:( 是的它必須是分配編輯到一個變量,因爲它在一個if語句中並根據條件而變化。有沒有一個很好的乾淨的方式來做到這一點?
可以,例如,串聯第一值+鍵,然後做一個連接:
%hash = (M => 1, S => 50);
$var = join("", map {$hash{$_} . $_} keys %hash);
print $var . "\n" ;
補充:如果要通過值進行排序,asumming它們都是數字:
%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'
這是一種嘗試並指定順序的方法嗎?順便說一下,M和S與分秒無關。他們是另一個軟件的標誌,但是能夠訂購標誌會很有用,因爲還有更多,所有這些:'MIDNSHP = X' –
不確定你的意思是'嘗試',但是你可以指定像'map {block}(a_list_of_ordered keys)'的順序' – Jokester
只需使用反向:
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很好的使用'reverse'。 – TLP
如果MIDNSHP=X
是所有你想要的順序按鍵,然後寫
my $var = join '', map "$hash{$_}$_", split //, 'MIDNSHP=X';
如果散列可能包含少於一組完整的密鑰,則使用此代替
my $var = join '', map "$hash{$_}$_", grep $hash{$_}, split //, 'MIDNSHP=X';
'grep $ hash {$ _}'將失敗,出現空字符串或零值。你需要'grep defined $ hash {$ _}' – TLP
順便說一句,map函數工作得很好。 :) – pilcrow
我不確定你的意思,但我指的是我的問題中的地圖聲明。 –
他意味着地圖聲明正常工作;這項任務是不符合你期望的。它返回2嗎? – gpojd