如何使用Perl替换运算符禁用变量插值?

Mic*_*fik 5 regex perl vms

我正在尝试替换VMS上的文本文件中的特定行.通常,这是一个简单的Perl单线程.但是当替换方是包含VMS路径的符号时,我遇到了问题.这是文件和我尝试的内容:

file1.txt的内容:

foo
bar
baz
quux
Run Code Online (Sandbox Code Playgroud)

尝试替换第3行:

$ mysub = "disk$data1:[path.to]file.txt"
$ perl -pe "s/baz/''mysub'/" file1.txt
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

foo
bar
disk:[path.to]file.txt
quux
Run Code Online (Sandbox Code Playgroud)

看起来Perl过于苛刻,用$data1一个不存在的变量的内容替换了路径的一部分(即什么都没有).运行调试器确认了这一点.我没有提供/e,所以我认为Perl应该直接替换文本.有没有办法让Perl这样做?

(另请注意,我可以在linux命令行中重现类似的行为.)

小智 4

通过正确的引号和双引号的组合,您可以到达那里:

我们创建“字符串”+“替换符号”+“字符串”的紧密串联。两个双引号字符串包含用于替换的单引号。做作...但它有效。

$ perl -pe "s'baz'"'mysub'"'" file1.txt
Run Code Online (Sandbox Code Playgroud)

这是DCL级别的解决方案。

对于 Perl 解决方案,请使用q()非内插字符串的运算符并执行它。使用简单的 DCL 替换将符号填充到括号中。这是我最喜欢的,因为它(几乎)对我来说很有意义,并且不会与引号混淆。

$ perl -pe "s/baz/q(''mysub')/e" file1.txt
Run Code Online (Sandbox Code Playgroud)