让我对我的问题具体一些,而不是概括它,让观众迷惑。在我的代码中,我有一组网络地址(实际上是对象组的成员)存储在单独的数组中。我想比较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"
}
我想看到你的'a_in_b'子。 – TLP 2011-05-14 18:29:16
代码块的结构是类似的,而不是使用'a_in_b($ ip,@ group_b)'作为条件语句,我将'if($ ip1-> overlapps($ ip2)== $ IP_A_IN_B_OVERLAP)'as if条件。 你还想看看整个子程序吗? – Benny 2011-05-14 18:45:16
我想知道你的数据是什么,以及你的意思是比较它。我对IP和网络不太熟悉,但我确实知道perl。 – TLP 2011-05-14 19:05:50