Para los programadores de Perl, se nos convirtió en costumbre pensar la forma en la cual tenemos que saber cómo comparar dos elementos. Estamos acostumbrados a pensar en las múltiples formas, operadores y posibilidades de comparación entre elementos, comprobación y existencia de elementos dentro unos de otros, valores de retorno de las funciones, existencia de un elemento dentro de un array o hash.
Pero a su vez, esto es un problema para los que empiezan, que se sienten abrumados por la cantidad de operadores y nueva sintaxis que deben aprender.
Ahora no. Casi todas de estas operaciones se pueden realizar con el mismo operador.
Un ejemplo:
if ( $a ~~ @b ) {
hará lo que sospechamos: devolverá verdadero si el elemento $a está dentro de @b, es decir, que alguno de los elementos de @b es igual a $a. Ya no hay que escribir un bucle para recorrer el array, en busca de ese elemento.
La siguiente tabla es un resumen de las combinaciones posibles:
$a $b Tipo de coincidencia Código similar
====== ===== ==================== ==============
Codigo[+] Codigo[+] igualdad referencial $a == $b
Cualquiera Código[+] test escalar de sub $b->($a)
Hash Hash claves hash idénticas [sort keys %$a]~~[sort keys %$b]
Hash Array existencia hash slice grep {exists $a->{$_}} @$b
Hash Regex filtrado claves hash grep /$b/, keys %$a
Hash Cualquiera existencia item hash exists $a->{$b}
Array Array arrays son idénticos[*]
Array Regex filtrado array grep /$b/, @$a
Array Número array contiene número grep $_ == $b, @$a
Array Cualquiera array contiene string grep $_ eq $b, @$a
Cualquiera undef indefinido !defined $a
Cualquiera Regex búsqueda del patrón $a =~ /$b/
Código() Código() resultados son iguales $a->() eq $b->()
Cualquiera Código() simple closure truth $b->() # ignoring $a
Número valor[!] igualdad numérica $a == $b
Cualquiera string igualdad de cadena $a eq $b
Cualquiera Número igualdad numérica $a == $b
Cualquiera Cualquiera igualdad de cadena $a eq $b
+ - debe ser una referencia a un código cuyo prototipo (si está presente) no sea ""
(sub con un prototipo "" son tratados en la entrada 'Código()' que está más abajo).
* - es decir, cada elemento coincide con el elemento del mismo índice en el otro
array. Si aparece una referencia circular, volvemos a la igualdad referencial.
! - Cualquier cosa, sea un número real o un string que parezca un número.