La variable $_
La variable $_ es la variable por defecto en perl, cuando no se indica ninguna otra variable:
- al procesar un array en un bucle while o foreach
- cuando se evalúa una expresión regular
- en numerosas funciones que admiten uno o varios argumentos de entrada
Así, por ejemplo, podemos escribir un script que lee líneas de standard input y las descompone en palabras de la siguiente forma:
while (<>) {
if (/prueba/) {
foreach (split('s')) {
print; print "n";
}
}
}
Perl utiliza la variable $_ allí donde se requiere una variable, y no se ha utilizado ninguna explícitamente, de modo que el código del ejemplo es equivalente al código extendido:
while (defined($_ = <>)) {
if ($_ =~ /prueba/) {
foreach $_ (split('s',$_)) {
print $_; print "n";
}
}
}
Como vemos, se ha utilizado implícitamente la variable $_:
- En el bucle while
- En la evaluación de la expresión regular
- En la sentencia split
- En el bucle foreach
- En la sentencia print
La variable @_
Esta variable contiene los argumentos que se le han pasado a una subrutina. Por ejemplo:
sub mi_funcion {
my $n = @_;
for (my $i = 0; $i < $n; $i++) {
print "argumento " . ($i+1) . ": " . @_[$i] . "n";
}
}
mi_funcion ("primero","segundo", "ultimo");
Al ejecutar este código, obtenemos como resultado:
argumento 1: primero argumento 2: segundo argumento 3: ultimo
En el ejemplo podemos también ver en la sentencia “my $n = @_;” que al asignar a una variable escalar un array, el valor que se le asigna es el número de elementos del array. Se puede hacer más explicita esta conversión escribiendo la sentencia como “my $n = scalar @_;”
Las variables $a y $b
Estas variables son las que utiliza implicitamente la función sort.
El siguiente código utiliza la función sort para imprimir alfabéticamente una lista de valores:
my @valores = ("Barcelona","Zaragoza","Madrid","Alicante","Bilbao");
foreach (sort @valores){
print $_ . "n";
}
Con el siguiente resultado:
Alicante Barcelona Bilbao Madrid Zaragoza
Pero si queremos ordenar los valores por el número de caracteres, podemos escribir:
my @valores = ("Barcelona","Zaragoza","Madrid","Alicante","Bilbao");
foreach (sort {length($a) <=> length($b)} @valores){
print $_ . "n";
}
Y obtendremos:
Madrid Bilbao Zaragoza Alicante Barcelona
Para determinar el orden de dos elementos del array, la función sort asigna sus valores a las variables $a y $b. La función que definamos entre llaves {…} puede referenciar dichas variables para implementar cualquier criterio de ordenación que se desee.
—