q[<] es el operador de entrecomillado. Es lo mismo que escribir '<', lo que pasa es que es más ostentoso y gordo, para llamar la atención
if ($_ !~ /^#/) es la forma larga de escribir
if (!/^#/), que, hace años, hubiéramos escrito como
unless (/^#/), pero que no es recomendable usar (pero sí legal).
La variable $_ es la llamada "por defecto". Es la que usarán las primitivas del lenguaje en caso de que no usemos ninguna otra.
Así, si decimos
print;, en realidad estaremos haciendo
print $_;La expresión regular
/^#/ quiere decir: "Un
# al comienzo de la línea (
^)", que es justo lo que buscamos.
De esa forma,
if (! /^#/) se refiere a "si la línea no comienza por '#', haz ...".
Finalmente:
my @fichero = grep { ! /^#/ } <$fichero>;Lo que ocurre es que leemos del $fichero todas las líneas (estamos en contexto de lista por efecto del grep). Cada línea llega a grep(), que lo hace pasar por la expresión que está entre llaves. Como es una expresión regular, comprueba si la línea (que reside en $_ aunque no la veamos), coincide con el patrón "iniciar con #". Al resultado de eso, lo niega, por efecto del '!', por lo que en realidad buscamos por líneas que NO empiecen por '#'. Si la línea sale del grep con un aprobado, es ingresada en @fichero. Sino, es descartada. grep() sirve para hacer filtrado de listas de valores.
Queda más corto decir: "quiero guardar en el arreglo @fichero todas las líneas que cumplan con la condición 'no empiezan por #', provenientes del $fichero que estoy leyendo".