Я использую reval из модуля Perl Safe , и я хочу, чтобы он не генерировал предупреждения, если оцениваемая строка не может быть проанализирована (на самом деле, я хочу предотвратить это от генерации каких-либо предупреждений вообще ).
Например, следующий код:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
my $x = $cft->reval(') 1' );
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
результаты в:
Number found where operator expected at (eval 5) line 1, near ") 1"
(Missing operator before 1?)
Use of uninitialized value $x in concatenation (.) or string at./test line 12.
x:
y: 2
Я пытаюсь добиться того, чтобы $x = undef и $y = 2 и никаких предупреждений. Я попытался поставить «без предупреждений»; внутри новой области, но это не влияет на предупреждения, выдаваемые из reval (, хотя, как указал @DavidO, оно отключает предупреждение «неинициализированное значение»):
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
no warnings;
my $x = $cft->reval(') 1' );
my $y = $cft->reval('2' );
say "x: $x";
say "y: $y";
}
Я предполагаю, что каким-то образом «нет предупреждений» должно быть внутри сейфа, поэтому я также попытался добавить «без предупреждений»; оцениваемым строкам:
use strict; use warnings;
use Safe;
use feature qw/say/;
my $cft = Safe->new;
{
my $x = $cft->reval( 'no warnings;'. ') 1' );
my $y = $cft->reval( 'no warnings;'. '2' );
say "x: $x";
say "y: $y";
}
Таким образом, reval не выдает никаких предупреждений, но обе переменные имеют значение undef :
Use of uninitialized value $x in concatenation (.) or string at./test line 10.
x:
Use of uninitialized value $y in concatenation (.) or string at./test line 11.
y:
. Я не знаю, что еще попробовать, и я надеюсь, что описание проблемы было достаточно ясным.