10年前に書かれたまま、更新してないとかじゃねーの。

例えば、
>local *CATCHOUT = IO::File->new_tmpfile;
>local *CATCHERR = IO::File->new_tmpfile;
>my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "cmd");

IO::File->new_tmpfile が「ファイルハンドルを返すもの」と理解してれば、
今の時代にこんな書き方はしない。

se IPC::Open3;
use IO::File ;
use Symbol qw(gensym) ;
my @cmd = qw( ls ) ;
my $tmpout = IO::File->new_tmpfile;
my $tmperr = IO::File->new_tmpfile;
my $pid = open3 gensym, $tmpout, $tmperr, @cmd ;
waitpid $pid, 0 ;
print while <$tmpout>;