当从另一个Perl脚本中调用Perl搜索和替换命令时,该命令不起作用

当从另一个Perl脚本中调用Perl搜索和替换命令时,该命令不起作用,perl,search,replace,symbols,bareword,Perl,Search,Replace,Symbols,Bareword,我是Perl的初学者。我正在使用下面的Perl命令在我的tcl脚本中搜索和替换“/$”序列。当直接在linux命令行上使用时,它工作得很好 perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl 我打电话来是为了使用System命令在另一个Perl脚本中调用上面的Perl One liner,并且只使用“`”Back Tick system(`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`); `perl -p -i

我是Perl的初学者。我正在使用下面的Perl命令在我的tcl脚本中搜索和替换“/$”序列。当直接在linux命令行上使用时,它工作得很好

perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl
我打电话来是为了使用System命令在另一个Perl脚本中调用上面的Perl One liner,并且只使用“`”Back Tick

system(`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`);
`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`;
我得到下面的错误。请帮助解决这个问题

Bareword found where operator expected at -e line 1, near "$/g"
(Missing operator before g?)
Final $ should be \$ or $name at -e line 1, within string
syntax error at -e line 1, near "s//$/"
Execution of -e aborted due to compilation errors.
我不知道是否可以使用任何其他分离运算符,如%和#,就像SED命令一样,但是,当我使用“%”运算符进行分离时,我没有看到错误,但任务尚未完成

`perl -p -i -e 's%\/\$%\/\\\$%g' sed_list.tcl`; 

我在web上找不到足够的“$”变量结果。非常感谢您的帮助。

您可以通过将命令传递给系统函数或使用反勾号(``)运算符来执行外部命令。请将命令作为字符串传递给系统()函数:

system(q{perl-p-i-e's/\/\$/\/\\\$/g'sed\u list.tcl})

或使用反勾号作为:

`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl`
编辑:
正如Paul在评论中所建议的那样。

这里有人建议,在使用System命令或从perl脚本中使用BackTicks调用另一个命令时,应避开所有反斜杠。但后来他们删除了答案。这对我有用。我要感谢每一位为解决我的问题而付出的努力和帮助

这是正确的工作代码

`perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl`;
或使用如下所示的系统功能

system("perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl");

再次感谢社区对我的帮助

为什么在系统命令中使用backtick?您应该像
系统(“”
)一样使用
。谢谢您的回复。系统(“perl-p-i-e's/\/\$/\/\\\$/g'sed\u list.tcl”);这个我已经试过了,但是没有用,。我仍然会犯同样的错误。请提出解决办法。我会尝试更新您,如果您尝试了一些东西但不起作用,请尝试修复它,但不要使用错误的语法。使其更可读,请使用和任何其他分隔符,而不是像这样的
s{\Q/$}{\Q\$}g
,谢谢您的回复。当我使用您指定的系统函数时,我得到下面的错误“flat_rtl_gen.pl行175附近的语法错误,由于编译错误,flat_rtl_gen.pl的“System”执行被中止。“当我使用Back Ticks时,我得到下面的错误“Backticks在flat_rtl_gen.pl行177附近找到了运算符期望的位置”
“perl-p-i-e的/\/\$/\/\\$/g”sed\u list\u gen.tcl“
”(前一行缺少分号?)在“
”perl-p-i-e的/\/\$/\\\$/g”sed\u list\u gen.tcl“
”附近的平坦的\u rtl\u gen.pl行177出现语法错误,请建议。我试过了,没有发现任何错误。你能帮我寄一封平信吗?还要执行“perl-cflat\u rtl\u gen.pl”并发布结果。请编辑问题以添加这些详细信息。嗨,沉默的僧侣,下面的代码工作了
perl-p-i-e的/\\\/\\\\$/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$\g'文件
;我真的非常感谢你抽出时间。我将尝试你的代码,并将更新你..我不能张贴平面rtl_根脚本,因为它是专有脚本。当我执行“perl-c flat_rtl_gen.pl$PWD”时。我收到一条消息说语法没问题。但是,当我使用您提供的修复程序运行时,我仍然收到一个错误,即“Syntax error at-e,靠近“s/$/”,这里第一条语句的问题是您的系统命令使用了双引号,这会导致在将字符串传递给perl-p-i-e的参数之前,将每个反斜杠视为转义字符。因此,您必须将所有元字符加倍反斜杠。只需使用非插值引号即可绕过它:
system(q{perl-p-i-e's/\/\$/\/\\\$/g'sed\\\$/u list.tcl})我的天哪,那太糟糕了。你可以采取两个步骤来清理它。1) 对
system()
命令使用非插值引号。2) 使用除
/
之外的分隔符进行搜索和替换:
系统(q{perl-p-i-e的!/\$!/\$!')