当我们需要用到一行字符中的某些字符串时,我们需要匹配到想要的字符串,再赋值给变量,以便后续使用。
#!/usr/bin/perl
&getlef;
sub getlef{
if(-e "N7.lef"){
unlink "N7.lef";
}
open LIST, "list" or die $!;
@list=<LIST>;
$count=0;
foreach my $cell(@list){
chomp $cell;
if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
$N7_lib=$1;
$N7_cell=$2;
$N5_lib=$3;
$N5_cell=$4;
}
$path="./" . "$N7_lib" . "/lef/" . "$N7_cell" . ".lef";
open LEF, "$path" or die $!;
open OUT, ">>N7.lef" or die $!;
while ($lines=<LEF>){
if($lines=~/^MACRO.*$N7_cell/){
$line_flag=1;
}
elsif($lines=~/^END.*$N7_cell/ and $line_flag==1 ){
$line_flag=0;
print OUT $lines;
print OUT "\n";
$count++;
print "$cell completed $count\n";
close LEF;
close OUT;
last;
}
if($line_flag==1){
print OUT $lines;
}
}
}
close LIST;
chmod 0755, "N7.lef";
}
解析:
1.
if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
$N7_lib=$1;
$N7_cell=$2;
$N5_lib=$3;
$N5_cell=$4;
}
这里采用了正则表达式进行匹配,\S(大写的S)匹配的是非空格,\s(小写的s)匹配空格,*表示匹配任意个字符,这里匹配到了list文档中的内容:
N7 AO222_LVT_N7 N5 AO222_LVT_N5
$1对应第一个()内匹配的字符串,即N7
$2对应第二个()内匹配的字符串,即AO222_LVT_N7
$3对应第三个()内匹配的字符串,即N5
$4对应第四个()内匹配的字符串,即AO222_LVT_N5
2.
if(-e "N7.lef"){
unlink "N7.lef";
}
if(-e "N7.lef") 如果存在N7.lef这个文件
unlink "N7.lef"; 删除N7.lef这个文件,在Perl中,unlink用于删除
3.
&getlef; 调用子程序
sub getlef{
}
sub 子程序名称{} 这是子程序块
如果list文件中每一行的字符串是由分隔符(可以是字符,也可以是字符串)分隔开,那么我们可以用split操作来获取字符串并赋值。
@fields = split /separtor/, $string;
/separtor/是模式(pattern),所以只要能匹配上指定的模式,那么由这种模式分隔开的字符串就可以作为列表返回回来。
Example:
#!/usr/bin/perl
@files=split/A[A-Z]+A/, "appleABCDAbananaAZZZAorangeAFFFAgrape";
print "$files[0]\n";
print "$files[1]\n";
print "$files[2]\n";
print "$files[3]\n";
输出结果:
apple
banana
orange
grape
这里以A开头并以A结尾中间都是大写字母的这样的字符串分隔开了以上字符串,所以用/A[A-Z]+A/进行模式匹配,返回子串
回到文章开头的例子,也可以用split操作来处理
list文档内容如下(空格隔开):
N7 AO221_lvt10 N5 AO221_lvt08
N7 OA222_svt10 N5 OA222_svt08
N7 ADD_ulvt10 N5 ADD_ulvt08
#!/usr/bin/perl
&getlef;
sub getlef{
if(-e "N7.lef"){
unlink "N7.lef";
}
open LIST, "list" or die $!;
@list=<LIST>;
$count=0;
foreach my $cell(@list){
chomp $cell;
@split_cell=split/ /, "$cell";
$N7_lib=$split_cell[0];
$N7_cell=$split_cell[1];
$N5_lib=$split_cell[2];
$N5_cell=$split_cell[3];
$path="./" . "$N7_lib" . "/lef/" . "$N7_cell" . ".lef";
open LEF, "$path" or die $!;
open OUT, ">>N7.lef" or die $!;
while ($lines=<LEF>){
if($lines=~/^MACRO.*$N7_cell/){
$line_flag=1;
}
elsif($lines=~/^END.*$N7_cell/ and $line_flag==1 ){
$line_flag=0;
print OUT $lines;
print OUT "\n";
$count++;
print "$cell completed $count\n";
close LEF;
close OUT;
last;
}
if($line_flag==1){
print OUT $lines;
}
}
}
close LIST;
chmod 0755, "N7.lef";
}
解析:
method1:
if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
$N7_lib=$1;
$N7_cell=$2;
$N5_lib=$3;
$N5_cell=$4;
}
method2:split
@split_cell=split/ /, "$cell";
$N7_lib=$split_cell[0];
$N7_cell=$split_cell[1];
$N5_lib=$split_cell[2];
$N5_cell=$split_cell[3];
观察list的内容可以发现空格是分隔符,所以方法2采用了split操作,获取空格符分开的字符串,并赋值给变量,如果分隔符是分号“;”, 那么就写成split/;/,"$cell"