in reply to Re^4: Implicit references? module -> feature -> pragma -> "Perl8" ?
in thread Implicit references? module -> feature -> pragma -> "Perl8" ?

for my $sheep (@sheep) { $sheep->say ('Baa!') };

Which rule wins here?


🦛

  • Comment on Re^5: Implicit references? module -> feature -> pragma -> "Perl8" ?
  • Download Code

Replies are listed 'Best First'.
Re^6: Implicit references? module -> feature -> pragma -> "Perl8" ?
by LanX (Saint) on May 13, 2026 at 12:22 UTC
    Supposing we are talking about activated strictures and prior mine @sheep

    What I expected is a warning for the for loop

    "my" variable $sheep masks earlier declaration in same scope

    Furthermore use warnings FATAL => "shadow"; should lead to a compilation error:

    Compilation exited abnormally with code 255

    All of this is easily avoided by using plural my/mine @sheeps like suggested in PBP.

    NOW actually ...

    ... in your example, there is no conflict because of the new nested lexical scope

    (I simplified the class away, because it doesn't add much)

    use strict; use warnings FATAL => "shadow"; use feature 'say'; #use diagnostics; # - mine @sheep = (1,2,3); my @sheep; my $sheep = \@sheep; @sheep = (1,2,3); # --- for my $sheep (@sheep) { say $sheep }; say @$sheep;

    perl /home/lanx/perl/pm/sheep.pl 1 2 3 123

    I'd say, since @sheep "survives" into the nested scope, so should the array reference $sheep too.

    Hence the warning must be emitted.

    NB: for my $sheep (@$sheep) { say $sheep }; is similarly working code in current Perl (and bad style in my book)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

      Another POV would be to allow shadowing of both variants inside a nested scope. °

      Cases with recursive structures or functions may profit from this.

      (But the elements of the array would be nested arrays, not objects)

      hence

      { mine @sheeps = ( [ qw(Shaun Shirley Timmy) ], # cartoons [ qw(Dolly Daisy Debbie) ] # clones ); for mine $sheeps (@sheeps) { # mine! say @sheeps; # := @$sheeps } }

      prints

      ShaunShirleyTimmy DollyDaisyDebbie

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      see Wikisyntax for the Monastery

      °) NB this is consistent with the proposed semantics in the OP.