2014-10-07 84 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 
相关问题