Size: a a a

2021 January 26

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Но это не работает и в случае без BEGINб в том числе если вообще подменять функцию в момент её первого вызова
Что блин ты хочешь?
источник

SZ

Sergey Zhmylove in Modern::Perl
Поставь тз чуть более понятно
источник

AK

Andrey Konovalov in Modern::Perl
Sergey Zhmylove
Что блин ты хочешь?
Должно работать так:
defers auth_ldap => \'Authenticator::LDAP->new($opt->ldap_config)'
При этом defers хочется вынести с декларативную часть кода (ближе к use и BEGIN {} ), а не вызывать уже после формирования my $opt'а

В принципе решается помещением пустого my $opt там же, сверху где-то, но выглядит это не очень.

Вопрос я больше для понимания сути задал, как это технически обойти/решить итак понятно.

Суть в  том, что я не понимаю, в чём разница между:
1)
my $x = 'hello';
sub f { eval 'say $x' }
f()

и
2)
sub f { eval 'say $x' }
my $x = 'hello';
f()
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
Должно работать так:
defers auth_ldap => \'Authenticator::LDAP->new($opt->ldap_config)'
При этом defers хочется вынести с декларативную часть кода (ближе к use и BEGIN {} ), а не вызывать уже после формирования my $opt'а

В принципе решается помещением пустого my $opt там же, сверху где-то, но выглядит это не очень.

Вопрос я больше для понимания сути задал, как это технически обойти/решить итак понятно.

Суть в  том, что я не понимаю, в чём разница между:
1)
my $x = 'hello';
sub f { eval 'say $x' }
f()

и
2)
sub f { eval 'say $x' }
my $x = 'hello';
f()
Эээ
источник

SZ

Sergey Zhmylove in Modern::Perl
А что блин не работает-то?
источник

AK

Andrey Konovalov in Modern::Perl
Второй пример
источник

AK

Andrey Konovalov in Modern::Perl
$x типа не определена с т.з. f()
Ну я подумал: ок, я пересоберу f прямо в момент вызова, уж в этот-то момент $x будет определена. Но нет, нифига
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
$x типа не определена с т.з. f()
Ну я подумал: ок, я пересоберу f прямо в момент вызова, уж в этот-то момент $x будет определена. Но нет, нифига
Разница в том, что eval не инлайнится, как ты думаешь. Он исполняется там, где написан и там, где он написан, нет $x в области видимости.

Не понимаю, почему не написать так:
sub f { eval q(eval 'say $_[0]') };
my $x = 'hello';
f($x)

Ну или так:
my $f = q[sub { eval 'say $x' }->()];
my $x = 'hello';
eval $f;
источник

c

cono in Modern::Perl
я показывал как решить проблему, но похоже человеку нравится видеть преграды
источник

SZ

Sergey Zhmylove in Modern::Perl
ЗЫ /me не читал тред
источник

AP

Andrei Protasovitski in Modern::Perl
Я понимаю, что он хочет, я понимаю, почему не работает. Я не понимаю, какую проблему такой подход решает.
источник

AK

Andrey Konovalov in Modern::Perl
Sergey Zhmylove
Разница в том, что eval не инлайнится, как ты думаешь. Он исполняется там, где написан и там, где он написан, нет $x в области видимости.

Не понимаю, почему не написать так:
sub f { eval q(eval 'say $_[0]') };
my $x = 'hello';
f($x)

Ну или так:
my $f = q[sub { eval 'say $x' }->()];
my $x = 'hello';
eval $f;
sub f { eval q(eval 'say $_[0]') };
my $x = 'hello';
f($x)

Мда, о такой конструкции не подумал
источник

AK

Andrey Konovalov in Modern::Perl
Andrei Protasovitski
Я понимаю, что он хочет, я понимаю, почему не работает. Я не понимаю, какую проблему такой подход решает.
Разделение декларативной части кода и исполняемой
источник

AP

Andrei Protasovitski in Modern::Perl
Andrey Konovalov
sub f { eval q(eval 'say $_[0]') };
my $x = 'hello';
f($x)

Мда, о такой конструкции не подумал
Чем это отличается от:
```
sub f { say $_[0]; };
my $x = 'hello';
f($x)
```
?

Ну, кроме того, что без двойного eval намного быстрее...
источник

AK

Andrey Konovalov in Modern::Perl
Мне нужно эвалить произвольный код, который вернёт скаляр.
источник

AK

Andrey Konovalov in Modern::Perl
В этом суть, а не в том, чтобы сказать hello
источник

VG

Vadim Goncharov in Modern::Perl
для чего? /me тоже не читал тред
источник

AP

Andrei Protasovitski in Modern::Perl
Andrey Konovalov
Мне нужно эвалить произвольный код, который вернёт скаляр.
"Произвольный код", который содержит упоминания переменных в main?
источник

AK

Andrey Konovalov in Modern::Perl
Andrei Protasovitski
"Произвольный код", который содержит упоминания переменных в main?
Да, почему бы нет? Если на момент формирования строки с произвольным кодом все переменные, упомянутые в нём, доступны, то eval $code_str же я могу сделать? :)
источник

AP

Andrei Protasovitski in Modern::Perl
А "произвольный код" приходит из командной строки?
источник