Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用基于使用Perl从这些行中提取的信息的行替换一行_Regex_Perl - Fatal编程技术网

Regex 使用基于使用Perl从这些行中提取的信息的行替换一行

Regex 使用基于使用Perl从这些行中提取的信息的行替换一行,regex,perl,Regex,Perl,我有一个包含以下行的文件: 第一种模式: .comm "8" .... .comm "20" 第二种模式: .comm _resultAvg,8,4 .comm _resultSwap,8,4 .comm _resultMax,20,4 我想将第一个图案替换为: .data.32 0 .data.32 0 ... .data.32 0 .data.32 0 .data.32 0

我有一个包含以下行的文件:

第一种模式:

    .comm   "8"
    ....
    .comm   "20"
第二种模式:

    .comm   _resultAvg,8,4
    .comm   _resultSwap,8,4
    .comm   _resultMax,20,4
我想将第一个图案替换为:

    .data.32 0
    .data.32 0
    ...
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
第二种模式为:

.data
_resultAvg:
    .data.32 0
    .data.32 0
.data
_resultSwap:
    .data.32 0
    .data.32 0
.data
_resultMax:
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
我可以使用peform第一个任务

#!/usr/bin/perl
use warnings;
use strict;
use String::Interpolate;
my $j=0;

while (<>) {
    if (my ($string) = /^\s+\.comm\s+"(.*)"/) {
        for( $j=0; $j < ($string/4); $j = $j +1){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}
#/usr/bin/perl
使用警告;
严格使用;
使用字符串::插值;
我的$j=0;
而(){
如果(my($string)=/^\s+\.comm\s+“(.*)”/){
对于($j=0;$j<($string/4);$j=$j+1){
打印“\t.data.32\t0\n”;
}
}否则{
打印
}
}
如何执行第二个任务?也就是说,找到数字,例如20,并将其除以4,然后在以相关符号开始后放置相应的“.data.32 0”行


关于

以下是对代码的修改,以处理第二种情况:

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

while (<>) {
    if (my ($string) = /^\s*\.comm\s+(.*)/) {
        my $cnt;
        if ($string =~ /^"(\d+)"$/) {
            $cnt = $1 / 4;
        } elsif ($string =~ /^(.+),(\d+),(\d+)$/) {
            print ".data\n$1:\n";
            $cnt = $2 / $3;
        } 
        for (1 .. $cnt){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}
#/usr/bin/perl
使用警告;
严格使用;
而(){
如果(my($string)=/^\s*\.comm\s+(.*)/){
我的$cnt;
如果($string=~/^“(\d+)”$/){
$cnt=$1/4;
}elsif($string=~/^(+.+),(\d+),(\d+)$/){
打印“.data\n$1:\n”;
$cnt=$2/$3;
} 
用于(1..$cnt){
打印“\t.data.32\t0\n”;
}
}否则{
打印
}
}

Crossposted to两者之间没有真正的区别。这两种方法都使用相同的方法。抓取长度,然后循环长度/4次。打印
.data
和循环前的符号名称。