My favorite way of doing this is to use
Filter::Handle.
The following snippet that should do what you want (that is, send all STDERR output to an array called @errors).
#!/use/bin/perl
use strict;
use warnings;
use Filter::Handle qw(subs);
my @errors; #global to hold the output of STDERR
sub filter_errors
{
#sub for Filter::Handle
#copies everything sent to STDERR to global @errors
#and then sends it on to STDERR
local $_ = "@_";
push @errors, $_;
$_;
}
#set up the filtering with Filter::Handle
Filter \*STDERR, \&filter_errors;
#test it
print "Hello world\n";
print STDERR "This is my first error\n";
print "Goodbye world\n";
print STDERR "This is my second and final error\n";
UnFilter \*STDERR; #unfilter the output now that we're done
if (@errors)
{
print "I got the following errors:\n";
print " $_" foreach (@errors);
}