#!/usr/bin/perl
$n= 42;
print "Adivina en que número estoy pensando ? ";
$v = <>;
die "Solo números positivos" if $v < 0;
if ($v == $n) {
print "Bien Hecho!\n";
}else {
print "Sigue Probando!.\n";
print "El número es " . (($v < $n) ? "MAYOR" : "MENOR") . "\n";
# Si hemos fallado añadimos una pista
print "Pista : ";
$h = abs ($v - $n);
if ($h < 5) {print " TE QUEMAS!!!\n"} # ; opcional en este caso
elsif ($h < 10) {print " CALIENTE\n";}
elsif ($h < 15) {print " TEMPLADO\n";}
else {print " FRIO\n";}
}
Perl, desde el punto de vista de las condiciones, es idéntico a C,
con la única excepción de que Perl nos obliga a utilizar siempre las
llaves, incluso si las llaves contienen una sola instrucción. En ese
caso, el terminador de línea ;
que es opcional y lo podemos
omitir. En nuestro código de ejemplo podríamos haber escrito:
if ($v == $n) {
print "Bien Hecho!\n"
}
Al igual que en C, en Perl es obligatorio utilizar los paréntesis
alrededor de las condiciones cuando utilizamos la forma
if-elsif-else
.
SABÍAS QUE…
Los caracteres
<>
se conocen como el operador diamante, por la forma que tiene. Se utiliza para leer líneas de la entrada estándar. En realidad se utiliza para leer datos de cualquier descriptor de fichero, pero cuando no especificamos ninguno entre los signos<
y>
simplemente lee de la entrada estándar.
Es posible omitir las llaves en las expresiones if
cuando solo queremos ejecutar una instrucción. A diferencia de C, en
este caso, la condición va al final de la instrucción precedida de
if
, y en ese caso no es necesario utilizar los paréntesis
en la condición, aunque no pasa nada si los ponemos.
die "Solo números positivos" if $v < 0;
SOY NOVATO
La instrucción
die
(Muere en inglés) termina el programa mostrando el mensaje que pasamos como parámetro.
Perl no ofrece una instrucción switch
como parte del
lenguaje, si bien existe un paquete que extiende el lenguaje con una
versión del comando switch
. Sin embargo, Perl nos ofrece un
operador ternario que funciona exactamente igual que su equivalente C
(de hecho son idénticos).
En el programa de ejemplo hemos utilizado la función abs
para calcular nuestro valor intermedio, pero podríamos implementar la
misma funcionalidad con el operador ternario:
$h = ($v > $n) ? $v - $n : $n - $v;
Como podéis comprobar Perl, al igual que otros lenguajes que veremos
a continuación, ofrece una construcción especial para el caso en el que
sea necesario añadir una nueva condición al bloque else
.
Esta construcción el nombre elsif
en Perl. Podéis ver como
utilizarla en el programa de ejemplo para generar la pista.
Perl permite definir tres tipos de variables: escalares, arrays y
hashes. Perl diferencia estos variables anteponiendo un símbolo distinto
al nombre de cada variable dependiendo de su tipo. Así las variables
escalares (las que solo pueden contener un valor) se marcan con el
símbolo $
. Los arrays o matrices con @
y las
tablas hash con #
.
SOY NOVATO
Perl no diferencia, en principio, entre tipos de datos. El valor almacenado en una variable Perl se utilizará de la forma más conveniente (número, cadena de caracteres,…) según el contexto.
Si bien es posible imprimir cadenas usando cadenas de formato como en
C, y en ocasiones resulta útil, Perl, al igual que la mayoría de
lenguajes de Script nos permiten imprimir valores de forma mucho más
sencilla. Podemos construir la cadena a imprimir utilizando el operador
.
o de concatenación, el cual permite … bueno… concatenar
cadenas. La siguiente línea muestra como usamos ese operador para
construir el mensaje a imprimir.
print "El número es " . (($v < $n) ? "MAYOR" : "MENOR") . "\n";
Pero Perl también nos permite imprimir variables directamente incluyéndolas dentro de la cadena, es lo que se conoce como Interpolación de Cadenas/ariables y es una funcionalidad presente en muchos otros lenguajes de programación.
El código anterior lo podríamos haber escrito de esta forma:
$pista = ($v < $n) ? "MAYOR" : "MENOR";
print "El número es $pista\n";
Como podéis ver simplemente usamos la variable dentro de la cadena para imprimirla. Para que esto funcione la cadena tiene que estar definida con comillas dobles. Las comillas simples también se pueden usar para definir una cadena en Perl, pero en ese caso la cadena se imprimirá tal cual está escrita.
Perl no permite definir constantes de forma nativa, si bien hay
distintos paquete que nos permiten incluir esta función en nuestros
programas. Los más comunes son constant
y
readonly
los cuales se pueden usar de la siguiente
forma:
use Readonly;
$V = 42;
Readonly
use contant V => 42;
Observad que cuando utilizamos constant
no indicamos el
tipo de variable y Perl sustituirá las ocurrencias de ese valor en
tiempo de compilación (lo cual ocurre justo antes de ejecutar nuestro
script). Por esa razón, no es posible hacer interpolación de cadenas con
constantes constant
:
use constant V => 42;
print "El valor es V"; # Imprime "El valor es V"
print "El valor es " , V; # Imprime "El valor es 42"
SABÍAS QUE…?*
Existen módulos Perl para casi cualquier cosa, incluyendo también la definición de constantes, si bien los dos formas que os hemos comentado son los más típica. Por ejemplo, el paquete
Const::Fast
funciona igual queconstant
pero permite interpolación de cadenas.
En general, la forma más sencilla de trabajar con constantes es asumir una determinada nomenclatura. Suele ser habitual utilizar letras mayúsculas para los nombre de las constantes. De esta forma, cualquier variables cuyo identificador esté en mayúsculas es interpretada como una constante por el programador y no va a intentar asignar valores a ella.
Resumen
- Soporta
if ... [elsif] ...[else] ...
- Soporta forma reducida
Comando if (cond);
- Soporta operador terciario
(cond) ? valor_Verdad : Valor_Falso
- No soporta booleanos:
==0 -> FALSO y !=0 VERDADERO
- No soporta
switch
- No soporta constantes nativamente (modulos
contant
yreadonly
)
■