«без предупреждений»; в сейфе

Я использую 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:

. Я не знаю, что еще попробовать, и я надеюсь, что описание проблемы было достаточно ясным.

5
задан andrefs 26 July 2012 в 21:32
поделиться