我是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
我只回来了: 'description provdb002' 然后它停止了,但我想得到下一个:'interface port-channel200'等等...希望你理解我的意思。
答案 0 :(得分:3)
好的,您的数据看起来像是空行分隔的。
很方便,perl使用$/
并将其设置为''
非常容易。
所以你可以这样迭代你的文件:
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '';
while ( <> ) {
my %this_int = m/([\w\-]+) ?(.*)/g;
if ( exists $this_int{'shutdown'} ) {
print $this_int{'interface'}, " ", $this_int{'description'} // ''," is shut down\n";
}
}
您的样本数据将打印出来:
port-channelxyc provdb002 is shut down
port-channel200 is shut down