2011-05-14 67 views
0

让我对我的问题具体一些,而不是概括它,让观众迷惑。在我的代码中,我有一组网络地址(实际上是对象组的成员)存储在单独的数组中。我想比较A组是否是B组子集。在Perl中如何比较两个对象数组(比较逻辑是在单独的子例程中编码)?

我正在使用Net :: IP模块来分析IP地址并使用“overlapps”子例程来确定一个元素(可能是单个IP或子网)是另一个元素的超集。

我现在面临的挑战是在返回只有A组的每个元素,属于

这里B组中的任何一个元素的成功状态的方式我认为在诉讼来尝试它同样代码:

$status = "match"; 
foreach $ip (@group_a) { 
    if a_in_b($ip,@group_b) #this sub-routine would be similar but with different comparison function 
    { 
    next; 
    } 
    else 
    { 
    $status = "no match"; 
    last;} 
} 

请建议我,如果有更好的方法来做到这一点,会喜欢拿起新的技术。上述技术看起来并不完美!当我寻找一些解决方案时,似乎暗示了一些references,好像我可以尝试使用智能匹配运算符并将其重载。但是,超载超出了我在Perl中的复杂程度,所以非常有帮助!编号: 根据建议更新我的代码。这里是工作版本(仍然需要添加错误捕获的零碎)

use Net::IP; 
use strict; 
use warnings; 

my @subnet = ("10.1.128.0/24","10.1.129.0/24","10.1.130.0/24","10.1.108.4"); 
my @net = ("10.1.128.0/21","10.1.108.0/22"); 


sub array_subset { 
    my ($x, $y) = @_; 
    a_in_b ($_, @$y) or return '' foreach @$x; 
    return 1; 
}; 

sub a_in_b { 
    my $node1 = shift(@_); 
    my @ip_list = @_; 
    for my $node2 (@ip_list) { 
    print $node2, "\n"; 
    my $ip1 = new Net::IP ($node1) || die; 
    my $ip2 = new Net::IP ($node2) || die; 
    print "$node1 $node2 \n"; 
    if ($ip1->overlaps($ip2)==$IP_A_IN_B_OVERLAP) { 
     return 1; 
    } 

    } 
    return ""; 
} 

if (array_subset(\@subnet, \@net)) { 
    print "Matches"; 
}else 
{ 
    print "Doesn't match" 
} 
+0

我想看到你的'a_in_b'子。 – TLP 2011-05-14 18:29:16

+0

代码块的结构是类似的,而不是使用'a_in_b($ ip,@ group_b)'作为条件语句,我将'if($ ip1-> overlapps($ ip2)== $ IP_A_IN_B_OVERLAP)'as if条件。 你还想看看整个子程序吗? – Benny 2011-05-14 18:45:16

+0

我想知道你的数据是什么,以及你的意思是比较它。我对IP和网络不太熟悉,但我确实知道perl。 – TLP 2011-05-14 19:05:50

回答

2

重载~~有点矫枉过正。我会建议使用List::MoreUtils

use List::MoreUtils qw/all/; 
if (all { a_in_b($_, @bignet) } @smallnet) { 
    # do something 
}; 

或者只是改写自己的代码作为子,并以更Perlish的方式:

sub array_subset { 
    my ($x, $y) = @_; 
    a_in_b ($_, @$y) or return '' foreach @$x; 
    return 1; 
}; 

# somewhere in the code 
if (array_subset(\@subnet, \@net)) { 
    # do something 
}; 
+0

谢谢!它几乎奏效,但陷阱是我的逻辑。如果我有一个超级网络阵列(A,B)和子网(A1,A2,A3,B1),它将不会返回匹配结果,因为所有4个子网都不属于逻辑验证的同一个超网。我希望它对于这样的情况返回true:'A1,A2,A3⊆A'&'B1⊆B' – Benny 2011-05-15 05:41:50

+0

@Benny:咦?正如我所看到的,你的逻辑(也就是我的逻辑)建议独立测试子网中的每个元素。 – Dallaylaen 2011-05-15 09:06:06

+0

哎呀,对不起,看起来我必须再次检查我的代码。将返回完整的代码。感谢您的时间! – Benny 2011-05-15 09:28:33