代码之家  ›  专栏  ›  技术社区  ›  Karel Bílek

如何在Perl程序中临时抑制stdout?

  •  6
  • Karel Bílek  · 技术社区  · 17 年前

    有什么简单的方法可以告诉Perl“现在忽略所有打印的内容”?

    我必须在外部Perl模块中调用一个过程,但该过程会打印许多不必要的信息(全部通过标准 打印 )

    我知道 选择 可以用来改变方向,但我不太明智 珀尔多克 关于它。

    编辑 :我很快就找到了答案,但我会添加一个例子使其更清晰(但我想不会有太多)。

    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::Scenario和Tectomt::Document是这些外部模块

    5 回复  |  直到 13 年前
        1
  •  12
  •   Karel Bílek    17 年前

    我自己的答案:

    use IO::Null;
    
    print "does print.";
    
    my $null = IO::Null;
    my $oldfh = select($null); 
    
    print "does not print.";
    
    select($oldfh);
    
    print "does print.";
    
        2
  •  6
  •   Dominic Mitchell    17 年前

    我知道这个问题已经得到了解决,但我认为有必要知道另一种解决方法。特别是如果有什么东西是地狱般地致力于印刷 STDOUT 艾斯

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

    关键位是 local *STDOUT . 它取代了正常的 标准输出 使用您选择的文件句柄,但仅限于包含 local .

        3
  •  6
  •   RJFalconer    13 年前

    在这里和其他一些线索上,我提到了一些答案;

    use strict;
    use warnings;
    use File::Spec;
    
    sub my_functor { system("some_noisy_command.exe", "--option1", "--option2"); }
    silently(\&my_functor);
    

    其中“silently()”接受一个函数并在stdout重定向的情况下运行它:

    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;
    }
    
        4
  •  1
  •   bmb    17 年前
    open my $saveout, ">&STDOUT";
    open STDOUT, '>', "/dev/null";
    
    (do your other stuff here)
    
    open STDOUT, ">&", $saveout;
    
        5
  •  1
  •   Chris Lutz    17 年前

    如果只想使用标准库中的模块, File::Spec devnull() 功能。它返回一个表示空设备的字符串( "/dev/null" 你大概可以用 open() .

    推荐文章