2011-08-14 15 views
5

Tôi đang làm việc trong chương trình mà người dùng có thể chuyển tùy chọn -o file và đầu ra sẽ được chuyển hướng đến tệp đó. Nếu không, nó sẽ đi đến stdout.Mở filehandle hoặc gán stdout

Để truy xuất tùy chọn tôi đang sử dụng mô-đun getopt lâu và đó không phải là vấn đề. Vấn đề là tôi muốn tạo một tập tin xử lý với tập tin đó hoặc gán stdout cho nó nếu tùy chọn không được thiết lập.

if ($opt) { 
    open OUTPUT, ">", $file; 
} else { 
    open OUTPUT, # ??? 
} 

Đó là bởi vì cách này, sau đó trong mã của tôi, tôi có thể chỉ:

print OUTPUT "..."; 

Nếu không có lo lắng nếu OUTPUT là stdout hoặc một tập tin người dùng xác định. Điều này có thể không? Nếu tôi đang làm một thiết kế tồi ở đây, xin vui lòng cho tôi biết.

+0

Liên quan: http://stackoverflow.com/q/6296536#6296773 – daxim

Trả lời

7

Đây sẽ là một ví dụ điển hình về cách sử dụng select.

use strict; 
use warnings; 
use autodie; 

my $fh; 
if ($opt) { 
    open $fh, '>', $file; 
    select $fh; 
} 

print "This goes to the file if $opt is defined, otherwise to STDOUT." 
+1

Rất tốt TLP, cảm ơn rất nhiều. Vẫn còn nhiều điều tôi cần phải tìm hiểu về Perl ... Tuy nhiên, tôi không chắc liệu điều này có hiệu quả bên trong một 'while (<>)', nó không phải là trường hợp của tôi mà chỉ nghĩ về nó. Reopening stdout có vẻ là một lựa chọn tốt hơn trong những trường hợp này, xem xét tôi sẽ phải nhãn in ấn anyway. – cmre

+0

@cmre Ồ, bạn đã chỉnh sửa nhận xét của mình. Vâng, điều này sẽ làm việc cũng như mở lại STDOUT. 'print STDOUT" foo "' về cơ bản giống như 'print" foo "', vì vậy bạn không cần phải chỉ định tệp tin tay. Tôi không hoàn toàn chắc chắn mối quan tâm của bạn là gì, nhưng bạn nên sử dụng giải pháp mà bạn cảm thấy thoải mái. – TLP

+0

Vâng, chỉ cần chỉnh sửa nó, xin lỗi. Mối quan tâm là "in" một cái gì đó "' bên trong một 'while (<>) {...}' sẽ xuất nó vào tập tin được chọn, phải không? Hoặc có thể không, tôi chỉ mới bắt đầu với Perl và bây giờ nó trở nên thực sự khó hiểu: P – cmre

4

Xem tài liệu open. Cách dễ nhất là tự mở lại chính mình STDOUT và không sử dụng tập tin tay trong mã của bạn.

if ($opt) { 
    open(STDOUT, ">", $file); 
} 
... 

print "this goes to $file or STDOUT\n"; 

(Thêm một số kiểm tra lỗi của khóa học.)

+0

Cảm ơn Mat, dễ dàng hơn rất nhiều. – cmre

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