我知道 perl 认为字符串的部分$
是 perl 变量。我试图对 perl 调用执行的操作是重新定义前面带有$
as 的变量\$
,但这会引发其他错误。我认为我的论点顺序错误有问题。
我的代码是:
perl -0pE "use strict; my $repo = "\$repo"; my $arch = "\$arch";
s|\rsync:\/\/[^\]]+|"${linesToWrite}"|"
我收到的编译器警告是
Can't use global $! in "my" at -e line 1, near "-p destination: $!"
我在 Perl 文档中找到了大量详细说明如何处理它的文档,但没有太多关于在 bash 中遇到问题的解决方案。
我尝试这样做,但这破坏了一切:
perl ""my $repo = "\$repo"; my $arch = "\$arch"" -0pE "use strict;
s|\"rsync:\/\/[^\]+|"${linesToWrite}"|"
我如何正确地格式化它以防止 perl 从字符串中剥离“$”,并使其在打开 use strict 的情况下进行编译?
答案1
假设您只需要 shell 变量$repo
$arch
并$linesToWrite
展开,请将它们放在双引号中,其余部分放在单引号中。彼此相邻的带引号的字符串构成一个字符串(“a”'b' 是 ab)。 (我不知道你在替代命令中使用反斜杠做什么,所以我留下了它们,但你可能不想要它们)。
perl -0pE 'use strict; my $repo = "'"$repo"'"; my $arch = "'"$arch"'";
s|\rsync:\/\/[^\]]+|'"${linesToWrite}"'|'
答案2
Perl 可以通过%ENV
散列访问导出的 shell 变量。使用它可能会简单得多。就像是:
$ export repo arch linesToWrite
$ perl -0pE 'use strict; my $repo = $ENV{"repo"}; my $arch = $ENV{"arch"};
s|\rsync:\/\/[^\]]+|$ENV{"linesToWrite"}|'
我不明白你想用这个表达来做什么。您真的想匹配\r
(换行,这是来自 Windows 的文件吗?)还是那样rsync
?/
如果您用作|
分隔符,为什么要转义?此外,并没有太多理由选择use strict
单衬。我可能会将整个事情简化为:
perl -0pE '$repo = $ENV{"repo"}; $arch = $ENV{"arch"};
s|\rsync://[^\]]+|$ENV{"linesToWrite"}|'
或者,更好的是,忘记这些东西,$repo=$ENV{"repo"}
直接使用等。$ENV{"repo"}
$ENV{"arch"}