我想在数组中找到一个子字符串。如何打印所有匹配的子字符串?
我的代码是这样的:
@ar = <DATA>;
@skm = grep{m/SLP/g} @ar;
print "@skm\n";
__DATA__
VEFGSLPPKKKLVESLPMMK
我预计输出
SLP
SLP
在标量中,我可以使用$&
来完成,但我对如何在数组中执行此操作感到困惑。我该怎么办?
答案 0 :(得分:3)
grep
仅检查列表中的元素是否匹配。您可能希望使用map
实际将列表元素转换为您需要的内容,在这种情况下使用正则表达式捕获并返回@ar
数组中每个元素的转换列表,
my @skm = map {m/(SLP)/g} @ar;
答案 1 :(得分:1)
grep
运算符只返回输入列表的子集,其中第一个参数中的表达式求值为 true 值。
由于您的@ar
数组只包含一个元素,并且该元素包含SLP
,因此您调用grep
会将其返回给您。
听起来你需要的是map
,它在列表上下文中执行时返回第一个参数中表达式的结果。表达式/SLP/g
返回字符串中出现的所有SLP
,所以
map /SLP/g, <DATA>
将在SLP
文件句柄的任意行中返回DATA
上所有匹配项的列表。
如果你想要所有可能重叠出现的字符串,它会更复杂一些,但它可以使用更精细的Perl正则表达式编写。此程序打印XXX
内XXXXXX
的所有重叠次出现。有四个实例,因为可以从目标字符串的第一个,第二个,第三个和第四个字符开始找到模式。
use strict;
use warnings;
use 5.010;
say for map /(?=(XXX))/g, <DATA>
__DATA__
XXXXXX
<强>输出强>
XXX
XXX
XXX
XXX