print STDERR join("\x1E", @list),"\x1E\n";
This gives me an output with visible record separators (ASCII 0x1E is actuall "Record Separator") quite cleanly, and I use STDERR to avoid bufferring. Default buffering of STDOUT has bitten my debug routines a few times.
If I'm working a large project, I use my own little module that exports a number of debugging "tools", including this:
sub dbg {
return unless $DEBUG;
my $dump = 0;
($dump = 1 && shift) if ($_[0] eq ':DUMP:');
$LOGFILE = open_logfile();
foreach my $item (@_) {
$str = (($dump && ref $item) ? Dumper($item) : $item)."\x1E\n
+";
print $LOGFILE POSIX::strftime("%Y%m%d:%H.%M.%S\x1E",localtime
+).$str if defined $LOGFILE;
print STDERR $str unless $QUIET;
}
}
The open_logfile sub returns an opened file handle, or opens a new one if need be, to "DEBUG.LOG". Debug items are written to STDERR unless I set $QUIET, and they are always written to the logfile, prepended by a timestamp.
And, of course, if I unset $DEBUG, then it's basically a no-op.
Run the following with 'you stupid foo' as arguments:
#!/usr/bin/perl
use Private::Debug 'dbg';
$Private::Debug::DEBUG = 1;
$Private::Debug::QUIET = 0;
dbg("Hello there", "You fool");
dbg(':DUMP:', "ARGV:", \@ARGV);
Results in
#DEBUG.LOG
20041214:17.58.22▲Hello there▲
20041214:17.58.22▲You fool▲
20041214:17.58.22▲ARGV:▲
20041214:17.58.22▲$VAR1 = [
'you',
'stupid',
'foo'
];
▲
#STDERR
Hello there▲
You fool▲
ARGV:▲
$VAR1 = [
'you',
'stupid',
'foo'
];
▲
It works quite well. The '?' you might see actually shows up as an upward triangle in a terminal, so it is very clear.
radiantmatrix
require General::Disclaimer;
s//2fde04abe76c036c9074586c1/; while(m/(.)/g){print substr(' ,JPacehklnorstu',hex($1),1)}
|