我寫了一個腳本,在匹配后列印當前和后續的行,然而,我注意到使用readline回傳值的兩種方式之間的差異。
這樣做的目的是:
$ echo $'H1
a
b
H2
a
b' | perl -ne 'if (/^H/) { print; print $line = readline }'
H1
a
H2
a
然而,這并不是:
$ echo $'H1
a
b
H2
a
b' | perl -ne 'if (/^H/) { print; print readline }'
H1
a
b
H2
a
b
相反,它列印了所有的行。為什么?
uj5u.com熱心網友回復:
print需要一個串列引數,并將readline()置于串列背景關系中。因此,它耗盡了所有的行。當你使用標量賦值$line = 時,它是在標量背景關系中,并且將只讀取1行。
閱讀更多關于背景關系的內容這里.
。uj5u.com熱心網友回復:
呼叫readline的環境是不同的。
在$line = readline中,=是標量賦值運算子,它在標量背景關系中評估其運算元。在標量背景關系中,readline回傳一個單行。
print,另一方面,接受一個運算式,它在串列背景關系中進行評估。在串列背景關系中,readline 回傳所有剩余的行。
等同于:[1]
$line = readline; print $line;。
print $line = readline;/code>print scalar(readline);
$line并不神奇。除了對$line的影響。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/311367.html
標籤:
