2011-12-12 12 views
9

que realmente debería saber esto, pero he trabajado principalmente con Linux, Mac OS X y Windows, que todo el uso de la barra diagonal (/) como separador de directorio (Windows pueden usar ya sea \ o /.) .Perl Handling Directorio Separadores

Eso significa que cuando normalmente escribo programas en Perl, simplemente puedo usar / como el separador de directorios y todo está bien. Sin embargo, sé que File::Spec se supone que permite la portabilidad de los separadores de archivos (lo que sea que eso signifique).

Si estoy en un sistema que no usa barras diagonales como separador de directorios, entiendo que los usuarios esperan poder ingresar archivos con los separadores predeterminados y ver la salida con los separadores predeterminados. (Por ejemplo, un usuario de Windows ingresará y espera que la salida sea C:\Users\smith\Documents y no C:/Users/smith/Documents), pero ¿qué hace Perl internamente?

¿Puedo, a pesar de lo que la plataforma puede utilizar como separador de directorio, basta con utilizar barras diagonales cuando estoy tratando con archivos internamente. Por ejemplo, tengo un directorio $dir y un archivo llamado $file, y quiero abrir el archivo. ¿Puedo simplemente decir $dir/file, o tengo que usar File::Spec para obtener el nombre para mí?

De hecho, ¿los programas Perl requieren barras diagonales en los nombres de directorios? Estoy escribiendo un módulo y entregaré los nombres de los archivos al programa de llamadas. ¿Debo dar el archivo como /foo/bar/fubar o si el sistema usa dos puntos como el sistema operativo Macintosh anterior, diga :foo:bar:fubar?

+3

¿Qué vas a hacer con los caminos? Si es para leer y escribir en archivos, entonces '/' está bien, y perl hará lo que usted quiera decir. Si está elaborando comandos para ser analizados por el shell de comandos de la computadora host o por otros programas en ese sistema, entonces deberá obedecer las reglas para esa plataforma, y ​​File :: Spec puede ayudar. –

Respuesta

7

perlport dice casi todo lo que hay que decir acerca de este tema. Dicho esto, los sistemas que no pueden aceptar / como el separador de ruta son raros, y es posible que no tenga mucho que ganar al usar File::Spec fielmente en todas partes. Pero también tenga cuidado de distinguir los usos internos y externos del separador de directorios. Por ejemplo, esto va a funcionar en Windows:

open my $fh, '<', 'C:/some/directory/to/some/file'; 

pero esto no podría, porque tiene que ser procesado por el shell de Windows:

system("C:/some/program.exe C:/some/program/argument.txt"); 
+0

Gracias por el enlace a Perlport. Aprendí algo acerca de 'unlink' y VMS que fue bastante interesante. Mi programa devuelve los nombres de archivos/directorios a un programa de llamadas, por lo que no estoy demasiado preocupado por los nombres externos, pero podría agregar la opción. –