• 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
    ";没有执行
    
    
    
    
    
    
    

  • 相关阅读:
    Linux中./configure、make、make install详解
    VMware虚拟CentOS 6.5在NAT模式下配置静态IP地址及Xshell远程控制配置
    VMWare中Linux虚拟机设置静态IP上网的设置方法
    Linux下SSH远程连接断开后让程序继续运行解决办法
    弱网测试(一)
    算法的测试
    前端图片加载优化
    jpg/jpeg/png格式的区别与应用场景
    测试分类标准
    Mysql 日期与时间戳的相互转化
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351826.html
Copyright © 2020-2023  润新知