Kumar Mantri has asked for the wisdom of the Perl Monks concerning the following question:

use Net::Cisco; open(CONFIG,">config.csv"); print CONFIG "Router ip,Status\n"; open(ROUTERIP,"routerip.txt")or die "couldn't open routerip.txt"; open(COMMAND,"command.txt")or die "couldn't open command.txt"; while(<COMMAND>) { chomp($_); $comm=$_; } $count=0; while(<ROUTERIP>) { chomp($_); $router=$_; $tl=0; tel($router); $count++; } sub tel { $t =Net::Telnet::Cisco->new(Host=>$router,Timeout=>7,Errmode=>'return' +) or $tl=1; $lg=0; my @output; if($tl != 1) { print "$router Telnet success\n"; $t->login('vinth_vm', 'h0mes@ker') or $lg=1 ; if($lg != 1) { print "$router Login success\n"; @output=$t->cmd(string=>"$comm"); if(@output ne '') { chomp(@output); print "@output\n"; print CONFIG "$router,@output\n"; } else { print "no config\n"; print CONFIG "$router,no config\n"; } $t->close; } else { $loginstat="Login Failed"; print "$router $loginstat\n"; print CONFIG "$router,$loginstat\n"; } } else { $telnetstat="Telnet Failed"; print "$router $telnetstat\n"; print CONFIG "$router,$telnetstat\n"; } } close(CONFIG);

my code is for telnet into cisco router and execute a command and if that configuration exist then write that to one file but there is no configuration then it should write in output file as "no config" here the problem is with

if(@output ne '') { chomp(@output); print "@output\n"; print CONFIG "$router,@output\n"; } else { print "no config\n"; print CONFIG "$router,no config\n"; }
part i dont know why ,if the configuration is there then in cisco it wont display any thing at that time ,i want to write as "no config" but its not happening ,the problem is with string comparison ,,,can any body help me?

Replies are listed 'Best First'.
Re: Empty string checking in output
by toolic (Bishop) on Aug 16, 2011 at 12:53 UTC
    if(@output ne '')
    That will always evaluate to true since an array evaluated in scalar context returns the number of elements (0, 1, 2, etc.); it will not return the empty string. Perhaps this will be better:
    if(@output)

      tulic , i tried that but the else block is not executing. i can explain the behavior of the cisco device if a particular command is not present... if i telnet into cisco device it will show as

      2960#
      here at this prompt i want to check one command i.e
      2960#sh run | in ntp
      if the configuration is not present then it will show as same
      2960#
      so at this time the in array @output doesn't contain anything but i dont know why the else block is not executing

        ... the in array @output doesn't contain anything but ... the else block is not executing ...

        ... because, contrary to what you think, the  @output array contains something. Try printing/dumping the contents of the array. Also, what code are you actually running?

        >perl -wMstrict -le "my @output = (); ;; if (@output) { print qq{true clause: array not empty}; } else { print qq{false clause: array empty}; } " false clause: array empty