كيف يمكنني قمع stdout مؤقتًا في برنامج Perl؟
-
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()
.