Regex 在全局匹配上保留组

Regex 在全局匹配上保留组,regex,perl,Regex,Perl,我正在编写一个脚本,在Linux的netstat命令上执行一些基本的正则表达式匹配。我的正则表达式工作得很好,可以将我想要的列分为五组:协议、两对IP地址和端口号 然后,我在我的正则表达式上对netstat的输出运行全局匹配,并在生成的数组中迭代,以在几列中打印信息: my $content = `netstat -na`; my $REGEX = '([a-z]*) +.* (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) +(\d{1,3}\.\d

我正在编写一个脚本,在Linux的
netstat
命令上执行一些基本的正则表达式匹配。我的正则表达式工作得很好,可以将我想要的列分为五组:协议、两对IP地址和端口号

然后,我在我的正则表达式上对netstat的输出运行全局匹配,并在生成的数组中迭代,以在几列中打印信息:

my $content = `netstat -na`;
my $REGEX = '([a-z]*) +.* (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) +(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}).*ESTABLISHED';
foreach ($content =~ m/$REGEX/g) {
    printf ("%-10s%-18s%-10s%-18s%-10s\n", $1, $2, $3, $4, $5);
}
然而,这并没有得到我想要的结果,因为它只打印了最后一行匹配的几次。没过多久,我就发现我错误地使用了编号变量
$1
$5
:它们总是引用与正则表达式匹配的最后一行的编号组

这就给我留下了一个问题:我想将我在原始正则表达式中定义的组与全局匹配返回的行一起使用。这到底是可能的还是全局匹配只是执行类似grep的操作的一种方式


如果在全局匹配运行时无法保存这些组,或者以后无法从数组中检索这些组,那么我可能不得不放弃全局匹配,而是跨行迭代,以便将这些组保存到多维数组中。在这种情况下,我几乎想先通过管道将
netstat
连接到
grep

尝试将
foreach
更改为
while
,这样您就可以一次迭代一个匹配项,而不是一次创建所有匹配项

while ($content =~ m/$REGEX/g) {

尝试将
foreach
更改为
while
,以便一次迭代一个匹配项,而不是一次创建所有匹配项

while ($content =~ m/$REGEX/g) {

您也许应该看看是否有一个用于此的模块。有一个可能适合您的需要的名称。这是一个很好的建议,但在本例中,我使用
netstat
更能说明问题。这是一系列初学者正则表达式练习的一部分,因此我对过程比对结果更感兴趣。简单来说,您不能在列表上下文中使用带有
/g
修饰符的捕获组。但是,您可以使用标量上下文,并在时使用
,而不是在
中使用
。您可能应该看看是否有用于此的模块。有一个可能适合您的需要的名称。这是一个很好的建议,但在本例中,我使用
netstat
更能说明问题。这是一系列初学者正则表达式练习的一部分,因此我对过程比对结果更感兴趣。简单来说,您不能在列表上下文中使用带有
/g
修饰符的捕获组。但是,您可以使用标量上下文,并使用
while
而不是
for
。效果很好。谢谢你在上面的评论中澄清了这个问题。效果非常好。感谢您在上述评论中澄清问题。