Perl 匹配后赋值

当我们需要用到一行字符中的某些字符串时,我们需要匹配到想要的字符串,再赋值给变量,以便后续使用。

#!/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"

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值