gpt4 book ai didi

perl - 为什么 Higher Order Perl 中的 make_rand 不起作用?

转载 作者:行者123 更新时间:2023-12-01 09:52:53 25 4
gpt4 key购买 nike

我正在尝试从 HOP 获取此迭代器代码以使其工作:

# 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 以数字形式返回,而不是迭代器的引用,因此当我尝试取消引用它时,它会在倒数第二行中给出错误。

我应该为 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] }

或者,因为这只是一个 clever way允许你编写 Interator { ... } 来声明一个没有 sub 关键字的匿名子程序,你可以用 替换 Iterator sub 它将起作用。

[1] 这是使用原型(prototype)声明子例程的众多缺点之一。因为原型(prototype)告诉解析器如何解释原型(prototype)子例程调用,所以原型(prototype)声明必须比调用本身更早地出现在文件中。

关于perl - 为什么 Higher Order Perl 中的 make_rand 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com