Позвольте мне конкретизировать мою проблему, а не обобщать ее и сбивать с толку аудиторию. В моем коде у меня есть набор сетевых адресов (фактически членов объектной группы), хранящихся в отдельных массивах. Я хотел бы сравнить, является ли группа A подмножеством группы B.
Я использую модуль Net::IP для анализа IP-адресов и использую подпрограмму «перекрытия», чтобы определить, является ли элемент (может быть отдельным 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;}
}
Пожалуйста, предложите мне, если есть лучший способ сделать это, хотел бы подобрать новые методы. Вышеупомянутая техника не выглядит звуковой вообще! Когда я искал некоторые решения, некоторые -for-equality">ссылки, кажется, предполагают, что я мог бы попробовать использовать оператор интеллектуального сопоставления и перегрузить его. Но перегрузка выходит за рамки моего уровня сложности в 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
. - person TLP   schedule 14.05.2011a_in_b($ip,@group_b)
в качестве оператора условия я буду использоватьif ($ip1->overlaps($ip2)==$IP_A_IN_B_OVERLAP)
в качестве условия if. Вы все еще хотите посмотреть на всю подпрограмму? - person Benny   schedule 14.05.2011