相关疑难解决方法(0)

如何使用模拟的"readline"函数自动分配到"$ _"?

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

11
推荐指数
1
解决办法
369
查看次数

标签 统计

perl ×1