首页 > 解决方案 > Perl:显示 HoA 中的元素差异

问题描述

有没有办法在这个代码场景中显示单个元素的差异?我已经搜索和搜索并尝试了近 4 个小时的多行代码。目前它显示了整个不同的键:值数据集,我希望它显示或需要显示的是 ent5:440。

谢谢!

use strict;
use warnings;

    my @diff = list_diff(keys %vlans_A, keys %vlans_B);
    print "Difference in keys: ", @diff, "\n" if @diff;

    KEY:
    foreach my $key (keys %vlans_A) {
        next KEY unless exists $vlans_B{$key};
        my @diff = list_diff(@{ $vlans_A{$key} },@{ $vlans_B{$key} });
        print "Difference at key $key: ", @diff, "\n" if @diff;
    }


    sub list_diff {
        my %keys;
        $keys{$_}++ for @_;
        return grep 2 != $keys{$_}, keys %keys;
    }


Difference at key ent5: 102 103 433 440 1803 1806 1808 1809 1814 1815 1822 1866 1867 1898 2002102 103 433 1803 1806 1808 1809 1814 1815 1822 1866 1867 1898 2002
$VAR1 = {
          'ent5' => [
                      '102 103 433 440 1803 1806 1808 1809 1814 1815 1822 1866 1867 1898 2002'
                    ],
          'ent4' => [
                      '409 432 434 435 436 1702 1703 1802 1805 1851 1852 1854 1855 1857 1858 1863 1864 1870 2001'
                    ],
          'ent9' => [
                      '4094'
                    ]
        };
$VAR1 = {
          'ent5' => [
                      '102 103 433 1803 1806 1808 1809 1814 1815 1822 1866 1867 1898 2002'
                    ],
          'ent4' => [
                      '409 432 434 435 436 1702 1703 1802 1805 1851 1852 1854 1855 1857 1858 1863 1864 1870 2001'
                    ],
          'ent9' => [
                      '4094'
                    ]
        };

标签: arraysperlhash

解决方案


这是一种方法,在空白处拆分值:

KEY:
for my $key (keys %vlans_A) {
    next KEY unless exists $vlans_B{$key};
    my @diff = list_diff(get_values($vlans_A{$key}), get_values($vlans_B{$key}));
    print "Difference at key $key: @diff\n" if @diff;
}

sub get_values {
    my ( $key_strs ) = @_;

    my @keys;
    for my $str ( @$key_strs ) {
        push @keys, split " ", $str;
    }
    return @keys;
}

 sub list_diff {
    my %keys;
    $keys{$_}++ for @_;
    return grep 2 != $keys{$_}, keys %keys;
}

推荐阅读