Perl 在失败时强制cmp_deep显示哈希中的所有差异

Perl 在失败时强制cmp_deep显示哈希中的所有差异,perl,testing,hash,compare,Perl,Testing,Hash,Compare,我正在用Perl编写一个测试,我需要比较两个大哈希。 我使用cmp\u deep(),而是

我正在用Perl编写一个测试,我需要比较两个大哈希。 我使用
cmp\u deep
(),而
()。 我的问题是,当这些散列中有不同的东西时,程序会在中间退出。

my $this = {    a=>1,   b=>2,   d=>2, };

my $that = {    a=>1,   b=>3,   c=>3, };

is_deeply($this , $that );
输出为:

# not ok 1
# Failed test at Tester.pl line 32.
#     Structures begin differing at:
#          $got->{b} = '2'
#     $expected->{b} = '3'
但我有更多不同的价值观!我需要看到他们所有人。 我如何才能强制is_深入地打印哈希之间的所有差异,而不仅仅是它们之间的第一个差异


此外,我需要忽略一些关键点。我怎样才能做到这一点呢?

阅读文档对于这类事情通常很方便

您的问题几乎与文档中的用例完全相同

use Test::More tests => 1;

my $hash1 = { a => 1, b => 2, c => 4 }; 
my $hash2 = { a => 1, b => 3, c => 4 };

is_deeply($hash1, $hash2, 'hash are equal') or diag explain($hash1,$hash2);
示例输出:

not ok 1 - hash are equal
#   Failed test 'hash are equal'
#   at test.pl line 7.
#     Structures begin differing at:
#          $got->{b} = '2'
#     $expected->{b} = '3'
# {
#   'a' => 1,
#   'b' => 2,
#   'c' => 4
# }
# {
#   'a' => 1,
#   'b' => 3,
#   'c' => 4
# }
1..1
# Looks like you failed 1 test of 1.

很抱歉,我最初误解了你的问题。仔细阅读这个问题有助于给出正确的答案。无论如何,查找散列中的差异可能会变得相当复杂。我相信有几个CPAN模块可以帮助您实现这一点。我建议在上面找到可以处理您正在处理的数据结构的方法,以比较散列差异


除此之外,我还不知道有什么好方法可以让Test::More或Test::Deep做您想要的事情。希望其他人也能来!祝你好运。

正如Jonathan Leffler指出的那样,显示所有差异的最佳方式是使用及其
eq\u或
方法

但是您可能希望保持Test::Deep,因为它具有一些特殊的特性,如
ignore()
re()

所以,两者都要用。您只需要在失败时看到差异。示例代码:

is_deeply($this, $that, "the data matches" )
    || eq_or_diff($this, $that, "the data matches (with details)");

我认为用
是不可能做到这一点的,而且还可以。测试不应该告诉你要修复什么,而是当某个东西不工作时失败,这是另一回事。测试无助于使代码正确,它只会显示错误。另外,如果你想比较散列的一些值,请明确地进行比较。我需要它,因为其他人会查看测试结果。而且散列太大了,所以仅仅打印“notok”是不够的……在这种情况下,如果测试失败,您可以插入一个命令来转储散列。我认为您的要求与
is\u
作者的要求不同。仔细查看上的手册页,但是您可能需要编写自己的代码来完成需要完成的工作,因为您需要的信息是一般测试人员不需要的。也许您正在寻找?