在perl中查找匹配项并复制后面的行
我有以下数据在perl中查找匹配项并复制后面的行,perl,Perl,我有以下数据 interface 123 item1 item2 item3 interface 456 item5 item6 item7 card 477 something foo somethig bar 每个接口从行的最开始处开始,每个接口的细节在实际项目之前有一个空格。这是唯一一个可以区分某个配置的配置细节何时结束的东西 我需要搜索每个界面,并复制它和它的细节,直到下一行不以空格开始 所以我需要用每个界面的内容细节来分隔它们,而不是卡片。我在前面的一个问题中得到了帮
interface 123
item1
item2
item3
interface 456
item5
item6
item7
card 477
something foo
somethig bar
每个接口从行的最开始处开始,每个接口的细节在实际项目之前有一个空格。这是唯一一个可以区分某个配置的配置细节何时结束的东西
我需要搜索每个界面,并复制它和它的细节,直到下一行不以空格开始
所以我需要用每个界面的内容细节来分隔它们,而不是卡片。我在前面的一个问题中得到了帮助,但是2个循环把我甩了,我只想运行1个循环,因为我以后会做很多类似重复数据消除的事情,所以2个循环让我非常困惑
my @idx = grep { $lines[$_] =~ /^interface/ } 0..$#lines;
for my $i (0..$#idx-1) {
say "Interface:";
say "\t$_" for @lines[$idx[$i]..$idx[$i+1]-1];
}
# The last interface section stops at the first unindented line
say "Interface:";
for my $i ($idx[-1] .. $#lines) {
last if $lines[$i] =~ /^\S/ and $lines[$i] !~ /^interface/;
say "\t$lines[$i]";
}
有人能帮我在一个循环中做同样的事情吗?使用strict;使用警告;
use strict; use warnings;
my $interface_line;
while(<DATA>) {
if( /^interface/ ) { # start of new interface-section
$interface_line = 1;
}elsif( $interface_line && /^[ \t]/ ) { # interface-section followup
$interface_line++;
}elsif( $interface_line ) { # end of interface-section
$interface_line = undef;
}
if( $interface_line ) {
print "Interface:\n" if $interface_line == 1;
print "$interface_line: $_";
}
}
__DATA__
interface 123
item1
item2
item3
interface 456
item5
item6
item7
card 477
something foo
somethig bar
我的$u行;
while(){
如果(/^interface/){#开始新接口部分
$interface_line=1;
}elsif($interface_line&&/^[\t]/){#接口部分后续
$interface_line++;
}elsif($接口线){接口段结束
$interface_line=undef;
}
如果($接口线){
如果$Interface\u line==1,则打印“接口:\n”;
打印“$接口\行:$\”;
}
}
__资料__
接口123
项目1
项目2
项目3
接口456
项目5
项目6
项目7
卡片477
一些食物
什么酒吧
第二个解决方案来自哪里?不管怎么说,它更干净、更简单(我认为)。@zdim确实是。。但是做dd\@if_部分代码>打印方括号中的数据,我不知道以后如何分割数据。哦。。抱歉没有解释。dd\@if_部分
是为了方便起见,便于显示。@if_节
数组有元素的数组引用,每个元素都有一个接口行。所以@{$if_节[0]}
是第一个接口的行等@zdim ah。。。好的,我可以把行数grep,然后做什么<例如,对于我的$i(0..$#idx){print@{$if_节[$i]}}
,还有更简单的方法。我编辑了那个答案,希望现在更清楚。请让我知道如果没有,或如果更多的来了。