我经常需要运行一些 Perl 语句来快速进行数据操作,例如
some_command | perl -lne 'print if /abc/'
Run Code Online (Sandbox Code Playgroud)
从管道读取,我不需要围绕命令 arg 文件名进行循环。我怎样才能实现下一个?
some_command | perl -lne 'print if /$ARGV[0]/' abc
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
Can't open abc: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
我知道“-n”的作用是
while(<>) {.... }
Run Code Online (Sandbox Code Playgroud)
在我的程序周围,<>将args作为文件名,但每次都执行下一个有点不切实际
#/bin/sh
while read line
do
some_command | perl -lne 'BEGIN{$val=shift @ARGV} print if /$val/' "$line"
done
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法可以进入 Perl ONE-LINER 命令行参数的“内部”而不将它们解释为文件名?
也相当短:
... | expr=abc perl -lne 'print if /$ENV{expr}/'
Run Code Online (Sandbox Code Playgroud)
在 shell 中工作bash,但可能不适用于其他 shell。
一些解决方案:
perl -e'while (<STDIN>) { print if /$ARGV[0]/ }' pat
perl -e'$p = shift; while (<>) { print if /$p/ }' pat
perl -e'$p = shift; print grep /$p/, <>' pat
perl -ne'BEGIN { $p = shift } print if /$p/' pat
perl -sne'print if /$p/' -- -p=pat
PAT=pat perl -ne'print if /$ENV{PAT}/'
Run Code Online (Sandbox Code Playgroud)
当然,创建一个 ORing 或所有模式的模式可能比为每个模式执行相同的命令更有意义。