Perl代码上的未初始化值

时间:2013-08-08 20:28:13

标签: perl if-statement match

我一直在看我的代码,但我无法弄清楚以下错误在哪里:uninitialized value $match in string eq perl

基本上代码通过TELNET连接到多个设备并关闭连接。它只是测试用户及其密码,以查看哪些已过期。当它连接时给出成功消息,否则给出失败消息。

我不知道为什么它会给我那些未初始化的值错误。这是我用于项目的代码:

$telnet = new Net::Telnet (
    Errmode => "return", 
    Port => $puerto, 
    Input_log => $output_log, 
    Host => $host
);
$conexion = $telnet -> open(Timeout => 5);
if ($conexion == 1) {
print "Se conecto al $host \n\n";
$input =  $telnet -> get(Timeout => 10);
if ($input) {
    if ($input =~ /login name:/){
        $cmd = $telnet -> print($user);
        ($prematch, $match) = $telnet -> waitfor(
                          Timeout => 5, 
                          Match => '/password:/');
        if ($match) {
            $cmd = $telnet -> print($password);
            ($prematch, $match) = $telnet -> waitfor(
                                 Timeout => 5, 
                                 Match => '/Windows/');
            if ($match) {
                $cmd = $telnet -> print("");
                ($prematch, $match) = $telnet -> waitfor(
                                        Timeout => 5, 
                                        Match => '/choose/'); 
                     # Aca se tiene que diseñar el caso de errores de clave
                    //////ERROR LINE//////
                if ($match eq "choose") {   
                    //////ERROR LINE//////
                    $cmd = $telnet -> print("2");
                    ($prematch, $match) = $telnet -> waitfor(
                                                 Timeout => 5, 
                                                 Match => '/Corp/');
                    if ($match) {
                        print "Se autentico satisfactoriamente el usuario y la contrasena\n\n";
                    }
                } else {
                    print "el usuario o contrasena son erroneos, fallo la conexion\n\n";
                    $cerrar = $telnet -> close;
                    } 
                }
            }
        }
    }   
}
$cerrar = $telnet -> close;
}

1 个答案:

答案 0 :(得分:3)

我在猜测

  1. $telnet->waitfor()返回了一个空列表
  2. 或至多包含1个元素的列表
  3. 或者甚至可能是第二个元素的undef值。
  4. 你看,“未初始化”并不意味着它在其他语言中意味着同样的东西。在为其分配未定义的值之前,您可能在$match中有了某些内容。对于Perl,无论您是否为该标量定义了值,或者为其指定了未定义的值,都是相同的。

    这可能是一些混乱的地方。

    Perl中的许多API在列表上下文中失败时返回一个空列表。这样他们的“真值”就是0,你可以这样做:

    unless (( $prematch, $match ) = $telnet->waitfor( Timeout => 5, Match => '/choose/' ))    {
        die 'Failed waiting for Telnet!';
    }