Perl,
while (defined($_ = <HANDLE>))
karş ifadeleri eşdeğer olarak
while (<HANDLE>)
while (readline(HANDLE))
davranır
readline
fonksiyonu için bazı özel işleme (ve buna denk
<>
I/O operatörü) sahip olan
$ perl -MO=Deparse -e 'f($_) while <>'
f($_) while defined($_ = <ARGV>); <--- implicitly sets $_
-e syntax OK
Ama
readline
fonksiyonunu kaçırmak eğer bu otomatik atama gerçekleşmesi görünmüyor:
$ 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
Tabii ki, bu eski kod bir sürü için yanlış özel readline
fonksiyon çalışmalarını yapacaktır. Bu kod BEGIN bloğu ve "bar"
olmadan bu kod "foo"
ise, ancak "BAR"
olmasını istiyorum.
use warnings;
BEGIN { *CORE::GLOBAL::readline = \&uc_readline; }
sub uc_readline {
my $line = CORE::readline(shift || *ARGV);
return uc $line if defined $line;
return;
}
($_, $bar) = ("foo\n", "bar\n");
open X, '<', \$bar;
while (<X>) {
print $_; # want and expect to see "BAR\n"
}
seçeneklerim nelerdir readline
fonksiyonunu kaçırmak ama yine while (<...>)
deyim uygun tedavi almak gerekiyor? Tüm eski kodlarda her şeyi açıkça while (defined($_=<...>))
'a dönüştürmek pratik değildir.
burada neden ('Perl_newLOOPOP', opmini.c: 5318) bu dönüşümü yapan kod şudur: karışıma Scope::Upper eklemek, o düzeltir optree çalışır ve bir' OP_READLINE' arıyor - ancak eğer "CORE :: GLOBAL :: readline" tanımlanırsa, derleme yerine "OP_ENTERSUB" yerine kendi yerini alacak, böylece while-dönüşüm asla gerçekleşmeyecektir. Bu bir hata olarak nitelendirir ya da değil emin değilim :) – hobbs
Ugh, korkarım ki böyle bir şeydi. Bir hata değilse, en azından belgelenmemiş. – mob
oops, sanki seni perlbug'a gönderdiğimi söylemek için çok bekledim gibi görünüyor - çünkü sende öyle yaptın. Tamam, bir test vakası verdiniz :) – hobbs