我的任务是理解和调试用Perl 5编写的一些遗留代码。注释不是很好,而且我对该语言几乎没有经验(我是一个Python人;一些shell脚本经验)。基本上,我需要理解它,这样我就可以决定用Python重写它是否值得,以便与我们的其他代码库相匹配,并且对那些不熟悉Perl不太明显的语法的人来说(至少是对没有问题的.),我需要更好地理解它。或者只是保持原样,尽我们最大的努力在必要的时候做一些小的改变,尽管对正在发生的事情有一个不完全的理解。
在我们组织的内部脚本语言(用于与我们的专有硬件交互)中,Perl被调用来处理脚本中的一些数据。用专有脚本语言编写的部分类似于sent脚本,因为发送到解释器的每一行都将在日志中编写,因此,虽然不像在现代IDE中调试Python那样容易,但是可以通过检查日志来了解发生了什么。但是perl作为一种编程语言,只打印/记录您告诉它的内容。所以现在,这是个黑匣子。
我查看了Perl文档,发现有一个命令行选项可以启动调试器-d,以及配置调试器行为的-Dtls (这些是“监视perl如何执行程序”的推荐选项)。但是当我尝试在脚本中运行它时,我得到了following...warning吗?错误?
用-DDEBUGGING重新编译perl以使用-D开关(您的意思是-d吗?)
因为它是在专有脚本langauge脚本中调用的,如果这个调试器只是一个交互的shell,我认为它不适合这个目的(因为我不能在专有脚本langauge脚本运行时发送东西到stdin )。但是,如果不是交互式的,在服务器上添加第二个perl安装以进行调试并不是不可能的,所以如果有人对此调试器模式和选项有经验的话,我希望得到一些反馈。
我非常熟悉Python,所以我知道很多技巧来记录一切,或者设置一个调试环境来使用VS代码调试器,但是对于Perl,我已经超出了我的舒适范围。
我的问题是:是否有某种简单的方式(标志或其他什么)来调用Perl,即发送给解释器的每个命令都以与shell脚本相同的方式写入控制台/stdout/或日志文件?或者还有另外一种很好的方法来调试perl脚本(除了使用交互式调试shell)?或者,我没有更好的选择,而不是花时间浏览这个相当庞大的脚本,并把打印声明到处发表吗?
谢谢你阅读了一个冗长的问题。
发布于 2022-07-30 19:14:55
在执行每个语句时,您可以非交互地使用Perl调试器打印它们。下面是一个示例:假设您有一个Perl脚本p.pl
,例如:
use feature qw(say);
use strict;
use warnings;
$DB::trace=1; # <-- turn on AutoTrace from this point..
{
my $bar = "xyz";
$bar =~ s/y//;
say "bar = $bar";
func1();
}
sub func1 {
for (1..3) {
say "1 : $_";
func2($_);
}
say "Done 1";
}
sub func2 {
my $x = shift;
my $bar = $x ** 2;
say "2: $bar";
}
然后像这样执行p.pl
:
$ PERLDB_OPTS="NonStop=1 AutoTrace=0" perl -d p.pl
main::(p.pl:7): my $bar = "xyz";
main::(p.pl:7): my $bar = "xyz";
main::(p.pl:8): $bar =~ s/y//;
main::(p.pl:9): say "bar = $bar";
bar = xz
main::(p.pl:10): func1();
main::func1(p.pl:14): for (1..3) {
main::func1(p.pl:15): say "1 : $_";
1 : 1
main::func1(p.pl:16): func2($_);
main::func2(p.pl:22): my $x = shift;
main::func2(p.pl:23): my $bar = $x ** 2;
main::func2(p.pl:24): say "2: $bar";
2: 1
main::func1(p.pl:15): say "1 : $_";
1 : 2
main::func1(p.pl:16): func2($_);
main::func2(p.pl:22): my $x = shift;
main::func2(p.pl:23): my $bar = $x ** 2;
main::func2(p.pl:24): say "2: $bar";
2: 4
main::func1(p.pl:15): say "1 : $_";
1 : 3
main::func1(p.pl:16): func2($_);
main::func2(p.pl:22): my $x = shift;
main::func2(p.pl:23): my $bar = $x ** 2;
main::func2(p.pl:24): say "2: $bar";
2: 9
main::func1(p.pl:18): say "Done 1";
Done 1
发布于 2022-08-01 22:27:44
您可以在Perl脚本中使用bash -x ...
模块模拟Devel::DumpTrace
。
#!/usr/bin/perl
# demo.pl: a demonstration of Devel::DumpTrace
$a = 1;
$b = 3;
$c = 2 * $a + 7 * $b;
@d = ($a, $b, $c + $b);
$ perl -d:DumpTrace demo.pl
>>>>> demo.pl:3: $a:1 = 1;
>>>>> demo.pl:4: $b:3 = 3;
>>>>> demo.pl:5: $c:23 = 2 * $a:1 + 7 * $b:3;
>>>>> demo.pl:6: @d:(1,3,26) = ($a:1, $b:3, $c:23 + $b:3);
有一些设置可以产生更多或更少的输出,还有一些方法只为代码中有趣的部分打开跟踪。如果您也安装了PPI
,那么它的工作效果最好,但是没有PPI,它也能工作。
对于较轻的重量,并可能已经安装在您的系统,也请参阅Devel::Trace
。
https://stackoverflow.com/questions/73164359
复制相似问题