2010-07-08 28 views
11

Sau đây (không phải là rất Perl-ish) mãLàm thế nào để bạn kiểm tra sự thành công của mở (tập tin) trong Perl?

#!/usr/bin/perl 

if (! -e "mydir/") 
{ 
    print "directory doesn't exist.\n"; 
} 
open (my $fh, ">", "mydir/file.txt"); 
if ($fh) 
{ 
    print "file opened.\n"; 
    print $fh; 
    print $fh "some text\n" or die "failed to write to file.\n"; 
    close ($fh); 
} 
else 
{ 
    print "failed to open file.\n"; 
} 

sẽ cho kết quả như thế này

directory doesn't exist. 
file opened. 
failed to write to file. 
GLOB(0x...some-hex-digits...) 

Tại sao $ fh không tương đương với giả sau cuộc gọi mở? Vì mydir/ không tồn tại, tôi hy vọng nỗ lực mở tệp sẽ không thành công.

Tôi nhận được kết quả tương tự nếu thư mục và tệp tồn tại nhưng tệp chỉ đọc.

Tôi đã thử điều này với Perl 5.10.1 trên Windows 7 x64 và với Perl 5.10.0 trên Fedora-11 Linux.

Tôi đoán kiểm tra xử lý tệp của tôi là sai. Tôi đã cố gắng Google mà không gặp may. Tôi hy vọng nó là một cái gì đó hiển nhiên, nhưng bất kỳ gợi ý hoặc liên kết sẽ được nhiều đánh giá cao.

Xin cảm ơn, Rob.

Trả lời

18

$fh không được đặt thành giá trị bằng 0, nó đang được đặt thành GLOB khi mã của bạn hiển thị. Điều này khác với những gì open lợi nhuận đó là lý do các thành ngữ là

open(...) or die ... ; 

hoặc

unless(open(...)) { 
    ... 
} 
9

Từ perldoc:

mở trả khác không thành công, giá trị không xác định khác.

An thường dùng thành ngữ là

open my $fh, '<', $filename or die $!; 

Tất nhiên bạn có thể làm điều gì đó khác hơn là chỉ đơn giản là die.

+0

Mẹo bổ sung: sử dụng 'perldoc -f open' để được trợ giúp về chức năng tích hợp Perl. – dolmen

13

open trả về giá trị khác không thành công và giá trị "sai" trên lỗi. Các thành ngữ bạn đang tìm kiếm là

if (open my $fh, '>', $file) { 
    # open was successful 
} else { 
    # open failed - handle error 
} 

Nếu đối số đầu tiên ($fh) là undefined (vì nó là trong trường hợp này), open sẽ khởi tạo nó để một số giá trị tùy ý (xem Symbol::genysm method) trước nó cố gắng để mở tệp. Vì vậy, $fh sẽ luôn luôn là "true" ngay cả khi cuộc gọi open không thành công.

8

Ngoài các giải thích trong câu trả lời khác:

Kiểm tra các mô-đun autodie mà đi kèm với perl 5.10.1 trở lên (và có sẵn riêng biệt với CPAN).

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