如何在Perl中找到print语句的源位置?
#!/usr/bin/perl
foo();
bar();
sub foo {
print "foo\n";
}
sub bar {
print "bar\n";
}
Run Code Online (Sandbox Code Playgroud)
输出是:
>perl test.pl
foo
bar
Run Code Online (Sandbox Code Playgroud)
我想以某种方式找到能够看到(或类似的东西)
>perl test.pl
main::foo> foo
main::bar> bar
Run Code Online (Sandbox Code Playgroud)
原因是我试图追踪一些胭脂输出,并且无法在大型代码库中找到它的位置.
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";
Run Code Online (Sandbox Code Playgroud)
这使:
$ perl tp.pl
main, tp.pl, 10 :: Hello, World
Run Code Online (Sandbox Code Playgroud)
更新:我刚刚发布了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?
Run Code Online (Sandbox Code Playgroud)
使用Debug :: Trace(https://metacpan.org/pod/Debug :::Trace )
#!/usr/bin/perl
foo();
bar();
sub foo {
print "foo\n";
}
sub bar {
print "bar\n";
}
Run Code Online (Sandbox Code Playgroud)
这个程序保存为test.pl并称为:
perl -MDebug::Trace=foo,bar test.pl
Run Code Online (Sandbox Code Playgroud)
打印出来:
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
Run Code Online (Sandbox Code Playgroud)
我知道源过滤器对某些东西很有用:
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();
Run Code Online (Sandbox Code Playgroud)
这是输出:
C:\Temp> perl -MDebugPrint t.pl
print called from: main::test(t.pl:13)
print in test
Run Code Online (Sandbox Code Playgroud)