当前位置:  开发笔记 > 编程语言 > 正文

为什么不从高阶Perl的make_rand工作?

如何解决《为什么不从高阶Perl的make_rand工作?》经验,为你挑选了1个好方法。

我正在尝试从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 { ... }subIteratorsub

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



1> Slade..:

您需要的文件Iterator_Utils.pm附带的书的代码,这样你就可以use Iterator_Utils qw(Iterator),或者你插入的定义Iterator子程序到你自己的代码之前,任何调用Iterator¹:

sub Iterator (&) { return $_[0] }

或者,因为这只是一种允许您编写以声明不带关键字的匿名子程序的聪明方法,您可以替换它并且它将起作用.Interator { ... }subIteratorsub

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


对于那些好奇的人,为什么`返回Iterator {...}`编译时没有预先声明`Iterator`:间接对象符号再次出现!`perl -MO = Concise -e'Foo {return bar}'`表示`Iterator`被视为方法调用(尽管我无法弄清楚块如何调用方法).
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有