【发布时间】:2017-12-12 08:08:22
【问题描述】:
我是Perl 的新手,我想打印的不仅仅是第一个正则表达式匹配。
txt 文件包含 57 次 shutdown,使用下面的代码我只取回第一个匹配项,然后就停止了。
#!/usr/bin/perl
use strict;
use warnings;
use Path::Tiny;
use autodie;
my $dir = path("H:/Perl");
my $file = $dir->child("test.txt");
my $content = $file->slurp_utf8();
my $file_handle = $file->openr_utf8();
(my $test) = $content =~ m/^.+$(?=\s+shutdown)/mg;{
print "$test\n";
}
我尝试了while loop,但没有成功。感谢您的帮助。
编辑: 以下是一些示例数据:
interface port-channelxyc
description provdb002
shutdown
switchport access vlan 123
spanning-tree port type edge
interface port-channel456
description provdb002
switchport access vlan 32
spanning-tree port type edge
interface port-channel200
shutdown
我只回来了: '描述 provdb002' 然后它停止了,但我也想得到下一个:'interface port-channel200'等等......希望你明白我的意思。
【问题讨论】:
-
你的正则表达式确实返回一个带有
/g的列表;所以将它分配给一个数组:my @ary = $content =~ ... -
您能否提供一些示例数据以及所需的输出?冒着听起来很愚蠢的风险,文件肯定是
utf8,因为那不是很常见吗?该模式的问题在于它会返回一个列表,但我不确定它是否会捕获正确的内容。 -
请编辑您的问题并在此处添加数据。如果你把它放在评论中,就不可能知道换行符在哪里。
-
如果你所有的文件确实都是这样,你就不需要
slurp_utf8,就像@Sobrique 怀疑的那样,而是slurp(然后将你的匹配项分配给一个数组)。正则表达式确实需要一些讨论 -
好的,您的示例输入 - 您想要的输出是什么?