使用 -p 将参数传递给 perl

Passing a parameter to perl with -p

我有一个简短的 perl 脚本,可以运行正则表达式替换文件: perl -pi -e 's/x/y/' <file> 我想将一个参数传递给脚本,因此它会将 y 替换为命令行参数(例如,类似 perl -pi -e 's/x/$argv[1]/' <file> 但我使用 $argv[1] 在使用 -pi 参数时不起作用.

我一直不理解一行 Perl 程序的全神贯注,我不明白为什么你不能写一个 Perl 脚本文件来做这个。

但是,您可以在 -p 循环开始之前从 @ARGV 中删除一个项目并将其保存在一个变量中。像这样

perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement>

perl -pi -e 's/x/y/' <file> 等同于:

while (<>) {
   s/x/y/;
} 
continue {
   print or die "-p failed: $!\n";
}

这将通过表达式 s/x/y/; 传递 <file> 的每一行并打印结果。 (注意 -i 标志将修改 <file> 就地)。如果你真的需要传入替换,你为什么不直接在替换中列出它。无论哪种方式,它仍然只列出一次。

perl -pi -e 's/x/<replacement>/;' <file>

解决方案 1:推出您自己的循环。

perl -i -e'$r = shift; while (<>) { s/x/$r/; print }' "$replacement" "$file"

解决方案 2:在编译时获取 var。

perl -i -pe'BEGIN { $r = shift; } s/x/$r/' "$replacement" "$file"

解决方案 3:使用环境变量而不是参数

R="$replacement" perl -i -pe's/x/$ENV{R}/' "$file"