2010-08-18 13 views
14
$a = '/etc/init/tree/errrocodr/a.txt' 

que desea extraer /etc/init/tree/errrocodr/ a $dir y a.txt a $file. ¿Cómo puedo hacer eso?¿Cómo puedo separar una ruta completa en directorio y nombre de archivo?

(Nota del editor: la pregunta original presume que se necesitaba una expresión regular para eso.)

+0

¿Ya no hizo esta pregunta en http://stackoverflow.com/questions/3511214/how-to-support-the-searching-file-based-on-regular-expression? Debe editar su pregunta original para aclararla, en lugar de publicar una nueva. – Ether

+0

@Ether, esa es una pregunta totalmente diferente, preguntando cómo obtener una lista de archivos basados ​​en un comodín. Este es más cómo dividir una sola especificación de archivos en sus partes. – paxdiablo

Respuesta

24

Sólo tiene que utilizar Basename:

use File::Basename; 
$fullspec = "/etc/init/tree/errrocodr/a.txt"; 

my($file, $dir, $ext) = fileparse($fullspec); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n\n"; 

my($file, $dir, $ext) = fileparse($fullspec, qr/\.[^.]*/); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n"; 

Esto se puede ver la devolución de los resultados requeridos, pero es también es capaz de capturar las extensiones (en la última sección anterior):

Directory: /etc/init/tree/errrocodr/ 
File:  a.txt 
Suffix: 

Directory: /etc/init/tree/errrocodr/ 
File:  a 
Suffix: .txt 
+2

O, alternativamente, eche un vistazo a File :: Spec-> splitpath(), que también separa el volumen (si usted está en una plataforma que tiene tal cosa). La ventaja de cualquier paquete es que son estándar y portátiles. –

16

no necesita una expresión regular para esto, puede utilizar dirname():

use File::Basename; 
my $dir = dirname($a) 

sin embargo, esta expresión regular funcionará:

my $dir = $a 
$dir =~ s/(.*)\/.*$/$1/ 
+0

+1, pero en mi humilde opinión no debería usar la variable '$ a' en su ejemplo, incluso si el OP lo hizo por error. Se usa para 'sort' – dawg

0

Por ejemplo:

$a =~ m#^(.*?)([^/]*)$#; 
    ($dir,$file) = ($1,$2); 

Pero, como otras sa id, es mejor usar Basename para esto.

Y, por cierto, mejor evitar $a y $b como nombres de variables, ya que tienen un significado especial, para la función sort.

1

Creo que una solución de expresiones regulares es una necesidad perfectamente legítima, ya que mi búsqueda de Google me trajo aquí. Quiero extraer un nombre de archivo en un grupo que es parte de una expresión de coincidencia más grande - aquí está mi intento:

~> echo "https://stackoverflow.com/a/b/c/d" | perl -ne '/(?<dir>\/(\w+\/)*)(?<file>\w+)/ && print "dir $+{dir} file $+{file}\n";' 
dir /a/b/c/ file d 
0

prueba esto; funciona al menos para el nombre de archivo, pero cuando lo modifica, también le da la dirección: También puede modificarlo en UNIX-systems para el \ en lugar si/o para usarlos con |

$ filename = ~ s /(^.*/)//g;

de alguna manera la barra invertida antes de la segunda/no se muestra ...

1

Uso @array = split("/", $a); y luego $array[-1] es su nombre de archivo.

Cuestiones relacionadas