2009-03-31 38 views
9

Hiện nay, sản lượng Perl của tôi được mã hóa cứng để đổ vào thư mục sau UNIX:Làm cách nào để tạo thư mục nếu thư mục không tồn tại bằng Perl?

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

Các tên tập tin được xây dựng như vậy:

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

Tôi cần một cách tiếp cận tương tự để xây dựng thư mục UNIX, nhưng cần phải kiểm tra xem chúng có tồn tại trước khi tạo chúng không.

TÍN DỤNG TÍN DỤNG THƯỞNG THƯỞNG:
Tự động đánh số (sửa đổi) của $ stat_file để khi các tệp này được bơm vào cùng thư mục, chúng không ghi đè hoặc nối thêm vào tệp hiện có trong thư mục. (Tôi không biết câu hỏi này đã được điền vào S.O. - xin lỗi nếu một bài đăng lại)

Trả lời

13

Sử dụng toán tử -dFile::Path.

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

make_path có lợi thế hơn mkdir ở chỗ nó có thể tạo ra cây có chiều sâu tùy ý.

Và sử dụng -e để kiểm tra tập tin tồn tại

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

Kiểm tra $ @ là không đáng tin cậy. Sử dụng eval {mkpath ($ dir); 1} hoặc làm {warn "badness \ n"}. Xem http://search.cpan.org/dist/Acme-ExceptionEater/lib/Acme/ExceptionEater.pm để biết ví dụ về lý do tại sao việc kiểm tra $ @ là xấu. – daotoad

+0

Kể từ v2.09 (2013-01), có vẻ như bây giờ make_path là – kyle

15

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

Có vẻ như không có ý tưởng hay để nhúng các câu hỏi 'phụ' như thế.

+0

Tôi đồng ý, nhưng hình dung rằng họ là một thỏa thuận trọn gói tốt để biết khi nào cố gắng thực hiện loại công cụ này. – CheeseConQueso

+0

Derp. Tôi không cần phải có google đó. – primo

2

Perl có một built-in chức năng mkdir

Hãy xem perlfunc perldoc hoặc chương trình mkdir từ Perl Power Tools.

Tôi tin rằng việc tạo thư mục đã tồn tại là an toàn, hãy xem tài liệu.

3

Hãy nhớ rằng sự tồn tại -d của thư mục không có nghĩa là -w có thể ghi. Nhưng giả sử bạn đang ở trong một khu vực cá nhân, mkdir($dir) unless(-d $dir) sẽ hoạt động tốt.

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