2015-12-16 16 views
2

我試圖做類似的Chomp地圖的所有鍵(使用更少的代碼)

my %my_map = map { chomp($_) => 1 } @my_arr; 

這並不做什麼,我希望它做的,所以我需要:

my @chomped_arr = @my_arr; 
chomp @chomped_arr; 
my %my_map = map { $_ => 1 } @chomped_arr; 

最簡單的方法是什麼?

+0

調用'格格()'多次不作從性能的角度來看意義,所以'格格@chomped_arr;'或'格格(我@chomped_arr = @my_arr);'在這方面更好。當slice可以完成這個工作時,避免使用'map'也很好 - > my my_map; @my_map {@chomped_arr} =(1)x @chomped_arr;' –

+0

*「當切片可以完成這項工作時,避免地圖很好」*你爲什麼這麼說? – Borodin

回答

4

您的map問題是chomp裏面的modifies its argument, and returns some unrelated and usually useless value。該解決方案是創建一個持有$_副本,chomp它臨時變量,然後把它作爲重點:

my %my_map = map { my $k = $_; chomp $k; $k => 1 } @my_arr; 
+1

你也可以做'map {s/\ n $ // r => 1}' –

+0

@HåkonHægland這並不考慮'$ /'。但在大多數情況下,它應該可以工作。 –

5

的疑難雜症這裏是chomp修改變量,但不會返回。所以它不會在地圖上工作。

我喜歡的一種解決方法是使用正則表達式r修改 -

my %my_map = map { s|\n||gr => 1 } @my_arr; 

它返回修改後的結果,但這樣做沒有改變原(這將改變@arr)。

注意 - 上面的內容並不完整 - 它刪除了所有換行符。 (當然你也可以在你的正則表達式粘$。例如s|\n$||r

r正則表達式的標誌是一個較新的功能(不新)。不記得OTOH其中,perl的版本它在推出

可以用文件句柄輸入過做這樣的:

my %stuff = map { s|\n||gr => 1 } <$fh>; 

嚴格,雖然,從chomp行的末尾刪除$/所以你可能要

s|\Q$/\E\z||r 

這一點我覺得嚴格再現chomp - 但這可能是可讀性的權衡。

+0

爲了清楚起見,我會修改代碼片段以使用您提到的'\ n $'變體,因爲其他變體並不等同於'chomp'。 – md4

+0

確實如此,但是當我接近正確的鍵盤時,可能會更像'$/$'編輯:) – Sobrique

+0

我特別喜歡上次編輯。某種程度上降低了可重用性在Perl中有着不正當的榮耀。 – md4

3

我建議你的文件的內容不應該被讀入一個數組中的首位

這是一個更好的辦法

my %my_map; 
while (<>) { 
    chomp; 
    $my_map{$_} = 1; 
} 

,或者,如果你必須有文件內容,然後

my %my_map = do { 
    chomp(my @temp = @my_arr); 
    map { $_ => 1 } @temp; 
}; 
0

這個問題是chomp不會返回一個更改的值,它改變了它的論點。我經常喜歡解決這個問題的一種方法是創建一個新功能chomped,它可以作爲純功能使用。

sub chomped { my $v = shift; chomp $v; return $v } 

然後可以使用,在地圖

my %my_map = map { chomped($_) => 1 } @my_arr;