为什么我不能将这个 perl sub 分配给一个变量?
Why can't I assign this perl sub to a variable?
我想了解 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";
}
似乎没有问题return将对子 (imap) 的引用指向字符串 $rng,并使用它指向 imap 的子。
我想将 sub 分配给 imap 的字符串 INSIDE,return 字符串,如下所示:
$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;
当我尝试 return 或打印 $imapSub,甚至将其用作 ref() 的参数时,Perl 报告语法错误。当我将 sub 分配给变量时它没有抱怨。
即使我将子例程的引用显式转换为 $\&sub,它也会做同样的事情。
为什么我尝试使用引用时会出现语法错误?
您在语句 $imapSub = sub { ... }
的右大括号后遗漏了一个分号,因此您在其后放置的任何内容都是意外的并会导致语法错误。
我想了解 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";
}
似乎没有问题return将对子 (imap) 的引用指向字符串 $rng,并使用它指向 imap 的子。
我想将 sub 分配给 imap 的字符串 INSIDE,return 字符串,如下所示:
$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;
当我尝试 return 或打印 $imapSub,甚至将其用作 ref() 的参数时,Perl 报告语法错误。当我将 sub 分配给变量时它没有抱怨。
即使我将子例程的引用显式转换为 $\&sub,它也会做同样的事情。
为什么我尝试使用引用时会出现语法错误?
您在语句 $imapSub = sub { ... }
的右大括号后遗漏了一个分号,因此您在其后放置的任何内容都是意外的并会导致语法错误。