我正在尝试将字符串 VCC_TGL 替换为 $ G_CORNER_SQL_DETAILS($ corner + vcc_tgl) 我尝试使用perl one衬纸,但缺少 $ 字符。
my $i="VCC_TGL";
my $test="\$G_CORNER_SQL_DETAILS(\$corner+vcc_tgl)";
print "replace $i with $test\n";
`perl -pi.back -e 's/$i/$test/' configure.tcl`;
执行上面的perl脚本的输出即时消息是,
set vccio G_CORNER_SQL_DETAILS(corner+vcc_tgl)
答案 0 :(得分:0)
您正在传递包含特殊shell字符的字符串,例如$
,通过外壳解析,即它们由外壳处理,因此迷路了:
$ perl -e '$test="XXX\$YYY"; qx/set -x; echo $test/'
+ echo XXX
后退标记qx//
和system("...")
容易出现此类问题,并且通常不安全。
您应该改用system()
的安全数组版本,即完全绕过外壳程序,以便按原样将参数传递到调用的命令中:
$ perl -e '$i="AAA"; $test="XXX\$YYY"; system(qw(echo perl -pi.back -e), "s/$i/$test/", qw(configure.tcl));'
perl -pi.back -e s/AAA/XXX$YYY/ configure.tcl