2010-07-06 79 views
2

我試圖削減打印列表中的端口數:爲什麼我在下面的Perl腳本中被警告使用未初始化的值?

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).

+0

我們需要什麼是'$ hostz-> tcp_ports返回更多的信息( '開放')'。 – dolmen 2010-07-06 15:21:33

+0

if($ port ~~(qw(80 445 515 9100)){...}' – Ether 2010-07-07 02:44:13

回答

1

這裏是一個如何從包含端口列表的字符串中選擇感興趣的端口:

#!/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" 
} 
5

最有可能的,表達$hostz->tcp_ports('open')返回undef,而不是一個數字,如你的預期。

+0

if if if if($ port!= undef){ 現在它說使用未初始化的值在數值ne(!=)at parse-nmap-xml.pl line 67. – Zenet 2010-07-06 14:32:55

+3

使用'if(defined $ port)'代替 – 2010-07-06 14:38:19

+0

感謝羅馬,沒有更多未初始化的錯誤:p 但現在我得到一個空list!就像這樣: ABCD 0 – Zenet 2010-07-06 14:48:47

1

$hostz->tcp_ports('open')可能回報您應該存儲在一個數組變量中的端口列表:@ports而不是$ports。然後你應該檢查數組中的每個元素。

你可以做到這一點也只有一行:

$output = join(',', grep { $_ != 80 && $_ != 445 && $_ != 515 && $_ != 9100 } $hostz->tcp_ports('open')); 
相關問題