我有一個我想在數組中找到的子字符串。如何打印所有匹配的子字符串?查找數組中的匹配子字符串
我的代碼是這樣的:
@ar = <DATA>;
@skm = grep{m/SLP/g} @ar;
print "@skm\n";
__DATA__
VEFGSLPPKKKLVESLPMMK
我預期的輸出是
SLP
SLP
在標我可以通過使用$&
做到這一點,但我感到困惑的是如何做到這一點的數組。我該怎麼做?
我有一個我想在數組中找到的子字符串。如何打印所有匹配的子字符串?查找數組中的匹配子字符串
我的代碼是這樣的:
@ar = <DATA>;
@skm = grep{m/SLP/g} @ar;
print "@skm\n";
__DATA__
VEFGSLPPKKKLVESLPMMK
我預期的輸出是
SLP
SLP
在標我可以通過使用$&
做到這一點,但我感到困惑的是如何做到這一點的數組。我該怎麼做?
grep
只檢查列表中的元素是否匹配。您可能需要使用map
使用正則表達式來捕獲和@ar
陣列的每個元素返回轉換列表列表元素實際上轉變成你所需要的,在這種情況下,
my @skm = map {m/(SLP)/g} @ar;
的grep
操作員只需返回的子集輸入列表,其中第一個參數中的表達式的值爲true value。
由於您的@ar
數組只有一個元素,並且由於該元素包含SLP
,因此您的電話grep
會將其返回給您。
這聽起來像你需要的是map
,它返回結果表達式在第一個參數中執行時,在列表上下文中執行。 /SLP/g
返回SLP
所有出現的字符串表達式,所以
map /SLP/g, <DATA>
將在DATA
文件句柄的任何行返回上SLP
所有出現的列表。
如果您希望所有可能重疊出現的字符串,但它可以使用更精細的Perl正則表達式編寫,這會更復雜一點。此程序打印所有重疊發生XXX
從XXXXXX
內。有四個實例,因爲可以從目標字符串的第一,第二,第三和第四個字符開始找到該模式。
use strict;
use warnings;
use 5.010;
say for map /(?=(XXX))/g, <DATA>
__DATA__
XXXXXX
輸出
XXX
XXX
XXX
XXX
謝謝@mpapec。特殊變量不在數組中?像'$&' – mkHun 2014-10-07 14:38:57
@Hussain否,如果條件計算爲「真」,則grep只返回列表元素。 – 2014-10-07 14:48:56
@Hussain,'grep'與正則表達式匹配無關(例如'my @bad = grep {$ _> $ max} @nums;'),所以'$&'與'grep'無關。 – ikegami 2014-10-07 14:50:12