ОБНОВЛЕНИЕ: ИМХО, правильный ответ на этот вопрос следует использовать 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'
Для версий perl
старше 5.8 вам, вероятно, нужно использовать IO :: Scalar , но я не очень разбираюсь в том, как все работало до 5.8.