避免重复的条件循环[perlmonks]
来源:互联网 发布:欧菲斯办公软件 编辑:程序博客网 时间:2024/06/14 20:17
# 在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/perlmy $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__betabetabetabetaalphabetabetabetabetabetabetabetabeta
Output:do_beta(): $f = CODE(0x796e88), $_ = betado_beta(): $f = CODE(0x796e88), $_ = betado_beta(): $f = CODE(0x796e88), $_ = betado_beta(): $f = CODE(0x796e88), $_ = betado_alpha(): $f = CODE(0x796e88), $_ = alphado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = betado_beta(): $f = CODE(0x7c6ee8), $_ = beta
#初始时,f检查是否遇到了alpha,一旦遇到了,就会将它自身替换为do_beta()。之后的每一行,都会调用do_beat()来处理。