2009-09-04 39 views
6

Có cách nào dễ dàng để nói perl "bây giờ bỏ qua tất cả mọi thứ được in"?Làm thế nào tôi có thể tạm thời dừng STDOUT trong một chương trình Perl?

Tôi phải gọi thủ tục trong mô-đun Perl bên ngoài, nhưng quy trình in nhiều thông tin không cần thiết (tất cả thông qua tiêu chuẩn in).

Tôi biết chọn thể được sử dụng để chuyển hướng nó bằng cách nào đó, nhưng tôi không phải là quá khôn ngoan từ việc đọc perldoc trên đó.

chỉnh sửa: Tôi tìm thấy câu trả lời sớm hơn, nhưng tôi sẽ bổ sung thêm một ví dụ để làm cho nó rõ ràng hơn (nhưng không nhiều Tôi đoán)

use TectoMT::Scenario; 
use TectoMT::Document; 

sub tagDocuments { 
    my @documents = @_; 

    my $scenario = TectoMT::Scenario->new({'blocks'=> [ qw(
      SCzechW_to_SCzechM::Sentence_segmentation 
      SCzechW_to_SCzechM::Tokenize 
      SCzechW_to_SCzechM::TagHajic 
      SCzechM_to_SCzechN::Czech_named_ent_SVM_recognizer) ]}); 

    $scenario->apply_on_tmt_documents(@documents); 
    return @documents; 
} 

TectoMT :: Kịch bản và tài liệu TectoMT :: là những đối ngoại module

+0

Hãy thử điều này: mở STDOUT, ">/dev/null"; không chắc chắn những gì sẽ xảy ra ... – Havenard

+0

Bạn gọi những mô-đun đó như thế nào? Bạn có thể cung cấp một số mã hoặc một số ví dụ? –

+0

Peter: trough một cuộc gọi tiêu chuẩn :) Tôi sẽ thêm một ví dụ cụ thể anyway, tôi tìm thấy một câu trả lời sớm hơn. Tôi sẽ đăng nó như là câu trả lời cho câu hỏi của riêng tôi. –

Trả lời

12

câu trả lời của riêng tôi:

use IO::Null; 

print "does print."; 

my $null = IO::Null; 
my $oldfh = select($null); 

print "does not print."; 

select($oldfh); 

print "does print."; 
+0

Đây là cách tôi làm. –

+3

Điều này không làm việc để chuyển hướng đầu ra của một tiến trình con được gọi là với 'hệ thống'. – Flimm

+0

Bạn không nên có một '-> mới' sau' my $ null = IO :: Null'? Có vẻ như nó chỉ hoạt động tốt, nhưng tôi không hiểu ... – Chad

1
open my $saveout, ">&STDOUT"; 
open STDOUT, '>', "/dev/null"; 

(do your other stuff here) 

open STDOUT, ">&", $saveout; 
+2

vấn đề với điều này là tôi muốn mã được nhiều nền tảng và không phải tất cả các hệ thống có/dev/null. May mắn thay, có IO :: Null để cứu tôi. –

+0

Bạn có thể muốn đề cập đến yêu cầu đó trong câu hỏi –

+0

IO: Null không ảnh hưởng đến các chương trình được gọi bên ngoài. nhưng bạn có thể sử dụng phương pháp trên cho hệ thống được hỗ trợ (perl có thể phát hiện OS), và IO: Null không được hỗ trợ. Bạn có thể bao gồm nó bằng chức năng của riêng bạn sẽ tự động chọn phương pháp đúng. Chú ý, không chỉ STDOUT là vấn đề, cùng một vấn đề là với STDERR, sau đó bạn nên chuyển hướng cả hai dòng. – Znik

1

Nếu bạn chỉ muốn sử dụng các mô-đun trong thư viện chuẩn, File::Spec có chức năng devnull(). Nó trả về một chuỗi đại diện cho thiết bị null ("/dev/null" trên * nix) mà bạn có thể có thể mở bằng open().

6

Tôi nhận thấy rằng điều này đã được trả lời, nhưng tôi nghĩ rằng nó đáng để biết về một phương pháp thay thế để làm điều này. Đặc biệt là nếu có điều gì là địa ngục-cong trên in để STDOUT ...

# Store anything written to STDOUT in a string. 
my $str; 
open my $fh, '>', \$str; 
{ 
    local *STDOUT = $fh; 
    code_that_prints_to_stdout(); 
} 

Các bit quan trọng là local *STDOUT. Nó thay thế số STDOUT bình thường bằng một tập hồ sơ theo lựa chọn của bạn, nhưng chỉ cho phạm vi của khối có chứa local.

+2

Điều này không làm việc để chuyển hướng đầu ra của một tiến trình con được gọi là với 'hệ thống'. – Flimm

6

Đề cập đến một số câu trả lời ở đây và về các chủ đề khác, tôi đã đưa ra điều này;

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

sub my_functor { system("some_noisy_command.exe", "--option1", "--option2"); } 
silently(\&my_functor); 

đâu "âm thầm()" mất một functor và chạy nó với stdout chuyển hướng:

sub silently($) { 
    #Turn off STDOUT 
    open my $saveout, ">&STDOUT"; 
    open STDOUT, '>', File::Spec->devnull(); 

    #Run passed function 
    my $func = $_[0]; 
    $func->(); 

    #Restore STDOUT 
    open STDOUT, ">&", $saveout; 
} 
+0

(Phản hồi được đánh giá cao - Perl novice) – RJFalconer

+2

Điều này làm việc với 'hệ thống', không giống như các câu trả lời khác! – Flimm

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