我試圖做類似的Chomp地圖的所有鍵(使用更少的代碼)
my %my_map = map { chomp($_) => 1 } @my_arr;
這並不做什麼,我希望它做的,所以我需要:
my @chomped_arr = @my_arr;
chomp @chomped_arr;
my %my_map = map { $_ => 1 } @chomped_arr;
最簡單的方法是什麼?
我試圖做類似的Chomp地圖的所有鍵(使用更少的代碼)
my %my_map = map { chomp($_) => 1 } @my_arr;
這並不做什麼,我希望它做的,所以我需要:
my @chomped_arr = @my_arr;
chomp @chomped_arr;
my %my_map = map { $_ => 1 } @chomped_arr;
最簡單的方法是什麼?
您的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;
你也可以做'map {s/\ n $ // r => 1}' –
@HåkonHægland這並不考慮'$ /'。但在大多數情況下,它應該可以工作。 –
的疑難雜症這裏是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
- 但這可能是可讀性的權衡。
我建議你的文件的內容不應該被讀入一個數組中的首位
這是一個更好的辦法
my %my_map;
while (<>) {
chomp;
$my_map{$_} = 1;
}
,或者,如果你必須有文件內容,然後
my %my_map = do {
chomp(my @temp = @my_arr);
map { $_ => 1 } @temp;
};
這個問題是chomp
不會返回一個更改的值,它改變了它的論點。我經常喜歡解決這個問題的一種方法是創建一個新功能chomped
,它可以作爲純功能使用。
sub chomped { my $v = shift; chomp $v; return $v }
然後可以使用,在地圖
my %my_map = map { chomped($_) => 1 } @my_arr;
調用'格格()'多次不作從性能的角度來看意義,所以'格格@chomped_arr;'或'格格(我@chomped_arr = @my_arr);'在這方面更好。當slice可以完成這個工作時,避免使用'map'也很好 - > my my_map; @my_map {@chomped_arr} =(1)x @chomped_arr;' –
*「當切片可以完成這項工作時,避免地圖很好」*你爲什麼這麼說? – Borodin