我有几个嵌套的数据结构,它们引用彼此的元素。我想能够检查这些引用,所以我正在寻找的东西,将打印嵌套结构的内存地址。选择Data::Dumper
就可以了。
下面是我的意思的一些例子:
my @a = ( [1,2,3], [4,5,6] );
print @a;
会给你类似的信息:
ARRAY(0x20071dc8)
当你在调试器中运行相同的代码并使用x @a
检查数组时,它将打印如下:
0 ARRAY(0x20070668)
0 ARRAY(0x2006c0d8)
0 1
1 2
2 3
1 ARRAY(0x2006c1b0)
0 4
1 5
2 6
但使用Data::Dumper
print Dumper @a;
看起来是这样的
$VAR1 = [
[
1,
2,
3
],
[
4,
5,
6
]
];
我真正想要的是Data::Dumper
输出和调试器提供的详细信息的混合。也许这
$VAR1 = [ ARRAY(0x20070668)
[ ARRAY(0x2006c0d8)
1,
2,
3
],
[ ARRAY(0x2006c1b0)
4,
5,
6
]
];
编辑
考虑下面的代码。输出没有解释$b[1]
与$a[0]
use Data::Dumper;
my @a = ( [1,2,3], [4,5,6] );
my @b = ( ["a","b","c"], $a[0] );
print Dumper @b
print $b[1], "n";
print $a[0], "n";
$VAR1 = [
[
'a',
'b',
'c'
],
[
1,
2,
3
]
];
ARRAY(0x2002bcc0)
ARRAY(0x2002bcc0)
另外,当一个结构引用另一个结构的内容时,这种方法被认为是良好的编程实践吗?也许这是一个太普遍的问题,严重依赖于特定的代码,但我想知道你的意见。
Data::Dumper
已经可以判断引用是否被重用。
在下面的例子中,AoA的第二和第三个元素是相同的。这在dump输出中表示:
use strict;
use warnings;
my @array1 = (1..3);
my @array2 = (4..6);
my @AoA = (@array1, @array2, @array2);
use Data::Dumper;
print Dumper @AoA;
输出:
$VAR1 = [
[
1,
2,
3
],
[
4,
5,
6
],
$VAR1->[1]
];
回复您的编辑
如果你想找到两个不同的数据结构之间的关系,只需要使用两个数据结构对Dumper进行一次调用。
您可以通过将它们作为列表或其他匿名数据结构(如散列或数组)中的值传递来实现这一点:
use strict;
use warnings;
my @a = ([1,2,3], [4,5,6]);
my @b = (["a","b","c"], $a[0]);
use Data::Dumper;
print Dumper(@a, @b);
输出:
$VAR1 = [
[
1,
2,
3
],
[
4,
5,
6
]
];
$VAR2 = [
[
'a',
'b',
'c'
],
$VAR1->[0]
];
我认为对Data::Dump
的关注太少了。它是由著名的LWP
模块套件的作者Gisle Aas编写的。
在这种情况下,它将对您有所帮助,因为有一个配套的Data::Dump::Filtered
模块允许您提供一个回调,以准确地指示每个项应该如何在转储中显示。
这个程序以你的问题中的数据为例。它使用了一个回调函数,在显示每个数组之前将引用的字符串化版本添加为Perl注释。转储与您的需求非常相似,并且作为奖励,它仍然是有效的Perl代码,可以在必要时通过eval
传递。
请注意,所有转储输出都发送到STDERR
,因此我调用select STDERR
以保持print
输出与转储同步。
use strict;
use warnings;
use Data::Dump::Filtered qw/ dump_filtered /;
my @a = ( [1,2,3], [4,5,6] );
my @b = ( [ qw/ a b c / ], $a[0] );
select STDERR;
dump_filtered(@a, &filter);
print "n";
dump_filtered(@b, &filter);
print "n";
print '$b[1] is ', $b[1], "n";
print '$a[0] is ', $a[0], "n";
sub filter {
my ($thing, $ref) = @_;
return { comment => "$ref" } if $thing->is_array;
}
# ARRAY(0x45179c)
[
# ARRAY(0xa2d36c)
[1, 2, 3],
# ARRAY(0x44adc4)
[4, 5, 6],
]
# ARRAY(0x4e6964)
[
# ARRAY(0xa2d534)
["a", "b", "c"],
# ARRAY(0xa2d36c)
[1, 2, 3],
]
$b[1] is ARRAY(0xa2d36c)
$a[0] is ARRAY(0xa2d36c)