2012-04-27 49 views
7

Tiếp theo thiết lập thư mục:đường dẫn tuyệt đối tương đối perl

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

/dira/dirb/testa/myfilesdir Chứa các file sau

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

dir hiện tại:

/dir/dirb 

./myprog.pl -p testa/myfilesdir 

Cycle qua file

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

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

những gì tôi muốn là

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

Cố gắng một vài mô-đun perl khác nhau (rel2abs CWD) nhưng nó được sử dụng thư mục hiện hành. Tôi không thể sử dụng thư mục hiện tại vì đầu vào có thể là đường dẫn tương đối hoặc tuyệt đối.

Trả lời

9

Sử dụng mô-đun File::Spec. Ở đây một ví dụ:

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

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

Run nó thích:

perl script.pl mydir/* 

Và nó sẽ in đường dẫn tuyệt đối của file.


CẬP NHẬT với chương trình hiệu quả hơn. Nhờ các đề xuất của TLP.

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

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

'chomp' có vẻ dư thừa ở đây. '-f' sẽ kiểm tra' $ _' nếu đối số bị bỏ qua, điều này cũng làm cho '$ _' dư thừa. Tôi sẽ tiếp tục cho rằng đây là việc sử dụng dự phòng 'printf'. – TLP

+0

@TLP: Cảm ơn bạn. Tôi đã cập nhật câu trả lời với các đề xuất của bạn. Bây giờ tốt hơn nhiều nhưng tôi đã rời khỏi chương trình gốc – Birei

+0

Bạn được chào đón. – TLP

Các vấn đề liên quan