我认为我的问题的标题基本上涵盖了它.这是一个人为的例子,试图过滤与参数化字符串完全相等的输入行,基本上是Perlish fgrep -x:
perl -ne 'chomp; print if $_ eq $ARGV[0];' bb <<<$'aa\nbb\ncc';
## Can't open bb: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
问题当然是该-n选项会while (<>) { ... }在代码周围创建一个隐式循环,而菱形运算符会占用文件名的所有命令行参数.所以,虽然在技术上的bb说法也得到@ARGV,因为该参数是在整个计划失败也由钻石操作回升.最终结果是,在使用时不可能将命令行参数传递给Perl程序-n.
我想我真正想要的是一个可以while (<STDIN>) { ... }在代码周围创建隐式循环的选项,因此不会对文件名采用命令行参数,但这样的事情不存在.
我可以想到三种可能的解决方法:
1: BEGIN { ... }阻止复制和清除@ARGV.
perl -ne 'BEGIN { our @x = shift(@ARGV); } chomp; print if $_ eq $x[0];' bb <<<$'aa\nbb\ncc';
## bb
Run Code Online (Sandbox Code Playgroud)
2:手动编码单行中的while循环.
perl …Run Code Online (Sandbox Code Playgroud)