Sweet! David, does that solve your gripe?
On Jul 1, 2009, at 11:19 AM, Doug Hunt wrote: > Hi Craig: The // operator exists in perl 5.10. Its quite nice, > I've been using it. > > Regards, > > Doug > > [email protected] > Software Engineer > UCAR - COSMIC, Tel. (303) 497-2611 > > On Wed, 1 Jul 2009, Craig DeForest wrote: > >> The problem with the Perl logicals is that, being short-circuiting >> operators (which explicitly don't evaluate their second argument if >> that argument can't affect the outcome), they don't have >> deterministic >> behavior in a threaded expression. The bitwise Booleans work well as >> non-short-circuiting operators, provided only that you ensure your >> values are logical and not just arbitrary numbers. >> >> In your case >> >> my $t = $opts{t} or sequence( $data->dim(0) ); >> >> I think that what you really want is the perl-6 operator '//': >> >> my $t = $opts{t} // sequence( $data->dim(0) ); >> >> which acts on the definedness, rather than truth, of the left-hand >> argument. It would indeed be very nice to have that particular >> shorthand in Perl 5. >> >> The current status quo (of barfing out when a multi-element PDL gets >> evaluated in boolean context) is surprising but at least it avoids >> the >> (different) hosts of tricky bugs and surprising cases that turn up >> when any of the main alternatives (non-short-circuiting operation, >> all/ >> any collapse, or nonnullness) are considered. >> >> Cheers, >> Craig >> >> >> On Jul 1, 2009, at 9:26 AM, David Mertens wrote: >> >>> It says in the FAQ (question 6.11) that logical operators simply >>> don't work. Why? >>> >>> As is somewhat common practice, I have set up some of my scripts to >>> get user info through a hash, which allows for nicely compact ways >>> of setting variable defaults, like: >>> >>> my $yLabel = ( $opts{yLabel} or 'Amplitude'); >>> >>> However, since logical operators are not allowed with piddles, I >>> can't do something like this: >>> >>> my $t = ( $opts{t} or sequence( $data->dim(0) ) ); >>> >>> I argue that this breaks precedence with how Perl handles this sort >>> of expression. I think that any nonempty piddle should return >>> 'true', just as any nonempty list returns 'true' (since nonempty >>> lists return their length in scalar contexts). This way, you can >>> still set up more elaborate checks on user passed data if you want >>> to allow them to pass a null piddle and have it carry some meaning: >>> >>> my $t; >>> if ( defined ( $opts{t} )) { >>> $t = $opts{t}; >>> } >>> >>> Surely somebody has thought about this and justified the current >>> lack of logicals. If I had to guess, it's because introducing this >>> behavior would lead to difficult-to-find bugs. Is that the >>> reasoning? Where can I read more? >>> >>> Thanks. >>> David >>> _______________________________________________ >>> Perldl mailing list >>> [email protected] >>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl >> >> >> _______________________________________________ >> Perldl mailing list >> [email protected] >> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl >> > _______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
