[英]Perl inside Bash: How to read from pipe and pass arguments to perl at the same time?
以下是我正在嘗試的代碼:
echo "a b c" | perl -e 'print $ARGV[0]; print $ARGV[1]; print $_;' "abc" "def"
此代碼的輸出是:
abcdef
我無法弄清楚為什么“打印$ _;” 不像往常一樣打印“abc”。 有任何想法嗎?
您沒有使用-n
或-p
,因此您不使用<>
作為標准輸入。 如果你有參數,你不會做任何事情。
使用-n
或-p
,它會在代碼周圍放置一個while(<>)
循環,如下所示:
perl -ne ' print '
等於
perl -e ' while (<>) { print }'
如果你使用-p
它是:
perl -e ' while (<>) { print } continue { print $_ }'
在這個階段,Perl將通過檢查@ARGV
來確定<>
將如何工作,其中存儲了腳本的參數。 如果其中有任何內容,它會將參數視為文件名,並嘗試打開並讀取這些文件。 然后將文件句柄稱為ARGV
。 此時, <>
不能用於從標准輸入讀取。
換句話說,使用參數將覆蓋STDIN
的讀數。 因此,如果您想從標准輸入讀取,則使用該文件句柄:
echo "a b c" | perl -e ' print @ARGV[0,1]; while (<STDIN>) { print } ' foo bar
另一個選擇是預先清除@ARGV
數組,如下所示:
echo "a b c"|perl -ne'BEGIN { @x = @ARGV; @ARGV = () }; print @x; print;' foo bar
但是,這也會在每行輸入中打印@x
一次,這可能並不理想。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.