[Koha-devel] Bug 18539 - Forbid Koha::Objects->find calls in list context

Julian Maurice julian.maurice at biblibre.com
Wed Dec 13 15:07:11 CET 2017


Ok, but the proposed fix doesn't fix this code:

@a = scalar Koha::Patrons->find('foo');
if (@a) { # still equals to 1
  say $a[0]->borrowernumber; # still BOOM
}

And yes, that was the link ;)

Le 13/12/2017 à 14:58, Jonathan Druart a écrit :
> Hi Julian,
> 
> 
>> @a = Koha::Patrons->find('foo'); # would result in @a = (undef)
> 
> And that leads to issues:
> if ( @a ) { # = 1
>   say $a[0]->borrowernumber; # BOOM
> }
> 
> See also https://perlmaven.com/how-to-return-undef-from-a-function (was
> it the link you were talking about?)
> 
> Cheers,
> Jonathan
> 
> On Wed, 13 Dec 2017 at 10:34 Julian Maurice <julian.maurice at biblibre.com
> <mailto:julian.maurice at biblibre.com>> wrote:
> 
>     Hi developers,
> 
>     I stumbled upon a line of code recently and I can't figure out why it
>     has be done this way. I hope you can help me :)
> 
>     The line in question is in Koha::Objects::find:
> 
>         croak 'Cannot use "->find" in list context' if wantarray;
> 
>     I read the two bugs (18539 and 18179) and the link given by Jonathan but
>     I still don't understand why the call in list context has been
>     forbidden. Why not simply return undef (an explicit undef) when no
>     records have be found ? It would work as expected in scalar and list
>     contexts.
> 
>     Here is a possible rewrite of 'find' to better explain what I mean:
> 
>         sub find {
>             my ( $self, @pars ) = @_;
> 
>             my $object = undef;
> 
>             @pars = grep { defined } @pars;
>             if (@pars) {
>                 my $result = $self->_resultset()->find(@pars);
>                 if ($result) {
>                     $object =
>     $self->object_class()->_new_from_dbic($result);
>                 }
>             }
> 
>             return $object;
>         }
> 
>     @a = Koha::Patrons->find('foo'); # would result in @a = (undef)
>     {a => K::P->find('foo'), b => 'bar'}; # would result in {a => undef, b
>     => 'bar'}
> 
>     Please tell me what you think.
> 
>     --
>     Julian Maurice <julian.maurice at biblibre.com
>     <mailto:julian.maurice at biblibre.com>>
>     BibLibre
>     _______________________________________________
>     Koha-devel mailing list
>     Koha-devel at lists.koha-community.org
>     <mailto:Koha-devel at lists.koha-community.org>
>     http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-devel
>     website : http://www.koha-community.org/
>     git : http://git.koha-community.org/
>     bugs : http://bugs.koha-community.org/
> 

-- 
Julian Maurice <julian.maurice at biblibre.com>
BibLibre


More information about the Koha-devel mailing list