gpt4 book ai didi

Perl 在运行时每次调用时打印出所有 subs 参数

转载 作者:行者123 更新时间:2023-12-05 00:41:58 25 4
gpt4 key购买 nike

我正在寻找方法来调试打印来自命名空间 Myapp::* 的每个子例程调用(例如,不转储 CPAN 模块),但是不需要编辑每个 .pm 手动文件 用于插入一些模块或打印语句。

我刚刚学习(最好说:试图理解)package DB,是什么允许我跟踪执行(使用 shebang #!/usr/bin/perl -d:我的踪迹)

package DB;
use 5.010;

sub DB {
my( $package, $file, $line ) = caller;
my $code = \@{"::_<$file"};
print STDERR "--> $file $line $code->[$line]";
}

#sub sub {
# print STDERR "$sub\n";
# &$sub;
#}

1;

并寻找一种方法如何使用 sub 调用从 Myapp::* sub 的实际参数.

或者这里有一些更简单(通用)的方法

  • 结合执行行-tracer DB::DB
  • 每个子例程调用参数的转储(及其返回值,如果可能)?

最佳答案

我不知道从这个词的任何理智意义上来说它是否算作“更简单”,但是您可以遍历符号表并将所有函数包装在打印其参数和返回值的代码中.这是一个如何完成的示例:

#!/usr/bin/env perl

use 5.14.2;
use warnings;

package Foo;

sub first {
my ( $m, $n ) = @_;

return $m+$n;
}

sub second {
my ( $m, $n ) = @_;

return $m*$n;
}

package main;

no warnings 'redefine';

for my $k (keys %{$::{'Foo::'}}) {
my $orig = *{$::{'Foo::'}{$k}}{CODE};
$::{'Foo::'}{$k} = sub {
say "Args: @_";
unless (wantarray) {
my $r = $orig->(@_);
say "Scalar return: $r";
return $r;
}
else {
my @r = $orig->(@_);
say "List return: @r";
return @r
}
}
}

say Foo::first(2,3);
say Foo::second(4,6);

关于Perl 在运行时每次调用时打印出所有 subs 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com