开发者

Using ampersands and parens when calling a Perl sub

开发者 https://www.devze.com 2023-03-21 00:20 出处:网络
#!/usr/bin/perl sub t { print \"in t\\n\"; print \"@_\\n\"; &s; } sub s { print \"in s\\n\"; print \"@_\\n\";
#!/usr/bin/perl

sub t {
  print "in t\n";
  print "@_\n";
  &s;
}

sub s {
  print "in s\n";
  print "@_\n";
}

t(1,2);
print "out\n";
print "@_\n";

O开发者_运维百科utput:

in t
1 2
in s
1 2
out

As you see,&s output 1 2 when no parameter is passed. Is this a feature or a bug?

Tested version is 5.8.8.


Calling a subroutine using the &NAME; syntax makes current @_ visible to it. This is documented in perlsub:

If a subroutine is called using the & form, the argument list is optional, and if omitted, no @_ array is set up for the subroutine: the @_ array at the time of the call is visible to subroutine instead. This is an efficiency mechanism that new users may wish to avoid.

So, it's definitely a feature.


When using & before the sub name and no argument list is passed, the current @_ is passed as argument instead. So, it is a feature.

Here are the different ways to call a subroutine:

NAME(LIST); # & is optional with parentheses.
NAME LIST;  # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME;      # Makes current @_ visible to called subroutine.

from perldoc perlsub


Straight from the camel's mouth:

If a subroutine is called using the ``&'' form, the argument list is optional, and if omitted, no @_ array is set up for the subroutine: the @_ array at the time of the call is visible to subroutine instead. This is an efficiency mechanism that new users may wish to avoid.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号