加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:05:31 所属栏目:大数据 来源:网络整理
导读:我正在尝试从HOP获取此Iterator代码: # code from HOP p.156sub make_rand {my $seed = shift || (time 0x7fff);return Iterator { $seed = (29*$seed+22222) 0x7fff; return $seed; }}# code adapted from HOP p.157my $rng = make_rand(1);while () { # m
我正在尝试从HOP获取此Iterator代码:

# code from HOP p.156
sub make_rand {
my $seed = shift || (time & 0x7fff);
return Iterator 
    {   $seed = (29*$seed+22222) & 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+22222) & 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),或者在调用Iterator1之前将Iterator子例程的定义插入到您自己的代码中:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读