2009-03-31 19 views
9

Actualmente, mi salida de Perl no es modificable para volcar en el siguiente directorio de UNIX:¿Cómo puedo crear un directorio si no existe uno usando Perl?

my $stat_dir = "/home/courses/".**NEED DIR VAR HERE**; 

El nombre del archivo se construye como tal:

$stat_file = $stat_dir . "/".$sess.substr($yr, 2, 2)."_COURSES.csv"; 

Necesito un enfoque similar a la construcción de directorios UNIX, pero es necesario verificar si existen primero antes de crearlos.

BONO CRÉDITO DE CRÉDITO ADICIONAL:
numeración automática (revisiones) de $ stat_file para que cuando estos archivos se bombeen al mismo directorio, no sobrescriban o anexen a archivos existentes en el directorio. (No sé si esta pregunta se ha enviado aún en S.O. - lo siento si es una nueva publicación)

Respuesta

13

Utilice el operador -d y File::Path.

use File::Path qw(make_path); 
eval { make_path($dir) }; 
if ([email protected]) { 
    print "Couldn't create $dir: [email protected]"; 
} 

make_path tiene una ventaja sobre mkdir en que puede crear árboles de profundidad arbitraria.

Y el uso de -e para comprobar el archivo existe

my $fileSuffix = 0; 
while (-e $filename) { 
    $filename = $filePrefix . ++$fileSuffix . $fileExtension; 
} 
+1

Verificar $ @ no es confiable. Use eval {mkpath ($ dir); 1} o {advierte "maldad \ n"}. Consulte http://search.cpan.org/dist/Acme-ExceptionEater/lib/Acme/ExceptionEater.pm para ver un ejemplo de por qué revisar $ @ es malo. – daotoad

+0

A partir de la v2.09 (2013-01) parece que ahora es make_path – kyle

15

ERM ... mkdir $stat_dir unless -d $stat_dir?

Realmente no parece una buena idea incluir preguntas "extra" como esa.

+0

Estoy de acuerdo, pero pensé que son un buen paquete para saber al tratar de hacer este tipo de cosas. – CheeseConQueso

+0

Derp. No debería haber tenido que googlear eso. – primo

2

Perl tiene una función incorporada en mkdir

Tome un vistazo a perlfunc perldoc o el programa mkdir de Perl Power Tools.

Creo que es seguro crear un directorio que ya existe, eche un vistazo a los documentos.

3

Recuerde que la existencia del -d no significa -w writeable. Pero suponiendo que estés en un área personal, el mkdir($dir) unless(-d $dir) funcionaría bien.

Cuestiones relacionadas