2012-05-18 126 views
0

所以我有一個哈希表是這樣的:Perl的哈希鍵+值變量

M => 1 
S => 50 

我想要做這樣的事情:

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

,讓我結束了一個變量打印看起來像:

1M50S 

不幸的是,地圖語句不工作:( 是的它必須是分配編輯到一個變量,因爲它在一個if語句中並根據條件而變化。有沒有一個很好的乾淨的方式來做到這一點?

+1

順便說一句,map函數工作得很好。 :) – pilcrow

+0

我不確定你的意思,但我指的是我的問題中的地圖聲明。 –

+0

他意味着地圖聲明正常工作;這項任務是不符合你期望的。它返回2嗎? – gpojd

回答

1

可以,例如,串聯第一值+鍵,然後做一個連接:

%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 
+0

這個效果很好!謝謝,有沒有什麼方法可以指定順序? –

+1

@Dan:映射前對鍵進行排序 – Martin

+0

@Dan:取決於您是按鍵還是按值排序,以及您想要的是字母數字順序還是數字。我添加了一個示例 – leonbloy

1

你必須知道keys %hash是無序的,這意味着它的順序可能會或可能不是你想要的。

我建議在這裏使用有序列表來指定鍵。

且有不潔的方式

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

這是一種嘗試並指定順序的方法嗎?順便說一下,M和S與分秒無關。他們是另一個軟件的標誌,但是能夠訂購標誌會很有用,因爲還有更多,所有這些:'MIDNSHP = X' –

+0

不確定你的意思是'嘗試',但是你可以指定像'map {block}(a_list_of_ordered keys)'的順序' – Jokester

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 
+2

+1很好的使用'reverse'。 – TLP

0

如果MIDNSHP=X是所有你想要的順序按鍵,然後寫

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

如果散列可能包含少於一組完整的密鑰,則使用此代替

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

'grep $ hash {$ _}'將失敗,出現空字符串或零值。你需要'grep defined $ hash {$ _}' – TLP