The oldies are the goodies
-
Today's snippet of Pure Win is brought to you by nagios. Specifically the check_snmp_* plugins (and maybe others).
sub isnnum { # Return true if arg is not a number my $num = shift; if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;} return 1; }
(For those who don't get regex, the if succeeds if the string passed matches digits with a single optional decimal point anywhere but the last character).
-
@ChZEROHag said:
sub isnnum { # Return true if arg is not a number
Took me looking at this line 3 or 4 times before i saw the method is: isNnum, presumably the extra N is for Not? Because 2 more chars would be too much? Thinking it was isnum the comment made my head spin because the return arg was just the opposite of what I'd expect :)
-
Why exactly is this a WTF? Maybe I don't get it, but they're checking to make sure it's a valid number, simple as that.
-
@gms8994 said:
Why exactly is this a WTF? Maybe I don't get it, but they're checking to make sure it's a valid number, simple as that.
You might want to actually read the post before replying, it's quite obvious what the WTF is.
-
I think TRWTF is that they didn't read the Perl FAQ about matching numbers.
-
@JamesKilton said:
@gms8994 said:
Why exactly is this a WTF? Maybe I don't get it, but they're checking to make sure it's a valid number, simple as that.
You might want to actually read the post before replying, it's quite obvious what the WTF is.
Humour us and explain it.
-
@ChZEROHag said:
(For those who don't get regex, the if succeeds if the string passed matches digits with a single optional decimal point anywhere but the last character).
Actually, the "if" condition also succeeds for all of the following, err, numbers:
- 123.
- 123.Michael
- 123%"&%/)=
...anything, as long as it starts with a decimal digit.
(I like how the
;}
looks like it's smiling at me.)
-
@Michael Buschbeck said:
@ChZEROHag said:
(For those who don't get regex, the if succeeds if the string passed matches digits with a single optional decimal point anywhere but the last character).
Actually, the "if" condition also succeeds for all of the following, err, numbers:
- 123.
- 123.Michael
- 123%"&%/)=
...anything, as long as it starts with a decimal digit.
(I like how the
;}
looks like it's smiling at me.)Actually, it returns the matching part, try it:
perl -e 'print "123.Michael" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123.perl -e 'print "123%\"&%/)=" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123
-
@gms8994 said:
Actually, it returns the matching part, try it:
perl -e 'print "123.Michael" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123.perl -e 'print "123%\"&%/)=" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123Which means that the if succeeds.
-
@gms8994 said:
Actually, it returns the matching part
Only in list context (which "print" provides). In scalar context (like in an "if" condition) it returns a boolean, or what passes in Perl for one, indicating the success of the match:
[~] perl -le 'print scalar("123.Michael" =~ /^(\d+\.?\d*)|(^\.\d+)$/)' 1 [~] perl -le 'print scalar("123%\"&%/)=" =~ /^(\d+\.?\d*)|(^\.\d+)$/)' 1 [~] perl -le 'print scalar("moo" =~ /^(\d+\.?\d*)|(^\.\d+)$/)'
[~] _
-
-
@bstorer said:
@gms8994 said:
Even if the matching part is '0'?Actually, it returns the matching part, try it:
perl -e 'print "123.Michael" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123.perl -e 'print "123%\"&%/)=" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123Which means that the if succeeds.
-
@lolwtf said:
@bstorer said:
@gms8994 said:
Even if the matching part is '0'?Actually, it returns the matching part, try it:
perl -e 'print "123.Michael" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123.perl -e 'print "123%\"&%/)=" =~ /^(\d+\.?\d*)|(^\.\d+)$/'
123Which means that the if succeeds.
zemm@bambi:~$ perl -e ' print "0" =~ /^(\d+\.?\d*)|(^\.\d+)$/ ? "win\n" : "fail\n";'
win
zemm@bambi:~$ perl -e ' print "0" =~ /^(\d+\.?\d*)|(^\.\d+)$/;'
0zemm@bambi:~$ █
-
@Michael Buschbeck said:
@ChZEROHag said:
(For those who don't get regex, the if succeeds if the string passed matches digits with a single optional decimal point anywhere but the last character).
Actually, the "if" condition also succeeds for all of the following, err, numbers:
- 123.
- 123.Michael
- 123%"&%/)=
-
...anything, as long as it starts with a decimal digit.
(I like how the
;}
looks like it's smiling at me.)I don't think so. I don't see any alpha matching characters in there. the \d should only match digits, right? Am I missing something?
EDIT:
I see it now. Grouping and ^$. Got it. Nevermind.