bgo*_*dst 3 perl command-line-interface command-line-arguments
我认为我的问题的标题基本上涵盖了它.这是一个人为的例子,试图过滤与参数化字符串完全相等的输入行,基本上是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 -e 'while (<STDIN>) { chomp; print if $_ eq $ARGV[0]; }' bb <<<$'aa\nbb\ncc';
## bb
Run Code Online (Sandbox Code Playgroud)
3:找到传递参数的另一种方法,例如环境变量.
PAT=bb perl -ne 'chomp; print if $_ eq $ENV{PAT};' <<<$'aa\nbb\ncc';
## bb
Run Code Online (Sandbox Code Playgroud)
该BEGIN { ... }
块的解决方案是不可取的,因为它构成了位在一衬垫一个不和谐上下文切换的,有些冗长,并且需要使用特殊变量搞乱@ARGV
.
我认为手动的while循环解决方案更像是一个非解决方案,因为它-n
完全放弃了这个选项,关键是我希望能够使用-n
带有命令行参数的选项.
对于环境变量解决方案也是如此; 关键是我希望能够使用带有该-n
选项的命令行参数.
有没有更好的办法?
你基本上已经识别出它们了.我唯一错过的,至少我知道的是传递switch参数(而不是位置参数)的选项:
$ perl -sne'chomp; print if $_ eq $kwarg' -- -kwarg=bb <<<$'aa\nbb\ncc';
bb
Run Code Online (Sandbox Code Playgroud)
您也可以使用众多getopt模块中的一个而不是-s
.这基本上与@ARGV
在BEGIN {}
主程序循环之前在块中进行操作相同,但是为你做这件事并使它对于单行程更干净.
归档时间: |
|
查看次数: |
272 次 |
最近记录: |