अद्यतन: IMHO, इस सवाल का सही जवाब Test::Output उपयोग करने के लिए होना चाहिए:
#!/usr/bin/perl
use strict; use warnings;
use Test::More tests => 1;
use Test::Output;
sub myfunc { print "This is a test\n" }
stdout_is(\&myfunc, "This is a test\n", 'myfunc() returns test output');
आउटपुट:
C:\Temp> tm
1..1
ok 1 - myfunc() returns test output
मैं के रूप में संदर्भ के लिए मूल जवाब जा रहा हूँ, मुझे विश्वास है, यह अभी भी एक उपयोगी तकनीक दिखाता है।
आप STDOUT
स्थानीय बनाना और समारोह कॉल करने से पहले एक अदिश को फिर से खोलना कर सकते हैं, बाद में बहाल:
#!/usr/bin/perl
use strict; use warnings;
use Test::More tests => 1;
sub myfunc { print "This is a test\n" }
sub invoke {
my $sub = shift;
my $stdout;
{
local *STDOUT;
open STDOUT, '>', \$stdout
or die "Cannot open STDOUT to a scalar: $!";
$sub->(@_);
close STDOUT
or die "Cannot close redirected STDOUT: $!";
}
return $stdout;
}
chomp(my $ret = invoke(\&myfunc));
ok($ret eq "This is a test", "myfunc() prints test string");
diag("myfunc() printed '$ret'");
आउटपुट:
C:\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'
5,8 से अधिक उम्र के perl
के संस्करणों के लिए, आप शायद उपयोग करने की आवश्यकता IO::Scalar, लेकिन मुझे 5.8 से पहले काम करने के तरीके के बारे में बहुत कुछ पता नहीं है।
स्रोत
2009-10-08 14:46:34
बस जब मुझे लगता है कि मैं SO पर बहुत अधिक समय बर्बाद कर रहा हूं, तो मैं कुछ अच्छा सीखता हूं! धन्यवाद। – FMc
ठीक है, तकनीकी रूप से वे नहीं करते हैं, लेकिन यह सुनिश्चित करते समय यह अच्छा है। : पी (+1, यह एक अद्भुत मॉड्यूल है) –
मैंने इसे कम नहीं किया, लेकिन मुझे लगता है कि मूल जवाब नौकरी पाने के लिए बहुत अधिक काम करता है। यह बहुत जटिल है। मैं टेस्ट :: आउटपुट की तरफ थोड़ा पक्षपातपूर्ण हूं, लेकिन मैं इसे अंतिम उपाय के रूप में उपयोग करता हूं। उपयोगिता के लिए –