Re: Multiple conditions matching when pulling OID value with Net::SNMP
by liverpole (Monsignor) on Oct 20, 2006 at 16:27 UTC
|
Hi Bennco99,
Very simply, you are doing an assignment rather than a test for equality.
Change
if ( $status = $on_commercial )
{
print "The ups is normal\n";
}
if ( my $status = $on_battery )
{
print "The ups is on battery\n";
}
to:
if ( $status == $on_commercial )
{
print "The ups is normal\n";
}
if ( my $status == $on_battery )
{
print "The ups is on battery\n";
}
... and you should be all set.
If you need to compare strings instead of values, use eq instead of ==.
s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
| [reply] [d/l] [select] |
Re: Multiple conditions matching when pulling OID value with Net::SNMP
by chargrill (Parson) on Oct 20, 2006 at 18:20 UTC
|
And in addition to your other good answers, you also have a scoping issue...
my @values = values (%$result);
foreach my $key (@values) {
print "$key\n";
my $status = $key;
print "$status\n";
}
....
#(testing status)
You'll find that even if you change the if test ( if( $status == $condition ) ) - you're not testing the $status you think you are. Turning on warnings and strict would help:
#!/usr/bin/perl
use strict;
use warnings;
my $result = { 1 => 2, 3 => 4 };
my @values = values (%$result);
foreach my $key (@values) {
print "$key\n";
my $status = $key;
print "$status\n";
}
print "status: $status\n";
Output:
$ perl benco.pl
Global symbol "$status" requires explicit package name at benco.pl lin
+e 15.
Execution of benco.pl aborted due to compilation errors.
By declaring my $status inside your earlier foreach loop, you don't have access to it outside your foreach loop - once you exit that loop, the $status you have so carefully stored simply goes away :-)
--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] |
|
|
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] |
|
|
Re: Multiple conditions matching when pulling OID value with Net::SNMP
by andyford (Curate) on Oct 20, 2006 at 16:36 UTC
|
You needed to change "=" to "==".
Oh yeah and get that "my" out of your "if" statement. That's legal, but not what you want.
You also need to "use warnings" and "use strict", please. Trust us, you'll love it.
if ( $status == $on_commercial )
{
print "The ups is normal\n";
}
if ( $status == $on_battery )
{
print "The ups is on battery\n";
}
| [reply] [d/l] |
Re: Multiple conditions matching when pulling OID value with Net::SNMP
by Smaug (Pilgrim) on Oct 20, 2006 at 16:35 UTC
|
Hi Bennco99,
You're setting values. Assuming that the UPS will only run on either commercial power or battery the below should resolve your problem:
if ( $status == 3 ) {
print "The ups is normal\n";
}
else {
print "The ups is on battery\n";
}
$session->close;
| [reply] [d/l] |