我正在尝试从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"; }
Slade.. 7
您需要的文件Iterator_Utils.pm
附带的书的代码,这样你就可以use Iterator_Utils qw(Iterator)
,或者你插入的定义Iterator
子程序到你自己的代码之前,任何调用Iterator
¹:
sub Iterator (&) { return $_[0] }
或者,因为这只是一种允许您编写以声明不带关键字的匿名子程序的聪明方法,您可以替换它并且它将起作用.Interator { ... }
sub
Iterator
sub
[1]这是使用原型声明子程序的众多缺点之一.因为原型告诉解析器如何解释原型子例程调用,所以原型声明必须在文件中比调用本身更早出现.
您需要的文件Iterator_Utils.pm
附带的书的代码,这样你就可以use Iterator_Utils qw(Iterator)
,或者你插入的定义Iterator
子程序到你自己的代码之前,任何调用Iterator
¹:
sub Iterator (&) { return $_[0] }
或者,因为这只是一种允许您编写以声明不带关键字的匿名子程序的聪明方法,您可以替换它并且它将起作用.Interator { ... }
sub
Iterator
sub
[1]这是使用原型声明子程序的众多缺点之一.因为原型告诉解析器如何解释原型子例程调用,所以原型声明必须在文件中比调用本身更早出现.