Hi David,
I'm not sure if I understand your problem ...
... the call foo("a") is exactly doing what I expect, i.e. @_ == 1
Anything else - like pushing an optional $that into @_ - wouldn't really be backwards compatible.
And the number you seem to want is static, it's the sum of obligatory arguments + defaulted ones.
(maybe you want to make a feature request to be able to introspect the signature)
FWIW, when interested you can look into the implementation with B::Deparse ...
# https://perlmonks.org/?node_id=11119273
use strict;
use warnings;
use feature qw(signatures);
no warnings qw(experimental::signatures);
use B::Deparse;
use Test::More;
sub foo ($this, $that='bar') {
return scalar @_;
}
is(
foo(1),
1,
"one arg"
);
is(
foo(1,2),
2,
"two args"
);
done_testing();
warn "Show implementation:\n", B::Deparse->new()->coderef2text(\&foo);
C:/Perl_524/bin\perl.exe -w d:/exp/pm_signatures.pl
ok 1 - one arg
ok 2 - two args
1..2
Show implementation:
{
BEGIN {${^WARNING_BITS} = "\x54\x55\x55\x55\x55\x55\x55\x55\x55\x5
+5\x55\x55\x55\x55\x54\x55\x05"}
use strict;
use feature 'signatures';
die sprintf("Too many arguments for subroutine at %s line %d.\n",
+(caller)[1, 2]) unless @_ <= 2;
die sprintf("Too few arguments for subroutine at %s line %d.\n", (
+caller)[1, 2]) unless @_ >= 1;
my $this = $_[0];
my $that = @_ >= 2 ? $_[1] : 'bar';
();
return scalar @_;
} at d:/exp/pm_signatures.pl line 32.
Compilation finished at Tue Jul 14 14:25:41
UPDATE
expanded code with tests
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.