El operador ternario es probablemente uno de los operadores más tristes en el mundo. El resto de los operadores tienen nombres como suma, negación unaria, negación binaria, pero este es nombrado solo por su sintaxis.

Como en la mayoría de lenguajes de programación es el único operador con 3 parámetros, mucha gente no conoce su nombre real. Cuando fue creado se llamó operador condicional .

Operadores unarios, binarios y ternarios

Un operador unario tiene un solo operando (-3).

Un operador binario tiene dos operandos (2-3) o (4+5).

Un operador ternario tiene tres operandos.

El operador condicional

En Perl 5, como en la mayoría de lenguajes de programación, el operador condicional tiene 3 partes separadas por ? y :.

La primera parte, antes de ? es la condición. Es evaluada en contexto booleano. Si es verdadera, la segunda parte, entre ? y : será evaluada y ese será el resultado de la expresión. En caso contrarío la tercera parte será evaluada y ese será el valor de la expresión.

En general es similar a:

CONDICION ? EVALUAR_SI_CONDICION_ES_VERDADERO : EVALUAR_SI_CONDICION_ES_FALSO

Que básicamente es lo mismo que

if (CONDICION ) {
CONDITION
    EVALUAR_SI_CONDICION_ES_VERDADERO;
} else {
    EVALUAR_SI_CONDICION_ES_FALSO;
}

Ejemplos

Veamos algunos ejemplos:

use strict;
use warnings;
use 5.010;

my $file = shift;

say $file ? $file : "archivo no proporcionado"; 

Si $file es verdadero (el usuario proporciono el nombre del fichero en la línea de comandos), mostrará el nombre en la línea de comandos. En caso contrario mostrará "archivo no proporcionado".

my $x = rand();
my $y = rand();

my $smaller = $x < $y ? $x : $y;
say $smaller

En este ejemplo el valor más pequeño es almacenado en $smaller.

Estableciendo un limite

Por ejemplo si nuestro código recibe algún valor por una función llamada get_value(), pero queremos estar seguro de que no excede un limite determinado:

my $MAX_LIMIT = 10;

my $value = get_value();
$value = $value <= $MAX_LIMIT ? $value : $MAX_LIMIT;

También podríamos escribir esto de otra forma:

$value = $MAX_LIMIT if $value > $MAX_LIMIT;