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

> Considered by who?

Various style guides, most prominently Perl Best Practices comes to mind where IIRC arrays need to have plural names, while scalars are singular.

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

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

Replies are listed 'Best First'.
Re^5: Implicit references? module -> feature -> pragma -> "Perl8" ?
by hippo (Archbishop) on May 13, 2026 at 09:16 UTC
    for my $sheep (@sheep) { $sheep->say ('Baa!') };

    Which rule wins here?


    🦛

      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.