Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中查找匹配项并复制后面的行_Perl - Fatal编程技术网

在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]}}
,还有更简单的方法。我编辑了那个答案,希望现在更清楚。请让我知道如果没有,或如果更多的来了。