2013-04-04 53 views
2

對不起快速更換的多個單詞出現的,如果它是一個重複的話題,但我已經搜查了論壇內,我只發現了相似但不相同的問題。的Perl:在陣列

我的問題是:

我有字符串像這樣的數組:

@array = ("My name is "Annie" \n", "My mother's name was "Annie", too. \n", "I am "27" years old \n", "I live in "Minnesota" \n"); 

和字符串的另一個數組像這樣的:

@subs = ("Annie", "22", "Minnesota"); 

我想到:

1)找到所述第一陣列中的從所述第二陣列的字發生任何(例如:安妮會與第一個和第二個元素匹配,明尼蘇達只與最後一個匹配)。

2)用與「-DATA」相同的單詞替換與第二個數組的任何元素匹配的所有單詞(例如:「我的名字是」Annie-DATA「\ n」)。

我想,這可能有一個或兩個for循環很容易做到,但我不知道是否有任何更快的方法,也許有一些聰明的使用Perl的regexs的。

謝謝!

+1

真正的問題不應該是加入威剛是這樣嗎?可以有更好的方法來看問題。 – aartist 2013-04-04 12:57:50

+0

你是什麼意思?也許我應該說明我的程序的真實I/O比我發佈的這個例子複雜得多。然而,我也有這樣的感覺,我可能會以錯誤的方式面對問題,因爲我的算法的這部分(這裏沒有顯示)感覺有點混亂,所以你可能是對的。 – selenocysteine 2013-04-04 13:07:40

回答

2

你可以替換這樣的:

s/(Annie|22|Minnesota)/\1-DATA/g 
+0

謝謝!只有一個問題:但如果我事先不知道我必須匹配的3個關鍵詞(在這個例子中,明尼蘇達州22歲的安妮),但是他們來自一個能夠改變長度和內容的陣列? – selenocysteine 2013-04-04 12:50:29

+2

$子=加入 '|',@sub; S /($子)/ \ 1-DATA /克; – aartist 2013-04-04 13:02:09

+6

使用'$ 1',而不是'\ 1'。 – TLP 2013-04-04 13:06:57

2

一個解決方案:

use strict; 
use warnings; 
my @array = ("My name is \"Annie\" \n", 
    "My mother's name was \"Annie\", too. \n", 
    "I am \"27\" years old \n", 
    "I live in \"Minnesota\" \n"); 
my @subs = ("Annie", "22", "Minnesota"); 

my @new_array = map { my $line = $_; 
         $line =~ s/$_/$_-DATA/g foreach @subs; 
         $line } @array; 
1

另一種解決方案也逃脫元字符:

# escape possible meta characters and join 
my $sub = join '|', map { quotemeta } @subs; 

# replace in the array 
s/($sub)/$1-DATA/g for @array; 

如果你不想改變直接在@array的值,用map代替for。 如:my @new = map s/($sub)/$1-DATA/g, @array;