Sto usando reval dal modulo Safe di Perl e voglio impedirgli di generare avvisi se la stringa sottoposta a valutazione non può essere analizzata (in realtà, voglio impedirgli di generare alcun avviso) ."nessun avviso;" in un compartimento sicuro
Ad esempio, il seguente codice:
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";
risultati in:
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
Quello che sto cercando di realizzare è quello di avere $ x = undef e $ y = 2, e non avvertenze. Ho provato a mettere un "nessun avviso"; all'interno di un nuovo campo di applicazione, ma non ha alcun effetto sulle avvertenze prodotte dall'interno del Reval (anche se, come sottolineato da @DavidO, tacita l'avviso 'valore non inizializzato'):
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";
}
Credo che in qualche modo la 'nessun avvertimento' deve essere all'interno del compartimento sicuro, quindi ho anche cercato di anteporre "nessun avvertimento"; alle stringhe di essere eval'ed:
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";
}
In questo modo Reval non emette eventuali avvisi, ma entrambe le variabili sono 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:
non so che altro per provare, e spero che la descrizione del problema era abbastanza chiara.
Il tuo secondo tentativo in realtà non produce lo stesso risultato del primo. Produce ancora l'errore "compiletime" (in realtà l'errore compiletime reval), ma non l'avviso di runtime relativo all'interpolazione di un valore non inizializzato nella dichiarazione 'say'. Quindi hai effettivamente risolto metà del tuo problema (silenziato l'avviso) nel secondo frammento sopra. L'altra metà (sopprimere l'errore di compilazione) è più problematica. – DavidO
Sì, hai ragione su questo. Non me ne sono nemmeno accorto perché la mia preoccupazione principale qui è stata davvero la rivalsa: gli avvertimenti variabili non inizializzati sono una conseguenza di me che sto cercando di mantenere l'esempio breve. Ad ogni modo, ho aggiornato il post per renderlo più chiaro. Grazie! – andrefs