在Perl中为数组分配范围

时间:2015-04-26 05:31:27

标签: arrays perl

我有一些小问题。如何将范围分配到数组中,如下所示:

输入文件clktest.spf

*
.GLOBAL  vcc! vss!
*
.SUBCKT  eclk_l_25h brg2eclk<1> brg2eclk<0> brg_cs_sel brg_out brg_stop cdivx<1>
+ eclkout1<24> eclkout1<23> eclkout1<22> eclkout1<21> eclkout1<20> eclkout1<19>
+ mc1_brg_dyn mc1_brg_outen mc1_brg_stop mc1_div2<1> mc1_div2<0> mc1_div3p5<1>
+ mc1_div3p5<0> mc1_div_mux<3> mc1_div_mux<2> mc1_div_mux<1> mc1_div_mux<0>
+ mc1_gsrn_dis<0> pclkt6_0 pclkt6_1 pclkt7_0 pclkt7_1 slip<1> slip<0>
+ ulc_pclkgpll0<1> ulc_pclkgpll0<0> ulq_eclkcib<1> ulq_eclkcib<0>
*
*Net Section
*
*|GROUND_NET 0
*
*|NET eclkout3<48> 2.79056e-16
*|P (eclkout3<48> X 0 54.8100 -985.6950)
*|I (RXR0<16>#NEG RXR0<16> NEG X 0 54.2255 -985.6950)
C1 RXR0<16>#NEG 0 5.03477e-17
C2 eclkout3<48> 0 2.28708e-16
Rk_6_1 eclkout3<48> RXR0<16>#NEG 0.110947

输出(这应该是数组中保存的值)

.SUBCKT  eclk_l_25h brg2eclk<1> brg2eclk<0> brg_cs_sel brg_out brg_stop cdivx<1>
+ eclkout1<24> eclkout1<23> eclkout1<22> eclkout1<21> eclkout1<20> eclkout1<19>
+ mc1_brg_dyn mc1_brg_outen mc1_brg_stop mc1_div2<1> mc1_div2<0> mc1_div3p5<1>
+ mc1_div3p5<0> mc1_div_mux<3> mc1_div_mux<2> mc1_div_mux<1> mc1_div_mux<0>
+ mc1_gsrn_dis<0> pclkt6_0 pclkt6_1 pclkt7_0 pclkt7_1 slip<1> slip<0>
+ ulc_pclkgpll0<1> ulc_pclkgpll0<0> ulq_eclkcib<1> ulq_eclkcib<0>
*
*Net Section

我的简单代码:

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

my $input = "clktest.spf";

open INFILE, $input or die "Can't open $input" ;

my @allports;
while (<INFILE>){
    @allports = /\.SUBCKT/ ... /\*Net Section/ ;
    print @allports;
} 

我正在正确地将所选范围分配到数组中?如果不能如何修改此代码?

感谢您提前。

2 个答案:

答案 0 :(得分:0)

<INFILE>内的while将逐行读取文件,因此不适合应用需要覆盖多行的正则表达式。为了获得子字符串,最简单的方法是首先连接所有这些行。只有在那之后你才能申请你的正则表达式。

my $contents = "";
while ( <INFILE> ) {
    $contents = $contents . $_;
}
$contents =~ s/.*(\.SUBCKT.*\*Net Section).*/$1/s; # remove unneeded part

请注意,替换行的最后部分有/s修饰符。这是必需的,因为$contents包含换行符。

要将子字符串转换为数组,只需使用split my @allports = split("\n", $contents);

答案 1 :(得分:0)

while循环一次只能为您提供一行,因此您无法一次分配所需的所有行。请改用push来逐行增长数组。

此外,您应该使用$in_fh之类的词汇文件句柄(而非INFILE之类的全局句柄),其中包含open的三参数形式,并且您应该在$!字符串中包含die变量,以便您知道为什么打开失败。

这是你的程序看起来的样子

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

my $input = 'clktest.spf';

open my $in_fh, '<', $input or die "Can't open $input: $!" ;

my @allports;

while ( <$in_fh> ) {
    push @allports, $_ if /\.SUBCKT/ ... /\*Net Section/;
}

print @allports;

请注意,如果您只想打印文件中的选定行,则可以忘记数组并将push @allports, $_替换为print