Estoy usando reval del módulo Safe de Perl y quiero evitar que genere advertencias si la cadena que se evalúa no se puede analizar (en realidad, quiero evitar que genere advertencias) ."sin advertencias"; en un compartimento seguro
Por ejemplo, el siguiente código:
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";
resultados en:
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
Lo que estoy tratando de lograr es tener $ x = undef y $ y = 2, y sin advertencias Intenté poner "sin advertencias"; dentro de un ámbito nuevo, pero no tiene ningún efecto sobre las advertencias producidos desde dentro de la reval (aunque, como ha señalado @DavidO, se silencia la advertencia de valor sin inicializar '):
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";
}
supongo que de alguna manera la 'no hay advertencias' debe estar dentro del compartimento seguro, así que también intenté anteponer "sin advertencias"; a las cadenas que se 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";
}
Este reval manera no emite ninguna advertencia, pero ambas variables son no def:
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:
no sé qué más para intentar, y espero que la descripción del problema era lo suficientemente clara.
Su segundo intento en realidad no produce el mismo resultado que el primero. Aún produce el error de "tiempo de compilación" (en realidad, error de compilación de revalidación), pero no el aviso de tiempo de ejecución relacionado con la interpolación de un valor no inicializado en su declaración 'say'. Así que en realidad resuelve la mitad de su problema (apagó la advertencia) en su segundo fragmento de arriba. La otra mitad (silenciar el error en tiempo de compilación) es más problemática. – DavidO
Sí, tienes razón sobre eso. Ni siquiera me di cuenta de eso porque mi principal preocupación aquí era realmente la revalidación: las advertencias variables no inicializadas son una consecuencia de mi intento de mantener corto el ejemplo. De todos modos, he actualizado la publicación para que quede más clara. ¡Gracias! – andrefs