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
和循环前的符号名称。