Introducción a Perl 5.10 - Condiciones y cadenas

Operadores de comparación

Los operadores de comparación numéricos son: <, >, == y !=. (También se puede usar <=, "manor o igual," y >=, "mayor o igual".)

Estos operadores, aplicados a dos números, devuelve un valor lógico verdadero o falso, que puede ser utilizado por una palabra clave condicional, como if o unless, para determinar si se ejecuta o no una o más sentencias dependientes:

use 5.010;  
if ($year_according_to_computer == 1900) {
say "Y2K has doomed us all! Everyone to the compound.";
}
unless ($bank_account > 0) {
say "I'm broke!";
}

Hay que tener cuidado de no confundir el operador de asignación = con el operador de comparación de igualdad ==. El siguiente es un error comun:

use 5.010;  
if ($a = 5) {
say "This works - but doesn't do what you want!";
}

En lugar de comprobar si $a es igual a cinco, lo que se hace es asignar a $a el valor cinco.

Tanto if como unless pueden ir seguidos de una sentencia else. También se puede utilizar elsif para encadenar en secuencia una serie de sentencias if.

use 5.010;  
if ($a == 5) {
say "It's five!";
} elsif ($a == 6) {
say "It's six!";
} else {
say "It's something else.";
}
unless ($pie eq 'apple') {
say "Ew, I don't like $pie flavored pie.";
} else {
say "Apple! My favorite!";
}

No siempre se necesita una condición else, y por otra parte, en ocasiones el código dependiente de la condición cabe en una sola línea. En este caso, se puede utilizar la siguiente sintaxis, en donde la condición se coloca a continuación de la sentencia a ejecutar: 

use 5.010;  
say "I'm leaving work early!" if $day eq 'Friday';
say "I'm burning the 7 pm oil" unless $day eq 'Friday';

while y until

Estas dos sentencias de control de flujo repiten la ejecución de un bloque de código, mientras se cumple la condición (while) o bien mientras no se cumple (until):

use 5.010;  
my $count = 0;
while ($count != 3) {
$count++;
say "Counting up to $count...";
}
until ($count == 0) {
$count--;
say "Counting down to $count...";
}

Comparación de cadenas

El operador de comparación de cadenas más comun es eq, que determina si dos cadenas son iguales. Su comportamiento es distinto al del operador == que realiza una comparación numérica, en cuyo caso Perl intenta convertir las cadenas a números antes de realizar la comparación. Si se prueba el siguiente código:

use 5.010;  
my $yes_no = 'no';
say "How positive!" if $yes_no == 'yes';

El resultado será que se imprime 'How positive!'. Al aplicar el operador ==, tanto la cadena 'no' como la cadena 'yes' se convierten el el número 0, y al evaluar 0 == 0 el resultado es verdadero.

Por otra parte, el número 5 es numéricamente igual a la cadena " 5 ", de modo que si se comparan con el operador == el resultado es verdadero. Pero cuando se comparan con el operador eq, Perl convierte primero el número 5 en la cadena "5", y el resultado de compararlo con la cadena " 5" será falso, como se puede ver si se ejecuta el siguiente código:

use 5.010;  
my $five = 5;
say "Numeric equality!" if $five == " 5 ";
say "String equality!" if $five eq " 5 ";