Perl 去除前面带有 $ 的子字符串

Perl 去除前面带有 $ 的子字符串

我知道 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"}

相关内容