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

#!/usr/bin/perl use v5.22; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump); my @n = 1..2; sub load {return my @a unless @n; push @a, @n; @a } say "$_ ", dump([load()]) for 1..10; =pod 1 [1, 2] 2 [1, 2, 1, 2] 3 [1, 2, 1, 2, 1, 2] 4 [1, 2, 1, 2, 1, 2, 1, 2] 5 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 6 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 7 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 8 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 9 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 10 [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-l +inux-gnu-thread-multi =cut

Surely @a is local to sub load?

Replies are listed 'Best First'.
Re: Surely @a is local to sub load?
by choroba (Cardinal) on Jun 26, 2016 at 23:07 UTC
    You can get the same results without return:
    sub load { my @a unless @n; push @a, @n; @a }

    Now read the note in Statement Modifiers:

    > The behaviour of a my, state, or our modified with a statement modifier conditional or loop construct (for example, my $x if ... ) is undefined.

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      Don't do that. As you mentioned, my @a unless @n; is officially undefined behaviour. Instead, use

      { my @a; sub load { push @a, @n; @a } }
      or
      use feature qw( state ); sub load { state $a = []; push @$a, @n; @$a }
        > Don't do that.

        That was my point. I should have made myself clearer.

        ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
      Thanks!