Perl对readline函数(以及等效的<>I/O运算符)进行了一些特殊处理,它处理表达式
while (<HANDLE>)
while (readline(HANDLE))
Run Code Online (Sandbox Code Playgroud)
相当于
while (defined($_ = <HANDLE>))
Run Code Online (Sandbox Code Playgroud)
比照
$ perl -MO=Deparse -e 'f($_) while <>'
f($_) while defined($_ = <ARGV>); <--- implicitly sets $_
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
但是如果你劫持这个readline功能,这种自动分配似乎不会发生:
$ perl -MO=Deparse -e 'BEGIN {
> *CORE::GLOBAL::readline = sub { }
> }
> f($_) while <>'
sub BEGIN {
*CORE::GLOBAL::readline = sub {
};
}
f($_) while readline(ARGV); <--- doesn't set $_ !
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
当然,这会使自定义readline函数对许多遗留代码的工作不正确.这段代码的输出是"foo"BEGIN块, …
perl ×1