如何在Perl中找到print语句的源位置?
#!/usr/bin/perl
foo();
bar();
sub foo {
  print "foo\n";
}
sub bar {
  print "bar\n";
}
输出是:
>perl test.pl 
foo
bar
我想以某种方式找到能够看到(或类似的东西)
>perl test.pl 
main::foo> foo
main::bar> bar
原因是我试图追踪一些胭脂输出,并且无法在大型代码库中找到它的位置.
hex*_*ten 15
试试这个:
#!/usr/bin/env perl
use strict;
use warnings;
use Tie::STDOUT print => sub {
  my ( $pkg, $file, $line ) = caller(2);
  print "$pkg, $file, $line :: ", @_;
};
print "Hello, World\n";
这使:
$ perl tp.pl
main, tp.pl, 10 :: Hello, World
更新:我刚刚发布了Devel :: Ditto:
$ perl -MDevel::Ditto myprog.pl
[main, t/myprog.pl, 9] This is regular text
[main, t/myprog.pl, 10] This is a warning
[MyPrinter, t/lib/MyPrinter.pm, 7] Hello, World
[MyPrinter, t/lib/MyPrinter.pm, 8] Whappen?
使用Debug :: Trace(https://metacpan.org/pod/Debug :::Trace )
#!/usr/bin/perl
foo();
bar();
sub foo {
  print "foo\n";
}
sub bar {
  print "bar\n";
}
这个程序保存为test.pl并称为:
perl -MDebug::Trace=foo,bar test.pl
打印出来:
TRACE:  main::foo() called at test.pl line 3 package main
foo
TRACE:  main::foo() returned
TRACE:  main::bar() called at test.pl line 4 package main
bar
TRACE:  main::bar() returned
我知道源过滤器对某些东西很有用:
C:\Temp> cat DebugFilter.pm
package DebugFilter;
use strict;
use warnings;
use Filter::Simple;
FILTER_ONLY
    code_no_comments => sub {
        s/print/main::mydebugfn();print/g
    };
1;
__END__
C:\Temp> cat DebugPrint.pm
package DebugPrint;
use strict;
use warnings;
use base qw( Exporter );
our @EXPORT = qw( mydebugfn );
sub mydebugfn {
    my ( $pkg, $fn, $line, $sub ) = caller(2);
    warn "print called from: ${sub}(${fn}:${line})\n";
}
1;
__END__
C:\Temp> cat t.pl
#!/usr/bin/perl
use strict;
use warnings;
use DebugFilter;
sub test {
    print STDOUT "print in test\n";
    return;
}
test();
这是输出:
C:\Temp> perl -MDebugPrint t.pl
print called from: main::test(t.pl:13)
print in test