我有一个包含以下几行的文件:
第一个模式:
.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
我可以使用来执行第一个任务
#!/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;
}
}
如何执行第二项任务?那是找到数字例如20,然后将其除以4,然后在以相关符号开头之后放入相应的#.data.32 0”行。
致谢
答案 0 :(得分:2)
这是对代码的修改,以处理第二种情况:
#!/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;
}
}