Generally in a case like this I use either BEGIN blocks or fully-qualified names, whichever seems appropriate. In this case the latter seems a better fit:
#!/usr/bin/env perl
use strict;
use warnings;
my ( $stdout, $stderr, $errcode );
if (eval { require Capture::Tiny } ) {
print "Using Capture::Tiny\n";
( $stdout, $stderr, $errcode ) = Capture::Tiny::capture( sub {
system "echo Hello, World | cat";
} )
}
elsif (eval { require IPC::Run } ) {
print "Using IPC::Run\n";
no warnings qw{ qw }; # Otherwise Perl complains about the comm
+a
IPC::Run::run(
[ qw{ echo Hello, World } ],
\'',
'|',
[ 'cat' ],
\$stdout, \$stderr );
}
print "STDOUT: $stdout";