你可以这样做:
#!/usr/bin/perl
use strict;
use warnings;
my $text = 'lis r3, ha16(L_.str10) some more text blah lis r3, lo16(identifier) some more text blah lis r3, ot16(identifier)';
$text =~ s/(\w{2})\d{2}\(([\w\.]+)\)/$1 eq 'lo' ? $2 . '@l' : $2 . '@' . $1/gie;
print $text;
也可以写成:
#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>) {
s/(\w{2})\d{2}\(([\w\.]+)\)/$1 eq 'lo' ? $2 . '@l' : $2 . '@' . $1/gie;
#you can also print out the result of the replacement.
#print $_;
}
__DATA__
lis r3, ha16(L_.str10)
some more text blah lis r3, lo16(identifier)
some more text blah lis r3, ot16(identifier)
简单来说,e
修饰符允许您使用正则表达式右侧的代码来替换模式。有关更详细的解释,您可以阅读此问题。
在此示例中,我(\w{2})\d{2}
用于匹配括号内标签之前的扩展名,并将 2 个字母分组以供以后使用,并使用([\w\.]+)
这意味着任何字母数字字符加上下划线和点,以匹配您的标签。
在右边,我正在做一个三元运算符来定义扩展:
$1 eq 'lo' ? $2 . '@l' : $2 . '@' . $1
如果第一个元素是 2 个字母,lo
则使用@l
,如果不是,则使用 2 个字母@extension
,例如@ha
或@ot
在我的示例文本中。
现场演示。