如何在Perl中找到print语句的源位置?

Mat*_*son 9 perl

如何在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)


rpk*_*lly 8

使用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)


Sin*_*nür 5

我知道源过滤器对某些东西很有用:

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)