in reply to Re^3: why doesn't "my ($a,$b)" return a list?
in thread why doesn't "my ($a,$b)" return a list?

It might be handy and orthogonal to implement my as a function, but I dare to question this design decision.

I can't possibly imagine any use of calling my in scalar context, since the list must be statically fixed at compile time.

Furthermore it's not intuitive, if shortening the number of my's result in these side effects. I searched for an hour to find the problem...

Perl already has the disadvantage to default to global vars while other languages automatically restrict to a local scope without extra operator...

... one shouldn't be punished for trying to economize keystrokes!

Anyway it's too late... but IMHO at least a warning should be emitted when using a my(LIST) in scalar context.

Cheers Rolf

Replies are listed 'Best First'.
Re^5: why doesn't "my ($a,$b)" return a list?
by ikegami (Patriarch) on Aug 19, 2010 at 17:54 UTC

    I can't possibly imagine any use of calling my in scalar context

    if (my $x = ...) { ... } open(my $fh, ...) read(..., my $buf, ...) my $r = \my $s;

    Perl already has the disadvantage to default to global vars while other languages automatically restrict to a local scope

    What language are you talking about? C, C++, Java, JavaScript and VB all require local declarations.

    a warning should be emitted when using a my(LIST) in scalar context.

    More precisely, my LIST with a list of more than one variables.

    Because of its side-effects, my LIST could legitimately be used in scalar context. This job may be more appropriate for a linter (Perl::Critic). But since that use is rare and easy to rewrite (into something clearer), a warning could be appropriate. Feel free to create a ticket (just need to email perlbug@perl.org).

    I only looked quickly, but my and friends might be the only builtins to return something of questionable use in scalar context.

      > What language are you talking about? C, C++, Java, JavaScript and VB all require local declarations.

      The direct competitors, Python and Ruby, but with the restriction of function-scope instead of block-scope. And PHP ¹)

      JS is very strange in this respect, requiring explicit declarations with "var" but only allowing function-scope.

      Newer JS (Mozilla) Versions have "let" which corresponds to "my" in Perl.

      > More precisely, my LIST with a list of more than one variables.

      exactly!

      Cheers Rolf

      1) updated