Почему меня предупреждают об использовании неинициализированного значения в следующем скрипте Perl? - PullRequest
2 голосов
/ 06 июля 2010

Я пытаюсь сократить количество портов, напечатанных в этом списке:

A.B.C.D 80,280,443,515,631,7627,9100,14000

до наиболее интересных для меня:

A.B.C.D 80,515,9100

Для этого я использую этот фрагмент кода:

foreach (@ips_sorted) {
  print "$_\t";
  my $hostz = $np->get_host($_);
    my $port = 0;
    my $output = 0;
    $port = $hostz->tcp_ports('open');
  if ($port == 80 || $port == 445 || $port == 515 || $port == 9100) {
    $output =  join ',' ,$port;  
  } 
  print $output;

  print "\n";
}

Мне, вероятно, не нужно говоритьчто это не работает.Я получаю это:

A.B.C.D 0

Use of uninitialized value $port in numeric eq (==) at parse-nmap-xml.pl line **(line with if).

Ответы [ 3 ]

5 голосов
/ 06 июля 2010

Скорее всего, выражение $hostz->tcp_ports('open') вернуло undef, а не число, как вы ожидали.

1 голос
/ 06 июля 2010

$hostz->tcp_ports('open'), вероятно, возвращает список портов, которые следует хранить в переменной массива: @ports вместо $ports. Затем вы должны проверить каждый элемент массива.

Вы можете сделать это также в одну строку:

$output = join(',', grep { $_ != 80 && $_ != 445 && $_ != 515 && $_ != 9100 } $hostz->tcp_ports('open'));
1 голос
/ 06 июля 2010

Вот как можно выбрать интересные порты из строки, содержащей список портов:

#!/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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...