我正在尝试从HOP获取此Iterator代码:
# code from HOP p.156
sub make_rand {
my $seed = shift || (time & 0x7fff);
return Iterator
{ $seed = (29*$seed+11111) & 0x7fff;
return $seed;
}
}
# code adapted from HOP p.157
my $rng = make_rand(1);
while (<>) {
# my $random = NEXTVAL($rng); # original code from HOP,adapted as next line
my $random = $rng->(); # this treats $rng as a number,not as a ref to a sub
print "\nrandom=$random";
}
如上所述,$rng作为Number返回,而不是Iterator的ref,因此当我尝试取消引用它时,它会在倒数第二行中出错.
我应该为NEXTVAL使用不同的表格吗?
如果我单独定义子迭代器,程序工作正常,例如:
sub make_rand {
my $seed = shift || (time & 0x7fff);
return Iterator($seed);
}
sub Iterator {
my $seed = shift;
$seed = (29*$seed+11111) & 0x7fff;
return $seed;
}
#main
my $random = make_rand(1);
print "\nat42: random=$random";
while (<>)
{ $random = Iterator($random);
print "\nat48: random=$random";
}
解决方法
您需要
book’s code附带的文件Iterator_Utils.pm,以便您可以使用Iterator_Utils qw(Iterator),或者在调用Iterator¹之前将Iterator子例程的定义插入到您自己的代码中:
sub Iterator (&) { return $_[0] }
或者,因为这只是允许你编写Interator {…}来声明一个没有sub关键字的匿名子程序的clever way,你可以用sub替换Iterator,它就可以了.
[1]这是使用原型声明子程序的众多缺点之一.因为原型告诉解析器如何解释原型子例程调用,所以原型声明必须在文件中比调用本身更早出现.
