2011-12-12 11 views
9

Devo davvero saperlo, ma ho lavorato principalmente con Linux, Mac OS X e Windows che utilizzano tutti la barra (/) come separatore di directory (Windows può utilizzare sia \ o /.) .Separatori di directory di gestione Perl

Ciò significa che quando normalmente scrivo programmi in Perl, posso semplicemente usare / come separatore di directory e tutto va bene. Tuttavia, so che File::Spec suppone di consentire la portabilità di separatori di file (qualunque cosa ciò significhi).

Se sono su un sistema che non utilizza le barre in avanti come separatore di directory, capisco che gli utenti si aspettano di poter inserire file con i separatori predefiniti e vedere l'output con i separatori predefiniti. (Ad esempio, un utente Windows inserirà e si aspetta che l'output sia C:\Users\smith\Documents e non C:/Users/smith/Documents), ma cosa fa Perl internamente?

Posso, nonostante ciò che la piattaforma può utilizzare come separatore di directory, semplicemente utilizzare le barre in avanti quando ho a che fare con i file internamente. Ad esempio, ho una directory $dir e un file chiamato $file e voglio aprire il file. Posso semplicemente dire $dir/file o devo usare File::Spec per concatenare il nome per me?

In effetti, i programmi Perl richiedono barre in avanti nei nomi delle directory? Sto scrivendo un modulo e fornirò i nomi dei file al programma chiamante. Devo dare il file come /foo/bar/fubar o se il sistema utilizza due punti come il primo sistema operativo Macintosh, ad esempio :foo:bar:fubar?

+3

cosa hai intenzione di fare con i percorsi? Se è per leggere e scrivere su file, allora '/' va bene, e perl farà ciò che intendi. Se stai creando comandi da analizzare dalla shell dei comandi del computer host o da altri programmi su quel sistema, allora dovrai rispettare le regole per quella piattaforma e File :: Spec può aiutarti. –

risposta

7

perlport dice quasi tutto quello che c'è da dire su questo argomento. Detto questo, i sistemi che non possono accettare / come separatore di percorso sono rari e potresti non avere molto da guadagnare dall'uso di File::Spec fedelmente ovunque. Ma fai anche attenzione a distinguere gli usi interni ed esterni del separatore di directory. Ad esempio, questo funzionerà su Windows:

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

ma questo non potrebbe, perché ha bisogno di essere elaborati dalla shell di Windows:

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

Grazie per il collegamento a Perlport. Ho imparato qualcosa su 'unlink' e VMS che era piuttosto interessante. Il mio programma sta restituendo nomi di file/directory a un programma chiamante, quindi non sono troppo preoccupato per i nomi esterni, ma potrei aggiungere l'opzione. –

Problemi correlati