2012-04-27 8 views
7

После установки каталога:относительный абсолютный путь PERL

/dira/dirb 
/dira/dirb/myprog.pl 

/dira/dirb/testa/myfilesdir содержит следующие файлы

/dira/dirb/testa/myfilesdir/file1.txt 
/dira/dirb/testa/myfilesdir/file2.txt 

Текущий каталог:

/dir/dirb 

./myprog.pl -p testa/myfilesdir 

Цикл через файлы

while (my $file_to_proc = readdir(DIR)) { 
... 

$file_to_proc = file1.txt 
$file_to_proc = file2.txt 

что я хочу

$myfile = /dira/dirb/testa/myfilesdir/file1.txt 
$myfile = /dira/dirb/testa/myfilesdir/file2.txt 

Пробовал несколько другой модуль Perl (УХО rel2abs), но она использует текущий каталог. Я не могу использовать текущий каталог, потому что вход может быть относительным или абсолютным путем.

ответ

9

Использовать модуль File::Spec. Вот пример:

use warnings; 
use strict; 
use File::Spec; 

for (@ARGV) { 
    chomp; 
    if (-f $_) { 
     printf qq[%s\n], File::Spec->rel2abs($_); 
    } 
} 

Выполнить это нравится:

perl script.pl mydir/* 

И он будет печатать абсолютные пути файлов.


ОБНОВЛЕНО с более эффективной программой. Благодаря Предложения TLP.

use warnings; 
use strict; 
use File::Spec; 

for (@ARGV) { 
    if (-f) { 
     print File::Spec->rel2abs($_), "\n"; 
    } 
} 
+1

'chomp' кажется излишним здесь. '-f' будет проверять' $ _', если аргумент опущен, что также делает '$ _' избыточным. Я хотел бы далее утверждать, что это избыточное использование 'printf'. – TLP

+0

@TLP: Спасибо. Я обновил ответ с вашими предложениями. Намного лучше, но я оставил оригинальную программу. – Birei

+0

Добро пожаловать. – TLP

Смежные вопросы