Si no usamos
/e entonces lo que ocurre con la parte derecha de la expresión regular es una simple interpolación de cadena de caracteres, así que es lo mismo que escribirlo entre comillas dobles.
Y la interpolación, además de sacar los valores de las variables, pueden hacer otras cosas.
Una de ellas es el arcano "@{[ ]}"
Se comenta en un par de sitios, en toda la documentación Perl. Una de ellas es en la explicación de la función scalar, dentro de perlfunc (perldoc -f scalar). Y otra es en perlfaq4, en la pregunta
How can I expand variables in text strings? (¿Cómo pueda expandir variables en cadenas de texto?)
Dice:
«El "/e" también ignorará silenciosamente violaciones de strict, reemplazando nombres de variables indefinidas con la cadena vacía. Ya que estoy usando la bandera "/e" (¡incluso dos veces!), tengo los mismos problemas de seguridad que tengo con "eval" en su formato de cadena. Si hay algo malo en $foo, quizás algo como "@{[ system "rm -rf /" ]}", entonces me encontraría en problemas».
El funcionamiento es el siguiente: como Perl encuentra un '@', sabe que lo que sigue es un
array, así que debe interpolarlo.
Lo que sigue son unas llaves, así que Perl sabe que lo que debe haber dentro es una referencia que debe convertir a
array, por la presencia de la arroba anterior.
Y lo que hay dentro de las llaves sí que es una referencia: son unos corchetes, así que nos encontramos con un
array anónimo. Dentro de él, como en cualquier otro
array, debe haber una lista de elementos.
Y la lista de elementos, es solo uno. Y como en cualquier otra línea de Perl, cada elemento se evalúa como si fuera una expresión, así que en nuestro caso, incrementamos una variable. Mejor dicho: es un post-incremento, así que primero nos quedamos con el valor de la variable y luego la incrementamos.
Finalmente, se hace el proceso inverso: el valor de la variable se convierte en elemento de un
array anónimo, que es desferenciado con las llaves y la arroba, con lo que el resultado neto es... el propio valor de la variable.
En cuanto a la siguiente pregunta, quizás lo resuelvas con un simple sort. Algo así.
Using perl Syntax Highlighting
opendir(my $DIR, $imageDir);
my @figs = sort readdir $DIR;
closedir $DIR;
for my $fig (@figs) {
if ($fig =~ /(?<fig>$name-fig-)(?<num>\d+)$ext/) {
# split con GS
print "Creando $imageDir/$name-fig-$+{num}.pdf\n";
system ("gs -q -sDEVICE=pdfwrite -dFirstPage=$+{num} -dLastPage=$+{num} -o $imageDir/$+{fig}$+{num}.pdf $imageDir/$name-fig.pdf");
# PNG format
if ($png) {
system("gs -q -sDEVICE=pngalpha -r$DPI $opt_gs_raw -o $imageDir/$+{fig}$+{num}.png $imageDir/$+{fig}$+{num}.pdf");
}
}
} #for
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4