SPUG: Slice of HashOfHash
Ivan Heffner
iheffner at gmail.com
Thu Nov 16 11:24:50 PST 2006
One of the subthreads within this thread has been checking the
defined()ness of a value before doing an equality check in order to
prevent warnings. The usual approach is this:
foreach my $key ( keys %HoH ) {
if($Hoh{$key}{husband} && $HoH{$key}{husband} eq "fred") {
print "yes\n";
}
}
This is all fine in a simple case, but know that a hash look-up, while
relatively cheap, is not free. Further, taking this example and
abstracting it into an object-based interface, it become relatively
expensive and incurs useless overhead.
foreach my $family ( $cartoon->families() ) {
if ($cartoon->$family->husband() && $cartoon->$family->husband()
eq 'fred') {
print "yes\n";
}
}
This now does a method call to get the family, then another to get the
husband to check if it is "true" then does it all again to check
equality. In a big app, these calls get expensive. But there's a
short-cut method to do this. Use Perl's short-circuiting logical '||'
to make a single method call (or set of method calls):
foreach my $family ( $cartoon->families() ) {
if ( ( $cartoon->$family->husband() || '' ) eq 'fred') {
print "yes\n";
}
}
This will only do the method calls once, then use an empty string for
the equality check if there is no husband.
It's a small tweak, but is easier on your CPU and your maintenance developers.
--
Ivan Heffner
Sr. Software Engineer
DAS Lead
WhitePages.com
More information about the spug-list
mailing list