Lo que estás viendo es una asignación, así que primero se evalúa la expresión regular sobre la variable $fichero, y el resultado se deja en $nombre. Hasta ahí, lo has entendido.
Ahora bien... una expresión regular se puede ejecutar en contexto escalar o en contexto lista.
Si lo ejecutamos en contexto escalar, lo que devuelve es, efectivamente, un valor booleano indicando si se encontró el patrón o no. Y en contexto lista, nos devolverá la lista de valores que han sido capturados por los paréntesis de captura, dentro de la expresión regular. En nuestro caso, sí que hay esos paréntesis:
(.+), que capturan el nombre del fichero, sin la extensión rar.
En Perl, siempre hay que prestar atención al contexto en que estamos ejecutando las sentencias.
Examen: ¿cuál es la salida del siguiente programa?
Using perl Syntax Highlighting
#!/usr/bin/perl
my $nombre1;
my $nombre2;
my $fichero = "fichero.rar";
$nombre1 = $fichero =~ /^(.+)\.rar$/i;
($nombre2) = $fichero =~ /^(.+)\.rar$/i;
print "[$nombre1][$nombre2]\n";
Coloreado en 0.005 segundos, usando
GeSHi 1.0.8.4
Antes de ejecutarlo, intenta resolverlo mentalmente.
Fíjate que las líneas son las mismas, pero la segunda tiene un par de paréntesis en el lado de la asignación. Son justamente, esos paréntesis, los que indican que estamos ejecutando la sentencia en contexto lista.
En Perl, algunas cosas son muy poco importantes, como el espacio en blanco, pero en otras, hay que prestar atención a los detalles.
Más información en
perlop, en la sección
Regexp Quote-Like Operators, subsección
Matching in list context.