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

标签 perl iterator

我正在尝试从 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/

相关文章:

python - 正则表达式中重复限定符被忽略

perl - 如何在 unix 环境中的任何地方运行 perl 脚本?

html - 使用 Perl 解析 html

c++ - 使用迭代器访问成员字符串时出错::空

java - java中使用Iterator如何提高算法效率?

c++ - operator[] 和 insert() 函数在 C++ 映射中的行为方式不应该相同吗?

mysql - 如何在 Perl 中构建具有灵活列数的动态 MySQL INSERT 语句?

linux - 如何从 Windows 发送到 perl 中的 Linux FTP 服务器的 w 文件中删除 ^M (CRLF)?

java - 在特定位置插入 List<List<Map<Integer,Integer>>>

c++ - 你能为 ContiguousIterator 写一个概念吗?