讓我對我的問題具體一些,而不是概括它,讓觀衆迷惑。在我的代碼中,我有一組網絡地址(實際上是對象組的成員)存儲在單獨的數組中。我想比較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