Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能把这个perl子赋值给一个变量吗?_Perl_Reference_Subroutine - Fatal编程技术网

为什么可以';我不能把这个perl子赋值给一个变量吗?

为什么可以';我不能把这个perl子赋值给一个变量吗?,perl,reference,subroutine,Perl,Reference,Subroutine,我试图理解HOP第158页上imap例程复杂的执行路径 此代码有效 # code from rng-iterator.pl sub make_rand { my $seed = shift || (time & 0x7fff); print "\nin make_rand, at6: seed=$seed"; return sub { $seed = (29*$seed+11111) & 0x7fff; print "\nin make_rand sub, at9:

我试图理解HOP第158页上imap例程复杂的执行路径

此代码有效

# code from rng-iterator.pl
sub make_rand {
my $seed = shift || (time & 0x7fff);
print "\nin make_rand, at6: seed=$seed";
return sub 
    {   $seed = (29*$seed+11111) & 0x7fff;
print "\nin make_rand sub, at9: seed=$seed";
        return $seed; 
    }
}

# code adapted from HOP p.158, to make an iterator version of map
sub imap {
    my ($transform, $it) = @_;
print "\nin imap, at17";
    return sub 
    {   my $next = $it->();
print "\nin imap sub, at20, next=$next";
        return unless defined $next;
        $newVal = $transform->($next);
print "\nin imap sub, at23, newVal=$newVal";
        return $newVal;
    }
}

# to return random number 0 .. 1
$rng = imap(sub {$_[0] / 37268}, make_rand(1)); # set seed 
print "\nin main at30, rng=$rng";
while (<>) {    
    my $random = $rng->();  
    print "\nin main, at 32: random=$random";
}
当我试图返回或打印$imapSub,甚至将其用作ref()的参数时,Perl报告了一个语法错误。当我将sub分配给变量时,它没有抱怨

即使我将子例程的引用显式转换为$\&sub,它也会执行相同的操作


当我尝试使用引用时,为什么会出现语法错误?

在语句
$imapSub=sub{…}
中,右大括号后缺少分号,因此,在该括号后放置的任何内容都是意外的,并会导致语法错误。

在语句
$imapSub=sub>中,右大括号后缺少分号{…}
,因此,无论您在后面放置什么,都是意外的,并且会导致语法错误。

您没有分配给字符串,而是分配给变量。您没有分配给字符串,而是分配给变量。
    $imapSub =  sub 
        {   my $next = $it->();
                print "\nin imap sub, at20, next=$next";
            return unless defined $next;
            $newVal = $transform->($next);
                print "\nin imap sub, at23, newVal=$newVal";
            return $newVal;
        }
    return $imapSub;