在数组中查找匹配的子字符串

时间:2014-10-07 14:32:17

标签: arrays regex perl

我想在数组中找到一个子字符串。如何打印所有匹配的子字符串?

我的代码是这样的:

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

我预计输出

SLP
SLP

在标量中,我可以使用$&来完成,但我对如何在数组中执行此操作感到困惑。我该怎么办?

2 个答案:

答案 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正则表达式编写。此程序打印XXXXXXXXX的所有重叠次出现。有四个实例,因为可以从目标字符串的第一个,第二个,第三个和第四个字符开始找到模式。

use strict;
use warnings;
use 5.010;

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

__DATA__
XXXXXX

<强>输出

XXX
XXX
XXX
XXX