Devel::Trace is handy. Just do this:
perl -d:Trace some_prog.pl 2>logfile
And in another terminal, tail -f logfile.
That let's me run an interactive program in one window and watch the program execution flow in another. However, this shows everything and you may get overwhelmed with detail. So I hacked it:
package Devel::Trace; $VERSION = '0.10'; $TRACE = 1; $REGEX = qr//; # This is the important part. The rest is just fluff. sub DB::DB { return unless $TRACE; my ( $p, $f, $l ) = caller; my $code = \@{"::_<$f"}; my $line = ">> $f:$l: $code->[$l]"; print STDERR $line if $line =~ $REGEX; } sub import { my $package = shift; while ( defined( $_ = shift @_ ) ) { if ( $_ eq 'trace' ) { my $caller = caller; *{ $caller . '::trace' } = \&{ $package . '::trace' }; } elsif ( $_ eq 'match' ) { my $regex = shift; $REGEX = qr/$regex/; } else { use Carp; croak "Package $package does not export `$_'; aborting"; } } } my %tracearg = ( 'on' => 1, 'off' => 0 ); sub trace { my $arg = shift; $arg = $tracearg{$arg} while exists $tracearg{$arg}; $TRACE = $arg; } 1;
That's "not ready for prime time", but now I can do this:
perl -d:Trace=match,some_regex some_prog.pl 2>logfile
And only lines which match the regex are printed. That's handy if you want to limit it to a particular package. It's not perfect, but it was a good enough hack to let me see a nasty execution flow error that I was having trouble following in the debugger (the debugger can be a right pain to use with interactive programs).