Perl一个内衬,在哪里啜饮@ARGV

时间:2014-09-02 20:15:46

标签: perl

我正在寻找一个Perl oneliner(将其插入Bash脚本),我需要下一个界面:

perl -0777 -nlE 'commands' file1 file2 .... fileN

我创建了下一个:

perl -0777 -lnE 'BEGIN{$str=quotemeta(do{local(@ARGV, $/)="file1"; <>})} say "working on $ARGV" if $_ =~ /./' "$@"

更漂亮:

perl -0777 -lnE '
    BEGIN{
        $str = quotemeta(
            do{
                local(@ARGV, $/)="file1"; <>  #localize ARGV to "file1.txt" for <>
            }
        )
    }
    say "working on $ARGV" if $_ =~ /./   #demo only action
' "$@"

虽然有效,但有了这个,我需要在每次需要更改file1时编辑源代码。

如何将脚本更改为以下内容?

  • $ARGV[0](file1)粘贴到$str(在BEGIN区块中)
  • 并将其他参数插入主循环中的$_

1 个答案:

答案 0 :(得分:4)

将其作为参数传递,将其从@ARGV块中的BEGIN中删除。

$ echo foo >refile

$ echo -ne 'foo\nbar\nfood\nbaz\n' >file1

$ echo -ne 'foo\nbar\nfood\nbaz\n' >file2

$ perl -lnE'
   BEGIN {
      local @ARGV = shift(@ARGV);
      $re = join "|", map quotemeta, <>;
   }
   say "$ARGV:$.:$_" if /$re/;
   close(ARGV) if eof;  # Reset $.
' refile file1 file2
file1:1:foo
file1:3:food
file2:1:foo
file2:3:food