我经常需要运行一些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命令行参数的“内部”而不将它们解释为文件名?
答案 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或所有模式的模式可能更有意义,而不是为每个模式执行相同的命令。