2013-04-17 35 views
6

Tôi đang có một kịch bản perl mở ra một tập tin và viết một số dữ liệu trong đó. Đôi khi tệp này chỉ có quyền đọc trên một số máy. Đối với những trường hợp như vậy, hiện tại tập lệnh chết vì nó không thể mở tệp. Yêu cầu của tôi là trong trường hợp này, tôi muốn kịch bản của tôi tiếp tục và thay vì viết nội dung trong tệp, đặt nó trong STDOUT. Tôi sẽ sử dụng warn thay vì chết, nhưng tôi muốn biết tôi có thể bí danh xử lý tệp của mình FILE1 đến STDOUT sao cho tôi không cần phải sửa đổi mã còn lại, lý do trong mã thực tế của tôi print FILE1 <> có mặt ở nhiều nơi và không có thể cho tôi đặt các điều kiện if\else ở mọi nơi. Tôi muốn rằng tôi sẽ bí danh FILE1 đến STDOUT sao cho lệnh in sẽ xuất ra trong STDOUT hoặc ghi vào tệp tùy thuộc vào giá trị được đặt trong FILE1 tệp có tay. Có thể sử dụng perl?Bí danh tập tin xử lý để STDOUT trong perl

$file = "testfile.txt"; 
open(FILE1, ">> $file") or die "Can not read file $file: $! \n"; 
print FILE1 "Line1 \n"; 
print FILE1 "Line2 \n"; 
print FILE1 "Line3 \n"; 
print FILE1 "Line4 \n"; 
close FILE1 
+0

có thể trùng lặp của http://stackoverflow.com/questions/3807231/how-can- i-test-if-i-can-write-to-a-filehandle – devnull

Trả lời

13

Bạn có thể làm như vậy với *FILE1 = STDOUT;.

Các biến có * ở phía trước được gọi là typeglobs. Đọc về chúng here.

Bạn cũng có thể muốn bắt đầu sử dụng lexical file handles

Đây là cách tôi sẽ giải quyết vấn đề của bạn:

use strict; 
use warnings; 

my $file = "testfile.txt"; 
my $succ = open(my $fh , '>>', $file); 

$fh = *STDOUT unless $succ; 

print $fh "Line1 \n"; 
print $fh "Line2 \n"; 
print $fh "Line3 \n"; 
print $fh "Line4 \n"; 

close $fh if $succ; # don't close STDOUT 
+0

Tôi chỉ cần thêm mã này sau câu lệnh mở của tôi và nó hoạt động. Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể kiểm tra xem filehandle có được mở thành công hay không. Ngay bây giờ ngay cả khi các tập tin có thể truy cập, nó chỉ là in văn bản trong STDOUT và không trong tập tin. – sarbjit

+2

'mở (FILE1," >> $ file ") hoặc * FILE1 = STDOUT;' sẽ là một cách rất đơn giản. –

+0

@ dan1111 làm thế nào bạn sẽ phân biệt một FILE1 trỏ đến $ tập tin từ FILE1 trỏ đến STDOUT? Tôi tự hỏi vì việc đóng STDOUT có thể không phải là một ý tưởng hay. – tauli

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