eval 函数防止程序崩溃

use HTTP::Date qw(time2iso str2time time2iso time2isoz);  
use Net::Ping;  
use Socket;  
use encoding 'euc_cn'; 
my @array=( "api.weixin.qq.cm"  
             );  
while (1==1){  
my $CurrTime = time2iso(time());  
        foreach $host (@array){  
        $p = Net::Ping->new("icmp" );  
  $ip_addr=gethostbyname($host);
 
  print "$ip_addr is $ip_addr
";
  #eval {$packed_ip_addr= inet_ntoa($ip_addr)};  
   $packed_ip_addr= inet_ntoa($ip_addr);  
    print "$packed_ip_addr is $packed_ip_addr
";
  if ($p->ping($host,2)) {  
        open (A, ">>ping.log");  
        (  
print A ("$CurrTime---$packed_ip_addr is active.
")  
  
)} else  
{  
 open (B ,">>ping.log");  
       (  
print B ("$CurrTime---$host is lost.
") ,print "$host is lost.
"  
)  
}  
sleep(5)        
}}

}

正常情况:
D:>perl ping.pl
"x{fffd}" does not map to euc-cn at ping.pl line 13.
$ip_addr is gx{fffd}$
$packed_ip_addr is 103.251.36.235
"x{fffd}" does not map to euc-cn at ping.pl line 13.
$ip_addr is gx{fffd}$
$packed_ip_addr is 103.251.36.235
api.weixin.qq.cm is lost.
"x{fffd}" does not map to euc-cn at ping.pl line 13.
$ip_addr is gx{fffd}$
$packed_ip_addr is 103.251.36.235


异常:
use HTTP::Date qw(time2iso str2time time2iso time2isoz);  
use Net::Ping;  
use Socket;  
use encoding 'euc_cn'; 
my @array=( "api.weixin.qq.cz"  
             );  
while (1==1){  
my $CurrTime = time2iso(time());  
        foreach $host (@array){  
        $p = Net::Ping->new("icmp" );  
  $ip_addr=gethostbyname($host);
 
  print "$ip_addr is $ip_addr
";
  #eval {$packed_ip_addr= inet_ntoa($ip_addr)};  
   $packed_ip_addr= inet_ntoa($ip_addr);  
    print "$packed_ip_addr is $packed_ip_addr
";
  if ($p->ping($host,2)) {  
        open (A, ">>ping.log");  
        (  
print A ("$CurrTime---$packed_ip_addr is active.
")  
  
)} else  
{  
 open (B ,">>ping.log");  
       (  
print B ("$CurrTime---$host is lost.
") ,print "$host is lost.
"  
)  
}  
sleep(5)        
}}


D:>perl ping.pl
$ip_addr is
Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at ping.pl line 1
5.

D:>


一个正常(或能正确解析)的 domain, inet_aton() 会回传 4 个字符 chr 0-255
但如果是不能解析的话, 就会回传 0.


Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at ping.pl line 1


回传0了

此处加上eval 就是防止程序崩溃


use HTTP::Date qw(time2iso str2time time2iso time2isoz);  
use Net::Ping;  
use Socket;  
use encoding 'euc_cn'; 
my @array=( "api.weixin.qq.cz"  
             );  
while (1==1){  
my $CurrTime = time2iso(time());  
        foreach $host (@array){  
        $p = Net::Ping->new("icmp" );  
  $ip_addr=gethostbyname($host);
 
  print "$ip_addr is $ip_addr
";
  eval {$packed_ip_addr= inet_ntoa($ip_addr)};  
  # $packed_ip_addr= inet_ntoa($ip_addr);  
    print "$packed_ip_addr is $packed_ip_addr
";
 }
 sleep(3);
 }

D:>perl ping.pl
$ip_addr is
$packed_ip_addr is
$ip_addr is
$packed_ip_addr is

-------------------------------------------------------------------

use HTTP::Date qw(time2iso str2time time2iso time2isoz);  
use Net::Ping;  
use Socket;  
use encoding 'euc_cn'; 
my @array=( "api.weixin.qq.cz"  
             );  
while (1==1){  
my $CurrTime = time2iso(time());  
        foreach $host (@array){  
        $p = Net::Ping->new("icmp" );  
  $ip_addr=gethostbyname($host);
 
  print "$ip_addr is $ip_addr
";
  # eval {$packed_ip_addr= inet_ntoa($ip_addr)};  
   $packed_ip_addr= inet_ntoa($ip_addr);  
    print "$packed_ip_addr is $packed_ip_addr
";
 }
 sleep(3);
 }

D:>perl ping.pl
$ip_addr is
Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at ping.pl line 1
5.


没有eval,程序崩溃 print "$packed_ip_addr is $packed_ip_addr
";没有执行







原文地址:https://www.cnblogs.com/hzcya1995/p/13351826.html