2009-03-31 14 views
9

Attualmente, la mia uscita Perl è hard-coded per scaricare nella seguente directory UNIX:Come posso creare una directory se non ne esiste una con Perl?

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

Il nome del file è costruito come tale:

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

Ho bisogno di un approccio simile alla costruzione di directory UNIX, ma è necessario verificare se esistono prima di crearli.

BONUS EXTRA CREDIT WIN:
Numerazione automatica (revisioni) del $ stat_file in modo che quando questi file vengono pompati nella stessa directory, non sovrascrivano o aggiungono file esistenti nella directory. (Non so se questo problema è stato ancora messo in campo sul S.O. - scusate se un re-post)

risposta

13

utilizzare l'operatore -d e File::Path.

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

make_path ha un vantaggio rispetto mkdir in quanto può creare alberi di profondità arbitraria.

E utilizzare -e per controllare il file esiste

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

Controllare $ @ non è affidabile. Usa eval {mkpath ($ dir); 1} o fai {warn "badness \ n"}. Vedi http://search.cpan.org/dist/Acme-ExceptionEater/lib/Acme/ExceptionEater.pm per un esempio del perché il controllo $ @ è sbagliato. – daotoad

+0

A partire dalla v2.09 (2013-01) sembra che ora sia make_path – kyle

15

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

Non sembra davvero una buona idea incorporare domande "extra" come quella.

+0

Sono d'accordo, ma ho pensato che sono un buon pacchetto per sapere quando si cerca di fare questo genere di cose. – CheeseConQueso

+0

Derp. Non avrei dovuto cercare su Google. – primo

2

Perl ha una funzione built-in mkdir

Date un'occhiata a perlfunc perldoc o il programma mkdir da Perl Power Tools.

Credo che sia sicuro creare una directory già esistente, dare un'occhiata ai documenti.

3

Ricordare che la directory -d esistenza non significa -w scrivibile. Ma supponendo che ti trovi in ​​un'area personale, lo mkdir($dir) unless(-d $dir) funzionerebbe correttamente.

Problemi correlati