2011-05-14 32 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