我想跟踪我的Perl脚本,但只包含代码main,并将输出重定向到文件.
使用perl -d script.pl它启动脚本时会进入交互模式.
我试过了
perl -d:Trace perl_05.pl 2&> output.log
Run Code Online (Sandbox Code Playgroud)
但是这也跟踪了我不想要的所有子程序和模块.
我正在寻找类似bash set -o xtrace或者的东西sh -x.
跟踪您的Perl程序的文章解决了您对跟踪数量的关注,并向您展示了调整输出的方法,以便您只需跟踪您想要的内容.
您可以创建自己的一次性模块来准确追踪您想要的内容.由于当前目录通常已经存在
@INC,您可以创建一个Devel/MyTrace.pm.
完全读取它以查看作者如何修改跟踪函数的默认行为,首先将跟踪输出到文件,然后输出到STDERR,最后将输出限制为仅跟踪主文件.
您可以更进一步排除除主文件之外的所有代码:
Run Code Online (Sandbox Code Playgroud)use v5.10; use autodie; BEGIN { my $trace_file = $ENV{TRACE_FILE} // "mytrace.$$"; print STDERR "Saving trace to $trace_file\n"; my $fh = do { if( $trace_file eq '-' ) { \*STDOUT } elsif( $trace_file eq 'STDERR' ) { \*STDERR } else { open my $fh, '>>', $trace_file; $fh; } }; sub DB::DB { my( $package, $file, $line ) = caller; return unless $file eq $0; my $code = \@{"::_<$file"}; print $fh "[@{[time]}] $file $l $code->[$line]"; } } 1;
最后一段代码是特别有趣的代码.它完全符合你的要求.
使用perl Devel::DumpTrace非常类似于使用bash -x.比如bash -x,Devel::DumpTrace扩展和输出变量值,让您了解您的脚本正在做什么,而不仅仅是它在做什么.
它还具有您正在寻找的功能:启用和禁用特定包上的跟踪.对于您的用例,您可以运行它
perl -d:DumpTrace=-.*,+main my_script.pl
Run Code Online (Sandbox Code Playgroud)
要么
perl -d:DumpTrace=-.* my_script.pl
Run Code Online (Sandbox Code Playgroud)
-.*表示"排除所有与/^.*$/跟踪匹配的包",也就是说,所有包.+main表示"包括main跟踪包".
默认输出可能相当冗长.如果您希望输出少于此值,则可以指定quiet模式:
perl -d:DumpTrace=quiet,-.*,+main my_script.pl
Run Code Online (Sandbox Code Playgroud)
(我是作者Devel::DumpTrace)
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |