hegotf has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks

Can anyone explain what does that do? @{$doc->{links} // []}

I don't understand the // [] part.

here is the link to entire code: https://gist.github.com/creaktive/4607326

Replies are listed 'Best First'.
Re: operation inside reference
by AnomalousMonk (Archbishop) on May 18, 2013 at 13:45 UTC

    $doc->{links} is assumed to be either an array reference or undefined. If it is undefined, the  // defined-or operator (new with Perl version 5.10, see Logical Defined-Or in perlop) will evaluate the  [] anonymous array constructor to create a reference to an empty array. The  @{ } expression will de-reference to a (possibly empty) list either the valid  $doc->{links} reference or the empty reference. (Any expression may be evaluated within a  @{ } dereference.) If the  // operator had not been available, the  || operator would probably have served as well since all genuine references are true and the undefined value is false.

Re: operation inside reference
by LanX (Saint) on May 18, 2013 at 14:21 UTC
    just to add some code example to the excellent explanation by AnomalousMonk

    DB<116> use warnings; $a=undef; print "< @{$a} >" Use of uninitialized value in array dereference at (eval 49)[multi_per +l5db.pl:644] line 2. < > DB<117> use warnings; $a=[]; print "< @{$a} >" < > DB<118> use warnings; $a=undef//[]; print "< @{$a} >" < > DB<120> use warnings; $a=[1..3]//[]; print "< @{$a} >" < 1 2 3 >

    As you can see generating a list from an nonexistent or undef value causes a warning!

    Defaulting to an empty array solves this issue.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

Re: operation inside reference
by hegotf (Novice) on May 18, 2013 at 14:49 UTC

    Thanks for your help :)