Consider the following short script: use strict; use warnings; use DBI;
my $h = DBI->connect( 'dbi:Pg:dbname=mytestdb', 'anonymous', '', ); # close( STDERR ); # open( STDERR, '>', \my $stderr ); warn 'before'; $h->prepare( 'CREATE TEMPORARY TABLE tmp ( i serial )' )->execute(); warn 'after'; $h->disconnect; # print ">>\n$stderr<<\n"; __END__ The output I get from it looks like this: before at test_script.pl line 10. NOTICE: CREATE TABLE will create implicit sequence "tmp_i_seq" for serial column " tmp.i" after at test_script.pl line 12. The output looks exactly the same if I pipe the command's standard output to /dev/null ( i.e. what we're seeing was sent to standard error). Now, if I uncomment the commented lines, the output looks like this: >> before at script/test.pl line 10. after at script/test.pl line 12. << So, even though the messages given explicitly to warn in the script were faithfully appended to the scalar $stderr, as intended, the notice from Pg (about the implicitly created sequence) is gone: it shows up neither on the screen, nor in the scalar $stderr. How can I trap such notices? Thanks! tlm P.S. It is tempting to blame the closing of STDERR for this problem, but this a mandatory step. Without it, $stderr receives no output at all.
