Doh. If I say it with Devel::Peek I note that the first call to sub2() was compiled when the (*) prototype wasn't known and @_ wasn't coerced into a scalar. The second was compiled when perl expected there to be only a scalar so instead of sub2(@_) you have sub2( scalar @_)
sub2 returns 1 because print() returns 1. This is 100% mundane. You might try saying print print '' to see what I mean.
use Devel::Peek;
sub sub1(*) {
print STDERR "args(1)\n";
Dump($_) for @_;
sub2(@_);
}
sub sub2(*) {
print STDERR "args(2)\n";
Dump($_) for @_;
}
sub sub3(*) {
print STDERR "args(3)\n";
Dump($_) for @_;
sub2(@_);
}
sub1 Bareword;
sub3 Bareword;
sub2(@{[Bareword]});