2015-07-11 42 views
3

我有一个文本文件,该文件是这样的Perl:匹配接下来的N线的图形和打印K倍

count="4" 
data1 
data2 
data3 
Data1 
Data2 
Data3 

我需要搜索的字符串count,并采取它的值(4),并打印下一3行数(4)次。

文件中的输出应该

data1 
data2 
data3 
data1 
data2 
data3 
data1 
data2 
data3 
data1 
data2 
data3 
Data1 
Data2 
Data3 

我想这Perl代码

while (<FILE>) { 
    $n = 3 
    if ($_ =~ /count="4"/) { 
     print FILE if ($n-- > 0) x 4; 
    } 

但它不工作。

回答

4

但它不工作。

这是因为

if ($n-- > 0) x 4 

你想要什么没有做。 x重复一个值(即你正在做if 1111),它不重做一个语句。

尝试:

use strict; use warnings; 
while (<FILE>) { 
    if (/count="(\d+)"/) { 
    for (1..$1) { 
     if (defined (my $l = <FILE>)) { 
     print $l; 
     } 
    } 
    } 
} 

这将让你开始。

今后,注意:

+0

很好的解释。很高兴看到指示调试的东西。 –

1

你可以尝试这样的事情:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $count = 0; 

while (my $line = <DATA>){ 
    if ($line =~ /count="(\d+)"/ and $1){ 
     $count = $1; 
     next; 
    } 
    if ($count){ 
     print $line; 
     $count--; 
    } 
} 
__DATA__ 
count="2" 
a 
b 
c 
d 
count="1": 
e 
f 
g 
count="3" 
h 
i 
j 
k 
l 
0

你可以在@data

#!/usr/bin/perl 
use strict; 
use warnings; 
my @data = qw /count="4" data1-1 data2-1 data3-1 Data1 Data2 Data3/; 
my $repeat_line = 3; 
foreach (@data) 
{ 
    if (/count="(\d+)"/) { 
    for (1..$1) { 
     for my $no1 (1..$repeat_line) { 
    print $data[$no1],"\n"; 
     } 
    } 
    } 
} 
for my $no ($repeat_line..scalar(@data)) { 
    if(defined $data[$no+1]){ 
    print $data[$no+1],"\n"; 
    } 
} 

输出给文件/输入

data1-1 
data2-1 
data3-1 
data1-1 
data2-1 
data3-1 
data1-1 
data2-1 
data3-1 
data1-1 
data2-1 
data3-1 
Data1 
Data2 
Data3 
0

您可以使用这个单行:

perl -ne 'print m/count="(\d+)"/?$n=(<>.<>.<>)x$1:$_' file 
#  ^ ^   ^  ^^^---- the current line. 
#   |  |    |   | '---- else 
#   |  |    |   '---- repeated $1 times 
#   |  |    '---- the three next lines (if any) stored in $n 
#   |  '---- when this pattern succeeds, 
#   '---- Print,