2014-10-07 66 views
0

我有一個我想在數組中找到的子字符串。如何打印所有匹配的子字符串?查找數組中的匹配子字符串

我的代碼是這樣的:

@ar = <DATA>; 
@skm = grep{m/SLP/g} @ar; 
print "@skm\n"; 
__DATA__ 
VEFGSLPPKKKLVESLPMMK 

我預期的輸出是

SLP 
SLP 

在標我可以通過使用$&做到這一點,但我感到困惑的是如何做到這一點的數組。我該怎麼做?

回答

3

grep只檢查列表中的元素是否匹配。您可能需要使用map使用正則表達式來捕獲和@ar陣列的每個元素返回轉換列表列表元素實際上轉變成你所需要的,在這種情況下,

my @skm = map {m/(SLP)/g} @ar; 
+0

謝謝@mpapec。特殊變量不在數組中?像'$&' – mkHun 2014-10-07 14:38:57

+1

@Hussain否,如果條件計算爲「真」,則grep只返回列表元素。 – 2014-10-07 14:48:56

+2

@Hussain,'grep'與正則表達式匹配無關(例如'my @bad = grep {$ _> $ max} @nums;'),所以'$&'與'grep'無關。 – ikegami 2014-10-07 14:50:12

1

grep操作員只需返回的子集輸入列表,其中第一個參數中的表達式的值爲true value。

由於您的@ar數組只有一個元素,並且由於該元素包含SLP,因此您的電話grep會將其返回給您。

這聽起來像你需要的是map,它返回結果表達式在第一個參數中執行時,在列表上下文中執行。 /SLP/g返回SLP所有出現的字符串表達式,所以

map /SLP/g, <DATA> 

將在DATA文件句柄的任何行返回上SLP所有出現的列表。

如果您希望所有可能重疊出現的字符串,但它可以使用更精細的Perl正則表達式編寫,這會更復雜一點。此程序打印所有重疊發生XXXXXXXXX內。有四個實例,因爲可以從目標字符串的第一,第二,第三和第四個字符開始找到該模式。

use strict; 
use warnings; 
use 5.010; 

say for map /(?=(XXX))/g, <DATA> 

__DATA__ 
XXXXXX 

輸出

XXX 
XXX 
XXX 
XXX 
相關問題