As a side note, I changed the loop to:
my @values = values (%$result);
foreach my $key (@values) {
print "key:$key\n";
$status = $key;
}
print "status:$status\n";
When I turn on strict I get:
Global symbol "$status" requires explicit package name at C:\SNMP.pl l
+ine 21.
Global symbol "$status" requires explicit package name at C:\SNMP.pl l
+ine 24.
Global symbol "$status" requires explicit package name at C:\SNMP.pl l
+ine 26.
Global symbol "$status" requires explicit package name at C:\SNMP.pl l
+ine 30.
Execution of C:\SNMP.pl aborted due to compilation errors.
How do I define $status to be used outside of the loop and not get the above errors? | [reply] [d/l] [select] |
my $status;
my @values = values (%$result);
foreach my $key (@values) {
print "key:$key\n";
$status = $key;
}
However, now that I take another look at it, I also notice that you're only ending up with a single value in $status, and that's whatever came last in your @values or %Sresult hashref. Is this intentional? If so, you could just re-write it like so:
my $status = ( keys %$results )[ -1 ];
This is untested, but ought to work. Basicaly it saves you from creating a superfluous array @values, treats keys %$result as a list, and [ -1 ] takes the last element of that list.
And completely unrelated, but you may want to start indenting your code properly, as it can get hard to see scoping issues merely by eyeballing it. For instance, the following would've made this much more obvious to everyone else in the thread:
my @values = values (%$result);
foreach my $key (@values) {
print "key:$key\n";
$status = $key;
}
--chargrill
s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; =
qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
| [reply] [d/l] [select] |
That was my problem. I can see how using strict & warnings is beneficial, but I don't turn them on, because I end up getting more confused.
Your previous response had me looking at the loop, but couldn't pinpoint it. Thank you again. | [reply] |
BTW, you shouldn't treat using strict and warnings as beneficial, you should treat it as mandatory. There are so many "stupid programmer" mistakes I've made, time and time again - typos and scoping issues for starters - that I really don't want to write any more code that doesn't urn on strict and warnings.
Not to belabor the point, but the topic is often brought up here. In fact, the "weekly best" post is currently Warnings and Strict in Production/Performance, where you see a lot of the monks around here encouraging use of strict and warnings.
You can also use diagnostics; along with warnings, which will print a "layman's summary" of the warnings your script causes. (This one should be turned off for production use, IMHO). Being confused at the extra messages is normal at first, and you can always bring questions up to the fine folk here at the monastery. Once you're able to decipher them easily enough on your own, you'll wonder how you ever lived without these valuable development tools.
Update: McDarren is right, which is why I did belabor it a bit ;) There is so much good reading, questions solved by, meditations, etc. here on the monastery.
--chargrill
s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; =
qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
| [reply] [d/l] [select] |
"Not to belabor the point, but the topic is often brought up here"
I think it's a point well and truly worth belabouring, especially to somebody new to Perl - as the OP says he is. And for some more excellent reading, one of the best threads I've seen here in the monastery on this topic was On Commenting Out 'use strict;', started by Old_Gray_Bear.
Cheers,
Darren :)
| [reply] |