readline EXPR
readline

從 EXPR 中包含的檔案句柄類型 (或如果未提供 EXPR,則從 *ARGV) 讀取。在純量環境中,每次呼叫會讀取並傳回下一行,直到到達檔案結尾,之後後續呼叫會傳回 undef。在清單環境中,會讀取直到到達檔案結尾,並傳回一行清單。請注意,這裡使用的「行」概念是您可能使用 $/ (或 英文 中的 $INPUT_RECORD_SEPARATOR) 定義的任何內容。請參閱 "$/" in perlvar

$/ 設定為 undef,當 readline 處於純量環境 (即檔案啜飲模式) 中,且當讀取空檔案時,它會在第一次傳回 '',隨後傳回 undef

這是實作 <EXPR> 運算子的內部函式,但您可以直接使用它。<EXPR> 運算子在 "I/O Operators" in perlop 中有更詳細的討論。

my $line = <STDIN>;
my $line = readline(STDIN);    # same thing

如果 readline 遇到作業系統錯誤,$! 將會設定為對應的錯誤訊息。當你從不可靠的文件句柄(例如 tty 或 socket)讀取資料時,檢查 $! 會有所幫助。以下範例使用 readline 的運算子形式,如果結果未定義,就會 die。

while ( ! eof($fh) ) {
    defined( $_ = readline $fh ) or die "readline failed: $!";
    ...
}

請注意,你無法使用這種方式處理 ARGV 文件句柄的 readline 錯誤。在這種情況下,你必須自己開啟 @ARGV 的每個元素,因為 eof 處理 ARGV 的方式不同。

foreach my $arg (@ARGV) {
    open(my $fh, $arg) or warn "Can't open $arg: $!";

    while ( ! eof($fh) ) {
        defined( $_ = readline $fh )
            or die "readline failed for $arg: $!";
        ...
    }
}

<EXPR> 運算子一樣,如果 readline 表達式用作 whilefor 迴圈的條件,則會隱式指定給 $_。如果 readline 表達式或將 readline 表達式明確指定給純量的 while/for 條件,則條件實際上會測試表達式值的已定義性,而不是其常規真值。