如何将带有反向引用的替换正则表达式作为命令行参数传递给Perl脚本

时间:2014-02-19 23:52:13

标签: regex perl argument-passing backreference

Previous post related:如何将替换正则表达式作为命令行参数传递给Perl

在阅读了上面的内容之后,我写了一个非常相似的脚本,但是当我使用$1之类的反向引用时,我无法按照我的意图进行插值。可能是因为我没有使用正确的单/双引号或其中某些组合,但我已经绞尽脑汁待了几个小时。

当我这样调用程序时,它可以正常工作

perl edit.pl "(BUILD_NUMBER)=.*" "BUILD_NUMBER=1.2.3.4" env.properties
1: <-- BUILD_NUMBER=0.0
1: --> BUILD_NUMBER=1.2.3.4

当调用程序包括反向引用时,它会失败:

perl edit.pl "(BUILD_NUMBER)=.*" "$1=1.2.3.4" env.properties
1: <-- BUILD_NUMBER=0.0
1: --> =1.2.3.4

代码:

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

my ($searchString, $replaceString, $fileName)  = @ARGV;
my $occurences = 0;
my @newlines=();
my $line="";

open (READ, "$fileName")  || die "File not found";
while ( <READ> ){
    if ($_ =~ $searchString){
        print "$.: <-- $_";
        $_ =~ s/$searchString/$replaceString/;
        print "$.: --> $_","\n";
        $occurences++;
    }
    push(@newlines,$_);
}
print "Lines: $., Changes: $occurences";
close(READ);

open(WRITE, ">$fileName") || die "File not found";
print WRITE @newlines;
close(WRITE);

1 个答案:

答案 0 :(得分:0)

这是一种非常讨厌的做事方式(你实际上将Perl代码视为数据),但你可以通过改变来实现它的工作

$_ =~ s/$searchString/$replaceString/;

s/$searchString/$replaceString/ee;

eval "s/$searchString/$replaceString/";

通常的警告适用于对外部来源数据使用eval

更好的方法是完全避免反向引用,并使用命令行

perl edit.pl 'BUILD_NUMBER=\K.*' '1.2.3.4' env.properties

或者,如果您使用的是非常旧版本的Perl

perl edit.pl '(?<=BUILD_NUMBER=).*' '1.2.3.4' env.properties