我有一些小问题。如何将范围分配到数组中,如下所示:
输入文件: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;
}
我正在正确地将所选范围分配到数组中?如果不能如何修改此代码?
感谢您提前。
答案 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