[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Omaha.pm] not defined $bucket || $bucket eq '???'
From: brandonglesmann@gmail.com
Date: December 3, 2008 4:42:30 PM CST
Disclaimer: I have been out of perl programming for over two years.
So, I am really rusty. Also I never used the perl debugger so I
could be misinterpreting the output. Lastly, I am a coward which is
why I did not reply all.
Well, thanks for saying it was OK for me to drag you into the
sunshine so all can benefit from my stupidity. :)
WOW! Ok, I read that 10 times and have asked other perl programmers
in the area to read it as well.
Other Perl programmers? Sweet! Are they on the Omaha Perl Mongers
mailing list? Recruit them! :)
couple questions:
1. How are the cases different? If ' ' is true and then both cases
of your example should be the same.......right?!?! Obviously not
since you changed the code but I don't know why.
' ' is very different from ''. :)
I'm often a hunt and peck coder, so whatever perl does is the right
answer. I don't know that there necessarily is a "why". (Other than
"because that's what perl's C source code says" -grin-). So let's try
some things...
First, note that '' is false and ' ' is true.
$ cat j.pl
print '' ? 'yes ' : 'no ';
print ' ' ? 'yes ' : 'no ';
$ perl j.pl
no yes
But my thing was more like this:
$ cat j.pl
print ((not defined $j || 1) ? 'yes ' : 'no ');
print ((not defined $j or 1) ? 'yes ' : 'no ');
$ perl j.pl
no yes
-think,think,think-
I'm betting this happens due to operator precedence. Reading "perldoc
perlop" doesn't help me much at a glance since I'm not sure where
'defined' falls in the documented precedence order stack. But let's
assume for a second that the precedence of 'defined' is higher than
that of 'or' but lower than that of '||'. If that's true, then:
not defined $j || 1
would be processed as:
$j || 1 true
defined true true
not true false
So if 'defined' is a "nonassoc list operators (rightward)" then this
is probably the correct answer and I feel all smart and stuff. :)
2. How do you get a eq to return ' ' ?
You don't? Apparently it returns '' if false, 1 if true:
$ perl -d -e 1
DB<1> x $j eq 'blah'
0 ''
DB<2> x $j eq ''
0 1
perldoc perlop says:
Binary "eq" returns true if the left argument is stringwise equal to
the right argument.
And '' is false, and '1' is true, so there you have it... :)
Did that help at all?
Cheers,
j