我有一个我想在数组中找到的子字符串。如何打印所有匹配的子字符串?查找数组中的匹配子字符串
我的代码是这样的:
@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