从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用

Posted

技术标签:

【中文标题】从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用【英文标题】:Perl Search and Replace Command Not Working When Called from Inside another Perl Script 【发布时间】:2016-09-25 14:08:25 【问题描述】:

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

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

我正在调用使用系统命令在另一个 Perl 脚本中调用上面的 Perl One 衬里,并且只使用“`”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`; 

我在网络上找不到关于“$”变量这一特定问题的足够结果。任何帮助表示赞赏。

【问题讨论】:

***.com/questions/619926/… 为什么在系统命令中使用反引号?你应该使用 " "system(" ") 感谢您的回复。 system("perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl");这个我已经试过了,但是没用,。我仍然得到同样的错误。请提出修复建议。我会尝试更新你 如果您尝试了某些东西但不起作用,请尝试修复它,但不要使用错误的语法。 使其更具可读性,请使用quotemeta 和除/ 之外的任何其他分隔符,例如s\Q/$\Q\$g 【参考方案1】:

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

这是正确的工作代码。

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

或使用如下所示的系统函数

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

再次感谢社区帮助我。 . .

【讨论】:

天哪,这真是一团糟。您可以采取两个步骤来清理它。 1) 为您的system() 命令使用非插值引号。 2) 使用/ 以外的分隔符进行搜索和替换:system(qperl -p -i -e's!/\$!/\\$!');【参考方案2】:

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

system(qperl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl)

或使用反引号:

`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl`

编辑: 正如 Paul 在 cmets 中所建议的那样。

【讨论】:

感谢您的回复。当我使用您指定的系统功能时,我收到以下错误“flat_rtl_gen.pl 第 175 行的语法错误,靠近“系统”执行 flat_rtl_gen.pl 由于编译错误而中止。”当我使用 Back Ticks 时,我收到以下错误“Backticks found where operator expected at flat_rtl_gen.pl line 177, near ""perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl""(前一行缺少分号?)在 flat_rtl_gen.pl line 177,附近出现语法错误"perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl""请指教.. 我试过了,没有发现任何错误。你能发布 flat_rtl_gen.pl 吗?还要执行“perl -c flat_rtl_gen.pl”并发布结果。请编辑问题以添加这些详细信息。 嗨,沉默的僧侣,下面的代码工作了perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$\g' file;我真的很感谢你抽出宝贵的时间。我会尝试你的代码并更新你.. 我不能发布 flat_rtl_gen 脚本,因为它是专有脚本。当我执行“perl -c flat_rtl_gen.pl $PWD”时。我收到一条消息说语法 OK。但是,当我使用您提供的修复程序运行时,我仍然收到一条错误消息,提示“-e 处的语法错误,靠近“s//$/”“ 这里第一条语句的问题是你的系统命令使用了双引号,这导致每个反斜杠都被视为转义字符之前字符串被传递给perl -p -i -e 的参数。因此,您必须对所有元字符使用双反斜杠。您可以通过使用非插值引号来解决它:system(qperl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl);

以上是关于从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?

从另一个环境调用 Perl 在后台

Perl 缓冲区刷新

Python - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell

Perl脚本调用的优缺点

从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称