UPDATE : Selon moi, la bonne réponse à cette question devrait être l'utilisation de 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');
Sortie :
C:\\Temp> tm
1..1
ok 1 - myfunc() returns test output
Je laisse la réponse originale à titre de référence, car je pense qu'elle illustre toujours une technique utile. .
Vous pouvez localiser STDOUT
et rouvrir à un scalaire avant d'appeler la fonction, restaurer après :
#!/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'");
Sortie :
C:\\Temp> tm
1..1
ok 1 - myfunc() prints test string
# myfunc() printed 'This is a test'
Pour les versions de perl
plus ancienne que la version 5.8, vous devrez probablement utiliser l'option IO::Scalar mais je ne sais pas grand chose de la façon dont les choses fonctionnaient avant la version 5.8.