我試圖找到所有的數組元素開始,S和N,但下面的代碼並沒有做到這一點:如何過濾多個標準的數組?
@a = qw(sonata Samsung sony icic huawie nissan nokia);
這裏是我的代碼
@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a;
print "@filter \n";
我試圖找到所有的數組元素開始,S和N,但下面的代碼並沒有做到這一點:如何過濾多個標準的數組?
@a = qw(sonata Samsung sony icic huawie nissan nokia);
這裏是我的代碼
@filter = grep { (/^s (.*)$/ig) && (/^n(.*)$/ig) } @a;
print "@filter \n";
你在正確的軌道,但你已經在你的正則表達式中引入了空格。您還要求提供字符串以字符「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";
你的問題是邏輯之一。你說你想過濾所有「以S和N開頭」的字符串,但事實並非如此。你想與 S的一個或N.
開始爲字符串「開始與S和N」的所有字符串,它的第一個字符必須爲S,它會也必須是N,這是不可能的。
表達
grep { (/^s (.*)$/ig) and (/^n(.*)$/ig) } @a;
總是會返回一個空列表,不管是什麼的@a
值恰好是。將考慮@a
中的每個元素,但它們都不是以s
和n
開頭 - 因爲這是不可能的。
你想,而不是什麼是@a
比賽測試是否串要麼小號或 N,就像這樣:
grep { (/^s (.*)$/ig) or (/^n(.*)$/ig) } @a;
婉婷匹配多種可能性其實是一個相當普遍的需求,雖然,所以這裏有一個特殊的符號。 A "character class"創建一個匹配幾種可能性中的任何一種的新原子。 .
是一個字符類,可以使用尖括號[]
創建自定義字符類。
這樣:
grep { /^[sn]/i) } @a;
只是匹配任何字是先從s
或n
。下面的代碼會給你想要的輸出:
my @arr = qw(sonata Samsung sony icic huawie nissan nokia);
my @filter = grep { /^[sn]/i } @arr;
print "@filter \n";
凡^[sn]
將匹配任何與s
或n
一個單詞的。
輸出:
sonata Samsung sony nissan nokia
我已經使用@一個= QW(奏三星,索尼ICIC huawie日產諾基亞); @ filter = grep {/^s(。*)$/ig} @a; 打印「@filter \ n」; @ filters = grep {/^n(。*)$/ig} @a; 打印「@filters \ n」; @final =(@ filter,@ filters); 打印「@final \ n」; –
你應該[編輯]你的問題來添加這種信息,而不是評論。 – Arc676