Как создать саб внутри саб в Perl? - PullRequest
0 голосов
/ 16 октября 2018
sub fun2{
    my $var2 = 10;

    my sub fun1{
        print"$var2";
        $var2++;
    }
   fun1();
   print "$var2";
 }

 fun2();

Я хочу напечатать 10 и 11, этот код выдает ошибку «Experimental» мои «подпрограммы не включены в source_file», если я удаляю ключевое слово «my» из «my sub fun1», то выдает ошибку «Variable»$ var2 "не будет использоваться в строке source_file.pl" Как мы можем разрешить внутренней подпрограмме изменять данные внешней подпрограммы?

Спасибо

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Не должно ли это быть:

 my $fun1 = sub {
    print"$var2";
    $var2++;
};
0 голосов
/ 16 октября 2018

Синтаксис, который вы используете, действителен с 5.18, но вам необходимо добавить use feature qw( lexical_subs );, чтобы включить его.

use strict;
use warnings;
no warnings qw( experimental::lexical_subs );  # Needed before 5.26. Harmless in 5.26+
use feature qw( lexical_subs say );

sub fun2 {
    my $var2 = 10;

    my sub fun1 {
        say $var2;
        ++$var2;
    }

    fun1();
    say $var2;
}

fun2();

До 5.18 вы можете использовать

use strict;
use warnings;
use feature qw( say );

sub fun2 {
    my $var2 = 10;

    my $fun1 = sub {
        say $var2;
        ++$var2;
    };

    $fun1->();
    say $var2;
}

fun2();

или

use strict;
use warnings;
use feature qw( say );

sub fun2 {
    my $var2 = 10;

    local *fun1 = sub {
        say $var2;
        ++$var2;
    };

    fun1();
    say $var2;
}

fun2();
0 голосов
/ 16 октября 2018

Подпрограммы с лексическим именем все еще (очень) экспериментальны в Perl.Простой подход - использовать вместо этого анонимную подпрограмму, которая обойдет проблему потери общих переменных, пока еще не будучи экспериментальной:

sub fun2{
    my $var2 = 10;

    my $fun1 = sub {
        print"$var2";
        $var2++;
    };
    $fun1->();
    print "$var2";
 }

 fun2();

Проблема вложенных именованных подпрограмм, не сохраняющих доступ к общим переменным, уже былассылка на Perl: «Переменная не будет оставаться общей» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...