2015-11-26 18 views
1

我試圖找到所有的數組元素開始,S和N,但下面的代碼並沒有做到這一點:如何過濾多個標準的數組?

@a = qw(sonata Samsung sony icic huawie nissan nokia); 

這裏是我的代碼

@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a; 
print "@filter \n"; 
+0

我已經使用@一個= QW(奏三星,索尼ICIC huawie日產諾基亞); @ filter = grep {/^s(。*)$/ig} @a; 打印「@filter \ n」; @ filters = grep {/^n(。*)$/ig} @a; 打印「@filters \ n」; @final =(@ filter,@ filters); 打印「@final \ n」; –

+0

你應該[編輯]你的問題來添加這種信息,而不是評論。 – Arc676

回答

5

你在正確的軌道,但你已經在你的正則表達式中引入了空格。您還要求提供字符串以字符「S」或字符「N」開頭的情況,因此您的邏輯是OR語句,而不是寫入的AND語句。如果你關心的只是第一個字符,那麼這就是你需要的模式,並且你想要使用邏輯OR。

@a = qw(sonata Samsung sony icic huawie nissan nokia); 
@filter = grep { /^s/i || /^n/i } @a; 
print "@filter \n"; 

結果:

sonata Samsung sony nissan nokia 

編輯 - 或更簡潔地用一個字符類

@a = qw(sonata Samsung sony icic huawie nissan nokia); 
@filter = grep { /^[sn]/i } @a; 
print "@filter \n"; 
+1

爲什麼downvote? – obscurite

+2

好問題...在這裏,有一個upvote! –

+0

非常感謝@MikeCovington! – obscurite

8

你的問題是邏輯之一。你說你想過濾所有「以S和N開頭」的字符串,但事實並非如此。你想與 S的一個或N.

開始爲字符串「開始與S和N」的所有字符串,它的第一個字符必須爲S,它會必須是N,這是不可能的。

表達

grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a; 

總是會返回一個空列表,不管是什麼的@a值恰好是。將考慮@a中的每個元素,但它們都不是以sn開頭 - 因爲這是不可能的。

你想,而不是什麼是@a比賽測試是否串要麼小號 N,就像這樣:

grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a; 

婉婷匹配多種可能性其實是一個相當普遍的需求,雖然,所以這裏有一個特殊的符號。 A "character class"創建一個匹配幾種可能性中的任何一種的新原子。 .是一個字符類,可以使用尖括號[]創建自定義字符類。

這樣:

grep { /^[sn]/i) } @a; 
+1

模式上的'g'修飾符在這裏可能也是多餘的。 – Sobrique

+0

@sobrique真!定影。 – darch

0

只是匹配任何字是先從sn。下面的代碼會給你想要的輸出:

my @arr = qw(sonata Samsung sony icic huawie nissan nokia); 
my @filter = grep { /^[sn]/i } @arr; 
print "@filter \n"; 

^[sn]將匹配任何與sn一個單詞的。

輸出:

sonata Samsung sony nissan nokia