in reply to Global symbol "$session" requires explicit package name

In addition to what jakobi said above, you might also want to check the return value of Net::Telnet::Cisco->new(). Maybe it wasn't able to establish a connection!

Also, if ( EXPRESSION ) { } else { ... } doesn't earn a beauty award either. I'd suggest you rewrite the whole foreach block like this:

foreach (@matches) { chomp; print "'$_'\n"; my ($p1, $p2) = get_p(); if (my $session = Net::Telnet::Cisco->new(Host => $_) ) { $session->login('myname', $p1); warn "Can't enable: " . $session->errmsg unless $session->enable($p2); my @version = $session->cmd('show version '); print @version, "\n"; } else { die "Couldn't connect to $_"; } } exit;

However, I'm having this hunch that the version thingy is going to be the same for each iteration, so you might also want to consider something like this:

my @version; foreach (@matches) { .... @version ||= $session->cmd('show version '); } print @version, "\n";

Replies are listed 'Best First'.
Re^2: Global symbol "$session" requires explicit package name
by Bloodnok (Vicar) on Oct 17, 2009 at 01:23 UTC
    Hmmm ,

    ...check the return value of Net::Telnet::Cisco->new() - whilst checking such return values (or utilising autodie) is, IMO, never a bad idea, this call _must_ have succeeded since Net::Telnet tells us that the default action on error (not overridden by your code) is to die.

    Hence, since no such behaviour was forthcoming, we can infer that the call to the constructor must have been successful and thus a session opened.

    A user level that continues to overstate my experience :-))

      You're right: the call must have succeeded, then. And IMO you're right again: checking return values (or using autodie indeed) is never a bad idea.

      I'll be upfront with you. I was merely trying to advocate good practice. Thank you for pointing out I failed to live up to a very famous one: RTFM. I didn't care to check the docs so perhaps a mild apology is in order.