IPC::Open3::open3 handles its third argument in an special way. If you pass undef there it will send the child STDERR stream to the same handler as STDOUT.
Use non-lexical filehandles or preinitialize $err. From the module SYNOPSIS:
use Symbol 'gensym';
$err = gensym;
$pid = open3($wtr, $rdr, $err,
'some cmd and args', 'optarg', ...);