要诊断或调试我的Perl代码,我想轻松地显示变量名称及其值。在 if abs(destination - origin) <= 180:
return (destination - origin)
else:
degrees = 360 - abs(destination - origin)
if destination < 180:
return degrees
else:
return -degrees
中,键入以下内容:
bash
在#!/bin/bash
dog=pitbull
declare -p dog
中,考虑以下脚本perl
:
junk.pl
如果我们调用此脚本,我们将获得
#!/usr/bin/perl
use strict; use warnings;
my $dog="pitbull";
my $diagnosticstring;
print STDERR "dog=$dog\n";
sub checkvariable {
foreach $diagnosticstring (@_) { print "nameofdiagnosticstring=$diagnosticstring\n"; }
}
checkvariable "$dog";
但是,相反,当调用子例程bash> junk.pl
dog=pitbull
nameofdiagnosticstring=pitbull
bash>
时,我希望打印以下内容:
checkvariable
这将使编码更容易且更不容易出错,因为不必两次键入变量名称。
答案 0 :(得分:3)
您可以使用PadWalker做类似的事情(需要从CPAN安装)。但这几乎肯定比您想要的复杂得多。
#!/usr/bin/perl
use strict;
use warnings;
use PadWalker 'peek_my';
my $dog="pitbull";
print STDERR "dog=$dog\n";
sub checkvariable {
my $h = peek_my(0);
foreach (@_) {
print '$', $_,'=', ${$h->{'$'. $_}}, "\n";
}
}
checkvariable "dog";
答案 1 :(得分:3)
Data::Dumper::Names可能就是您想要的。
#! perl
use strict;
use warnings;
use Data::Dumper::Names;
my $dog = 'pitbull';
my $cat = 'lynx';
my @mice = qw(jumping brown field);
checkvariable($dog, $cat, \@mice);
sub checkvariable {
print Dumper @_;
}
1;
输出:
perl test.pl
$dog = 'pitbull';
$cat = 'lynx';
@mice = (
'jumping',
'brown',
'field'
);
答案 2 :(得分:2)
(不是答案,是带格式的注释)
checkvariable子项仅接收一个值,并且没有(简单或可靠)的方法来找出什么变量持有该值。
这就是为什么Data :: Dumper强制您将varnames指定为字符串的原因:
perl -MData::Dumper -E '
my $x = 42;
my $y = "x";
say Data::Dumper->Dump([$x, $y]);
say Data::Dumper->Dump([$x, $y], [qw/x y/])
'
$VAR1 = 42;
$VAR2 = 'x';
$x = 42;
$y = 'x';
答案 3 :(得分:0)
通常有以下帮助
use strict;
use warnings;
use Data::Dumper;
my $debug = 1;
my $container = 20;
my %hash = ( 'a' => 7, 'b' => 2, 'c' => 0 );
my @array = [ 1, 7, 9, 8, 21, 16, 37, 42];
debug('container',$container) if $debug;
debug('%hash', \%hash) if $debug;
debug('@array', @array) if $debug;
sub debug {
my $name = shift;
my $value = shift;
print "DEBUG: $name [ARRAY]\n", Dumper($value) if ref $value eq 'ARRAY';
print "DEBUG: $name [HASH]\n", Dumper($value) if ref $value eq 'HASH';
print "DEBUG: $name = $value\n" if ref $value eq '';
}
但是为什么不在内置调试器下运行perl脚本呢?选项 -d