带 ARGV 的 Perl 行模式 oneliner

kob*_*ame 4 perl

我经常需要运行一些 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 命令行参数的“内部”而不将它们解释为文件名?

mob*_*mob 5

也相当短:

... | expr=abc perl -lne 'print if /$ENV{expr}/'
Run Code Online (Sandbox Code Playgroud)

在 shell 中工作bash,但可能不适用于其他 shell。


ike*_*ami 5

一些解决方案:

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 或所有模式的模式可能比为每个模式执行相同的命令更有意义。