具有ARGV的perl线路模式oneliner

时间:2013-05-13 14:08:40

标签: perl

我经常需要运行一些Perl单行程来进行快速数据操作,比如

some_command | perl -lne 'print if /abc/'

从管道读取,我不需要围绕命令arg文件名循环。我怎样才能实现下一个?

some_command | perl -lne 'print if /$ARGV[0]/' abc

这给出了错误:

Can't open abc: No such file or directory.

我明白'-n'可以做

while(<>) {.... }

围绕我的程序,以及&lt;&gt;将args作为文件名,但每次都做下一次是不切实际的

#/bin/sh
while read line
do
   some_command | perl -lne 'BEGIN{$val=shift @ARGV} print if /$val/' "$line"
done

有没有更好的方法来获取Perl ONE-LINER命令行参数的“内部”而不将它们解释为文件名?

3 个答案:

答案 0 :(得分:4)

也相当短:

... | expr=abc perl -lne 'print if /$ENV{expr}/'

适用于bash shell但可能不适用于其他shell。

答案 1 :(得分:2)

这取决于你在阅读的内容中的想法,但你可以玩:

#/bin/sh
while read line
do
   some_command | perl -lne "print if /$line/"
done

显然,如果$line可能包含斜杠,则不会飞。然后,AFAIK,你坚持使用BEGIN块配方。

答案 2 :(得分:2)

一些解决方案:

perl -e'$p = shift; while (<>) { print if /$p/ }' pat

perl -e'$p = shift; print grep /$p/, <>' pat   # Inefficient.

perl -ne'BEGIN { $p = shift } print if /$p/' pat

PAT=pat perl -ne'print if /$ENV{PAT}/'

当然,创建一个ORing或所有模式的模式可能更有意义,而不是为每个模式执行相同的命令。