2016-09-22 136 views
2

我有两个数组和哈希持有这些阵列的两个哈希比较阵列

Array 1: 
    my $group = "west" 
    @{ $my_big_hash{$group} } = (1534,2341,2322,3345,689,3333,4444,5533,3334,5666,6676,3435); 

Array 2 : 

    my $element = "Location" ; 
    my $group = "west" ; 
    @{ $my_tiny_hash{$element}{$group} } = (153,333,667,343); 

现在我想比较

@ {$ my_tiny_hash {$元素} {$组}}

@ {$ my_big_ hash {$ group}}

并检查小散列数组的所有元素是否都是big_hash数组的一部分。 正如我们所看到的,小散列只有3个数字元素,并且如果我们只比较前3位数字,所有这些元素都与大散列匹配

如果前3位数字/字母匹配并且所有大数组都可用,则其匹配或我们必须打印不匹配的元素

其数组对数组进行比较。 我们如何实现它。

PS:如果没有阵列utils的,如何实现它

使用数组utils的解决方案是非常简单的

my @minus = array_minus(@{ $my_tiny_hash{$element}{$group} } , @{ $my_big_hash{$group} } ); 

但所有的数字进行比较,我就只是想匹配的前3位数字

希望这是明确的

感谢

+0

根据你编辑的问题。澄清'匹配前3位数'。 –

+0

@ChankeyPathak“小散列”153是“散列1534”的一部分。 另外,它的原始问题的一部分,我刚刚发布代码使用Array Utils – LearningCpp

+0

好吧,编辑答案相同。我使用了一个临时数组,其中包含大散列的前3位数字,然后用它与小数字进行比较。 –

回答

7

这似乎是做你想做的。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my (%big_hash, %tiny_hash); 
my $group = 'west'; 
my $element = 'Location'; 

# Less confusing initialisation! 
$big_hash{$group} = [1534,2341,2322,3345,689,3333,4444,5533,3334,5666,6676,3435]; 
$tiny_hash{$element}{$group} = [153,333,667,343]; 

# Create a hash where the keys are the first three digits of the numbers 
# in the big array. Doesn't matter what the values are. 
my %check_hash = map { substr($_, 0, 3) => 1 } @{ $big_hash{$group} }; 

# grep the small array by checking the elements' existence in %check_hash 
my @missing = grep { ! exists $check_hash{$_} } @{ $tiny_hash{$element}{$group} }; 

say "Missing items: @missing"; 

更新:,似乎更接近你的原始代码的另一种解决方案。

my @truncated_big_array = map { substr($_, 0, 3) } @{ $big_hash{$group} }; 
my @minus = array_minus(@{ $my_tiny_hash{$element}{$group} } , @truncated_big_array); 
+1

这是整洁。 +1 –

+2

逻辑与你的相同。我的只是有点terser :-) –

+0

感谢您的解决方案。 – LearningCpp

2

一个快速而有点脏的解决方案(它扩展了你现有的代码)。

#!/usr/bin/perl 
use strict; 
use warnings; 
my (%my_big_hash, %my_tiny_hash, @temp_array); 
my $group = "west"; 
@{ $my_big_hash{$group} } = (1534,343,2341,2322,3345,689,3333,4444,5533,3334,5666,6676,3435); 
foreach (@{ $my_big_hash{$group} }){ 
    push @temp_array, substr $_, 0,3; 
} 
my $element = "Location"; 
my $group2 = "west";  
@{ $my_tiny_hash{$element}{$group2} } = (153,333,667,343,698); 


#solution below 
my %hash = map { $_ => 1 } @temp_array; 
foreach my $search (@{$my_tiny_hash{'Location'}->{west}}){ 
    if (exists $hash{$search}){ 
     print "$search exists\n"; 
    } 
    else{ 
     print "$search does not exist\n"; 
    } 
} 

输出:

153 exists 
333 exists 
667 exists 
343 exists 
698 does not exist 

Demo

另见:https://stackoverflow.com/a/39585810/257635


编辑:根据要求使用阵列::的Utils。

foreach (@{ $my_big_hash{$group} }){ 
    push @temp_array, substr $_, 0,3; 
} 

my @minus = array_minus(@{ $my_tiny_hash{$element}{$group} } , @temp_array ); 
print "@minus"; 
+0

感谢您的解决方案。 – LearningCpp

+1

不客气。确保您从下次开始以正确的格式发布明确的问题,以便乍一看更容易理解。 –

+0

当然,谢谢 – LearningCpp

1

一种替代,使用命令比较,而不是哈希:的%result

@big = sort (1534,2341,2322,3345,689,3333,4444,5533,3334,5666,6676,3435); 
@tiny = sort (153,333,667,343,698); 
for(@tiny){ 
    shift @big while @big and ($big[0] cmp $_) <0; 
    push @{$result{ 
    $_ eq substr($big[0],0,3) 
    ? "found" : "missing" }}, 
    $_; 
} 

内容:

{ 
     'found' => [ 
        153, 
        333, 
        343, 
        667 
       ], 
     'missing' => [ 
        698 
        ] 
}