كيف يمكنني قمع stdout مؤقتًا في برنامج Perl؟

StackOverflow https://stackoverflow.com/questions/1376607

  •  21-09-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة سهلة لإخبار بيرل "تجاهل الآن كل ما هو مطبوع"؟

لا بد لي من الاتصال بإجراء في وحدة بيرل خارجية ، لكن الإجراء يطبع الكثير من المعلومات غير الضرورية (كل ذلك من خلال المعيار مطبعة).

أنا أعرف تحديد يمكن استخدامه لإعادة توجيهه بطريقة أو بأخرى ، لكنني لست حكيماً من القراءة بيرلوك عليه.

تعديل: لقد وجدت الإجابة عاجلاً ، لكنني سأضيف مثالًا لجعله أكثر وضوحًا (ولكن ليس كثيرًا أعتقد)

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 :: السيناريو و Tectomt :: الوثيقة هي تلك الوحدات الخارجية

هل كانت مفيدة؟

المحلول

إجابتي الخاصة:

use IO::Null;

print "does print.";

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

print "does not print.";

select($oldfh);

print "does print.";

نصائح أخرى

أدرك أن هذا قد تمت الإجابة عليه ، لكنني أعتقد أن الأمر يستحق معرفة طريقة بديلة للقيام بذلك. خاصة إذا كان هناك شيء ما عازم بالطباعة 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. يحل محل العادي STDOUT مع fileHandle من اختيارك ، ولكن فقط لنطاق الكتلة التي تحتوي على محلي.

بالإشارة إلى بعض الإجابات هنا وعلى خيوط أخرى ، توصلت إلى هذا ؛

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

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

حيث "صمت ()" يأخذ functor ويديره مع إعادة توجيه 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;
}
open my $saveout, ">&STDOUT";
open STDOUT, '>', "/dev/null";

(do your other stuff here)

open STDOUT, ">&", $saveout;

إذا كنت ترغب في استخدام وحدات فقط في المكتبة القياسية ، File::Spec لديه devnull() وظيفة. يعيد سلسلة تمثل الجهاز الفارغ ("/dev/null" على *nix) التي من المفترض أن تفتح مع open().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top