[Omaha.pm] Another || quickie

Miller, Scott L (Omaha Networks) Scott.L.Miller at hp.com
Tue Aug 23 07:37:00 PDT 2005


The last version below doesn't completely satisfy his original logic...  Actually, maybe it does; because looking at it more closely, the original logic and the derived versions all have issues.  Using the shorthand variable $t->Value, it is being numerically compared to an empty string, which can be a problem.  An actual zero in $t->Value will fail to pass the original test because numerically the empty string is also zero; in fact all strings that do not start with a number will fail the 2nd if statement in the original version. Only strings that evaluate to a non-zero value will get past that 2nd if statement.

So, if $t->Value is supposed to have a string, we need to use the string comparison operations, eq and ne, for equal and not-equal respectively. Otherwise we should replace the "" with a zero.

Without further context I can't tell if this would actually cause problems in the logic of this snippet of code.

If we're attempting to test if $oWkS->{Cells}[$iR][0] is defined, which it looks like we are, then to make it easier to read later, we should be using a defined() test.  We shouldn't be relying on the fact that if it is a valid pointer, the memory address residing in $t is not going to be zero.

Another subtle issue that could come up is that if $oWkS->{Cells} didn't even exist before this snippet, it will as soon as the if statement is hit. This nice little "feechur" is called auto-vivification.  Read up on it if you haven't heard about it before.

-Scott

-----Original Message-----
From: omaha-pm-bounces at pm.org [mailto:omaha-pm-bounces at pm.org] On Behalf Of Jay Hannah
Sent: Monday, August 22, 2005 9:55 PM
To: Perl Mongers of Omaha, Nebraska USA
Subject: Re: [Omaha.pm] Another || quickie


On Aug 19, 2005, at 12:57 PM, Kenneth Thompson wrote:
> So if I understand this correctly:
>  
> This:
>  
>     if ($oWkS->{Cells}[$iR][0]) {
>       if ($oWkS->{Cells}[$iR][0]->Value != "") {
>         $myVar = ($oWkS->{Cells}[$iR][0]->Value)
>       }
>     }
>  
> Is the same as this:
>  
>     if (!$oWkS->{Cells}[$iR][0]) {}
>     elsif {$oWkS->{Cells}[$iR][0]->Value == "") {}
>     else {
>        $myVar = ($oWkS->{Cells}[$iR][0]->Value);
>     }

IMHO the 2nd is less readable.

> Which is shortcut(ed?) as this? :
>  
>     My $t = (!$oWkS->{Cells}[$iR][0];
>     $myVar = ((!$t) || ($t->Value != "") || $t->Value);

I think your unmatched ( and "My" will syntax error. Perhaps this?:

    my $t = $oWkS->{Cells}[$iR][0];
    $myVar = $t->Value if ($t && $t->Value);

?

j

_______________________________________________
Omaha-pm mailing list
Omaha-pm at pm.org
http://mail.pm.org/mailman/listinfo/omaha-pm


More information about the Omaha-pm mailing list