Почему я не могу присвоить этот perl sub переменной?

Я пытаюсь понять запутанный путь выполнения подпрограммы imap на стр.158 HOP.

Этот код работает

# 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";
}

Кажется, нет проблем с возвратом ссылки на подпрограмму (imap) в строку $ rng и использованием этой ссылки для указания на подпрограмму imap.

Я хотел назначить подпрограмму в строку INSIDE imap и вернуть строку, как здесь:

    $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;

Perl сообщил о синтаксической ошибке, когда я попытался вернуть или распечатать $ imapSub, или даже использовать его в качестве аргумента для ref(). Он не жаловался, когда я назначил сабвуфер переменной.

Он делает то же самое, даже если я явно приведу ссылку на подпрограмму как $\&sub.

Почему я получаю синтаксическую ошибку при попытке использовать ссылку?

1 ответ

Решение

Вы пропускаете точку с запятой после закрывающей скобки в утверждении $imapSub = sub { ... }так что все, что вы ставите после этого, является неожиданным и вызывает синтаксическую ошибку

Другие вопросы по тегам