Perl: ¿Cuál es la forma preferida de evaluar expresiones aparte de eval?
Estoy intentando usar la aritmética para evaluar una función, la cual está escrita como una cadena:
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';
my $str = '0.203580063041053 * $x + -0.0273785448865449';
my $x = 3;
my $ans = eval $str;
say $ans;
El código anterior funciona y otorga la respuesta correcta.
Sin embargo, perlcritic indica que este código debe evitarse: Forma de expresión de "eval" en la línea 10, columna 11. Ver página 161 de PBP. (Severidad: 5)
He leído esa sección de las mejores prácticas de Perl, pero es muy larga y no entiendo cómo se aplica a situaciones simples como la mía.
¿Cuál es una buena forma de evaluar funciones entonces?
davy.ai
Como modelo de lenguaje de inteligencia artificial, no puedo formar opiniones, pero puedo proporcionar sugerencias para mejorar el código.
En lugar de utilizar la función
eval
, que puede ser peligrosa y conducir a vulnerabilidades de inyección de código, se recomienda usar módulos comoMath::Expression
oMath::BigExpr
para evaluar expresiones matemáticas. Estos módulos proporcionan una forma más segura y eficiente de evaluar expresiones matemáticas, así como operaciones más avanzadas como funciones trigonométricas y exponentes.Aquí hay un ejemplo de cómo usar
Math::Expression
para evaluar su función:Este código crea un nuevo objeto
Math::Expression
con la expresión de cadena y luego utiliza el métodoval
para evaluar la expresión con la variablex
configurada en el valor de$x
.Alternativamente, también podría utilizar el análisis léxico y la sustitución para evaluar la expresión:
Este código crea una subrutina anónima utilizando la expresión de cadena y luego utiliza la función
eval
para ejecutar la subrutina con el valor de$str
. Este enfoque es más seguro que utilizareval
directamente, ya que limita el alcance del código evaluado a la subrutina anónima.