Por ejemplo, ante la entrada:
4 5 2 + *
El programa deberá imprimir 28
.
Sugerencias:
split
.
Recuerde que la expresion regular \s
casa con cualquier blanco
Puede consultar la tabla en la sección 3.6.
lhp@nereida:~/Lperl/src$ perl -wde 0 main::(-e:1): 0 DB<1> x split /\s+/, "2 3 7 + * 4 -" 0 2 1 3 2 7 3 '+' 4 '*' 5 4 6 '-'
La siguiente sesión con el depurador sugiere como hacerlo:
lhp@nereida:~/Lperl/src$ perl -wde 0 main::(-e:1): 0 DB<1> $x = "2 13+2*3-" DB<2> @tokens = grep { defined } $x =~ m{\s*(\d+)|([-+*/])\s*}g DB<3> x @tokens 0 2 1 13 2 '+' 3 2 4 '*' 5 3 6 '-' DB<4> $x = "6 3/ 2*3-" DB<5> @tokens = grep { defined } $x =~ m{\s*(\d+)|([-+*/])\s*}g DB<6> x @tokens 0 6 1 3 2 '/' 3 2 4 '*' 5 3 6 '-'
Observe que esta solución puede ser ''excesiva'':
DB<7> $x = "6 3cc/ 2*xx3-" DB<8> x grep { defined } $x =~ m{\s*(\d+)|([-+*/])\s*}g 0 6 1 3 2 '/' 3 2 4 '*' 5 3 6 '-'
[-+*/]
).
=~
si es necesario.
die
puede utilizarse para abortar la
ejecución de un programa. Observe estos dos ejemplos de uso:
$op1 = pop @stack or die("Faltan argumentos\n"); ($x != 0) or die "No se puede dividir por cero!\n";
DB<1> $x = '4 + 2' DB<2> p $x 4 + 2 DB<3> $y = eval($x) DB<4> p $y 6 DB<5> p eval('3+$y') 9Para saber mas sobre la función
eval
consulte la documentación
escribiendo perldoc -f eval
.
*
y +
son metasímbolos dentro de una expresión regular.
$&
almacena la cadena que casó con la última expresión
regular usada, $1
, $2
, etc. contienen las cadenas que casaron con los paréntesis
que aparecen en la expresión regular.
Casiano Rodríguez León