Вот как можно выбрать интересные порты из строки, содержащей список портов:
#!/usr/bin/perl
my %interesting = map { $_ => undef } qw( 80 445 515 9100 );
(undef, my $str) = split ' ', q{A.B.C.D 80,280,443,515,631,7627,9100,14000};
my @ports = grep { exists $interesting{$_} } split /,/, $str;
print "Interesting ports: [@ports]\n";
Вот как я бы переписал ваш код:
#!/usr/bin/perl
my %interesting = map { $_ => undef } qw( 80 445 515 9100 );
for my $ip (@ips_sorted) {
print "$ip\t";
my $hostz = $np->get_host($ip);
unless ( defined $hostz ) {
warn "get_host returned undef for ip: '$ip'\n";
next;
}
my $port = $hostz->tcp_ports('open');
unless ( defined $port ) {
warn "tcp_ports returned undef for ip: '$ip'\n";
next;
}
(undef, my $str) = split ' ', $port;
my @ports = grep { exists $interesting{$_} } split /,/, $str;
if ( @ports ) {
print join(',', @ports);
}
print "\n"
}