生成更多Perl Data:: dump输出



我有几个嵌套的数据结构,它们引用彼此的元素。我想能够检查这些引用,所以我正在寻找的东西,将打印嵌套结构的内存地址。选择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)

相关内容

  • 没有找到相关文章

最新更新