2014-09-02 43 views
1

我要尋找一個Perl oneliner(將其插入bash腳本),我需要在下一個界面:的Perl oneliner其中吸食@ARGV

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

我創建了下:

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

漂亮:

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

它的工作原理,但與此我需要編輯每次需要更改時的源代碼file1

如何將腳本更改爲以下內容?

  • 啜食的$ARGV[0](file1的)轉換成$str(在BEGIN塊)
  • 而發出聲音的其它參數到$_在主迴路

回答

4

它傳遞作爲參數,在拆下從@ARGVBEGIN區塊。

$ 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 
+1

賦值運算符在它的LHS操作數之前評估它的RHS操作數。它允許像'perl -E'my $ x =「abc」; {my $ x = uc($ x);說$ x; }說$ x;'' – ikegami 2014-09-02 20:35:10