我正在尝试编写一个可以接受所有参数并将其打印为与输入时完全相同的字符串的函数。

例如,使用以下功能:

test('arg1' => $arg1, 'arg2' => $arg2);

我想在格式化为 EXACTLY 的函数中获取以下字符串,如下所示:
"'arg1' => $arg1, 'arg2' => $arg2"

我想这样做,所以我可以按照调试/测试目的输入所有参数的方式打印所有参数。

最佳答案

Perl提供了特殊的debugging hooks,可让您查看已编译源文件的原始行。您可以编写一个自定义调试器,该调试器在每次调用子例程时都会打印原始行。

以下内容使您可以指定一个或多个要匹配的子例程;每次调用匹配的子例程时,都会打印相应的行。

package Devel::ShowCalls;

our %targets;

sub import {
    my $self = shift;

    for (@_) {
        # Prepend 'main::' for names without a package specifier
        $_ = "main::$_" unless /::/;
        $targets{$_} = 1;
    }
}

package DB;

sub DB {
    ($package, $file, $line) = caller;
}

sub sub {
    print ">> $file:$line: ",
          ${ $main::{"_<$file"} }[$line] if $Devel::ShowCalls::targets{$sub};
    &$sub;
}

1;

在以下程序中跟踪fooBaz::qux函数的调用:
sub foo {}
sub bar {}
sub Baz::qux {}

foo(now => time);
bar rand;
Baz::qux( qw/unicorn pony waffles/ );

跑:

$ perl -d:ShowCalls=foo,Baz::qux myscript.pl
>> myscript.pl:5: foo(now => time);
>> myscript.pl:7: Baz::qux( qw/unicorn pony waffles/ );

请注意,这只会打印调用的第一行,因此不适用于诸如
foo( bar,
     baz );

10-08 13:20