# 在perlmonks看到的,感觉很灵活,原文http://perlmonks.org/?node_id=922074
#
# 解析格式如下的文件:
# alpha # this line appears only once in the whole file
# beta
# beta
# beta
# beta
# beta
# beta
# ...
# beta
#
# 一般的循环如下:
# while ( <FILE> ) {
# if ( /alpha/ ) {
# ....
# } else {
# ....
# }
# }
# 上面的代码每次都会判断是否为alpha,不管该文件有多少行。因为alpha在该文件中只会出现一次,有没有什么办法,使得程序在遇到alpha的以后循环就不在执行该分支?
#! /usr/bin/perl
my $f;
$f = sub {
if (/alpha/) {
do_alpha();
$f = \&do_beta;
} else {
do_beta();
}
};
while (<DATA>) {
$f->();
}
sub do_alpha {
print "do_alpha(): \$f = $f, \$_ = $_";
}
sub do_beta {
print "do_beta(): \$f = $f, \$_ = $_";
}
__DATA__
beta
beta
beta
beta
alpha
beta
beta
beta
beta
beta
beta
beta
beta
Output:
do_beta(): $f = CODE(0x796e88), $_ = beta
do_beta(): $f = CODE(0x796e88), $_ = beta
do_beta(): $f = CODE(0x796e88), $_ = beta
do_beta(): $f = CODE(0x796e88), $_ = beta
do_alpha(): $f = CODE(0x796e88), $_ = alpha
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
do_beta(): $f = CODE(0x7c6ee8), $_ = beta
#初始时,f检查是否遇到了alpha,一旦遇到了,就会将它自身替换为do_beta()。之后的每一行,都会调用do_beat()来处理。