Perl脚本在空行之间打印行

Posted

技术标签:

【中文标题】Perl脚本在空行之间打印行【英文标题】:Perl script to print lines between empty lines 【发布时间】:2016-04-27 10:02:18 【问题描述】:

我在 (How can I print all the lines between the previous and next empty lines when a match is found?) 看到了一个类似的问题!并试图打印空行之间的所有行,但它没有打印。这是我尝试过的脚本,请更正它以满足我的要求。

my @file = <IN>;
for (0 .. $#file) 
if ($file[$_] =~ /Match/)
    my $start = $_;
    while ($start >= 0 && $file[$start] !~ /^$/) 
        $start--; # $start points to first empty line
    
    my $end = $_;
    while ($end <= $#file && $file[$end] !~ /^$/) 
        $end++; # $end points to next empty line
    
 print OUT "\n@file[$start+1..$end-1]"; #it should print between two empty lines right??


输入文件:

wire enable,GSMC_G8,mkf_g,un1_G11_0, GND_net_1, VCC, G8, G16, Q_RNIUQAA,        CK_c, reset_c, 
    G0_c, G1_c, G17_c, G2_c, G3_c, G17_c_i, GND_1, VCC_0;

INBUF G3_pad (.PAD(G3), .Y(G3_c));
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8));
GND GND_i_0 (.Y(GND_1));
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16));
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i));
VCC VCC_i (.Y(VCC));
CLKBUF CK_pad (.PAD(CK), .Y(CK_c));

endmodule

需要输出文件:

INBUF G3_pad (.PAD(G3), .Y(G3_c));
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8));
GND GND_i_0 (.Y(GND_1));
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16));
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i));
VCC VCC_i (.Y(VCC));
CLKBUF CK_pad (.PAD(CK), .Y(CK_c));

【问题讨论】:

请包含示例输入文件和所需的输出。你可以edit你的问题。 另外,请use strictuse warnings。您的代码中有几个语法问题。数学运算符不会插入到字符串中。您的 print 声明并没有按照您的想法执行。 【参考方案1】:

使用flip-flop operator。

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

while (<DATA>) 
  # Turn flip-flop on at the first empty line
  # And then off at the next empty line
  if (/^$/ ... /^$/) 
    # Ignore the two empty lines
    next unless /\S/;
    print;
  


__DATA__
wire enable,GSMC_G8,mkf_g,un1_G11_0, GND_net_1, VCC, G8, G16, Q_RNIUQAA,        CK_c, reset_c, 
    G0_c, G1_c, G17_c, G2_c, G3_c, G17_c_i, GND_1, VCC_0;

INBUF G3_pad (.PAD(G3), .Y(G3_c));
dff_0_1 DFF_1 (.G17_c(G17_c), .reset_c(reset_c), .CK_c(CK_c), 
    .G0_c(G0_c), .G8(G8));
GND GND_i_0 (.Y(GND_1));
NOR2 G3_pad_RNIUUQF (.A(G8), .B(G3_c), .Y(G16));
INV G17_pad_RNO (.A(G17_c), .Y(G17_c_i));
VCC VCC_i (.Y(VCC));
CLKBUF CK_pad (.PAD(CK), .Y(CK_c));

endmodule

我在这里使用了DATA 文件句柄,以便于演示正在发生的事情。很容易将它换成另一个文件句柄。

【讨论】:

当你说“我尝试了同样的事情”时,你究竟做了什么? 我的代码有效。如果您的代码不起作用,那么您一定以某种方式更改了我的代码。在不知道这些变化是什么的情况下,我无法再为您提供帮助。 您是否注意到您需要触发器运算符的三点版本?

以上是关于Perl脚本在空行之间打印行的主要内容,如果未能解决你的问题,请参考以下文章

Linux脚本练习之script063-打印空行的行号

zcat 在命令行中工作,但不在 perl 脚本中

从 bash 或 perl 脚本中读取 CSV [重复]

shell脚本,awk在需要的行上打打印空行。

Perl和python命令行参数的区别

一个文本处理的perl脚本