2017-10-17 34 views
0

grep的Perl中給了我所有的正則表達式匹配的行。模仿linux的grep的-w在Perl的grep

爲前

{ 
    my @FAMILY_MAP= ("A2LVLX","LVLX","O2LVLX"); 
    my $search="LVLX"; 
    my @match = grep (/ALVL/, @FAMILY_MAP); 
    print @match; 
} 

這裏我預期的輸出是LVLX但我得到的所有陣列中的三個要素。 Linux終端中的預期行爲(如果grep LVLX在包含三個單詞的文件上完成)。但我必須在終端中使用grep -w「LVLX」才能將LVLX作爲輸出。 我需要一種使用perl grep來複制相同的方法。任何提示?

+2

您的描述與您的代碼不匹配 - 它不會產生任何輸出,因爲沒有任何輸入字符串匹配'/ ALVL /'。請更新一個或另一個以使它們一致。 –

+1

請注意ALLCAPS變量名通常保留給Perl中的變量或全局變量。 – simbabque

回答

5

grep -w只有當它表現爲一個全字匹配字符串。爲此,您需要在正則表達式中使用字邊界(\b)轉義序列。

my @family_map = ("A2LVLX","LVLX","O2LVLX"); 
my $search = 'LVLX'; 
my @match = grep (/\b$search\b/, @family_map); 
print "@match"; 

更新:或者,如果你知道你的數組中的元素都將是個人的話,那麼就使用eq

my @match = grep($_ eq $search, @family_map); 
+1

我在想我應該閱讀文檔,我確定我的文檔不太正確......;) – simbabque

1

如果你想完全匹配,你需要告訴它。你的模式/LVLX/匹配包含模式的字符串,因爲你沒有錨定它。

有兩種方法可以做到這一點。要麼你錨你的模式是這樣

my @match = grep(/^ALVL$/, @FAMILY_MAP); 

,或者你使用的grep塊形式,做一個平等的檢查,這是中老年皮爾斯更快(很新皮爾斯有這樣的優化,但我不記得在版本被引入)

my @match = grep { $_ eq 'ALVL' } @FAMILY_MAP; 

兩者都會給你相同的輸出。