¿Por qué reinventar la rueda? Utilice el módulo File::Basename:
use File::Basename;
...
$file = basename($path);
¿Por qué no funciona $file=$path=~s/.*\///;
?
=~
tiene mayor precedence que =
Así
$file = $path =~s/.*\///;
se trata como:
$file = ($path =~s/.*\///);
que hace la sustitución en $path
y asigna ya sea 1
(si se produce la sustitución) o ''
(si no ocurre reemplazo).
Lo que queremos es:
($file = $path) =~s/.*\///;
que asigna el valor de $path
a $file
y luego se hace la sustitución en $path
.
Pero de nuevo hay muchos problemas con esta solución:
es incorrecto. Un nombre de archivo en sistemas basados en Unix (no estoy seguro acerca de Windows) puede contener nueva línea. Pero .
de forma predeterminada no coincide con una nueva línea. Por lo que usted tiene que utilizar un modificador s
de manera que coincida con .
nueva línea así:
($file = $path) =~s/.*\///s;
más importante es que no es portátil, ya que está asumiendo /
es el separador de ruta que no es el caso de algunas plataformas como Windows (que usa \
), Mac (que usa :
). Entonces use el módulo y deje que maneje todos estos problemas por usted.
acuerdo. Generalmente es mejor usar un módulo como este que una expresión regular, ya que es multiplataforma. – justintime
También tenga en cuenta que File :: Basename es un módulo básico, y siempre ha estado en Perl 5 por lo que no necesita ser instalado. – mscha
La página de manual sobre File :: Basename recomienda utilizar el método 'fileparse' para esta tarea, ya que" [basename] NO siempre devuelve la parte del nombre de archivo de una ruta como cabría esperar " – jutky