The other alternative, if you don't want to deal with references and if there is only one array (or hash) to be passed, is to pass any and all scalars (and there can be more than one) first, and then pass the sole array (or hash). The following works the same way with or without the (@) prototype for the reason explained by CountZero (i.e., in general, don't bother with prototypes):
perl -wMstrict -le
"sub S {
my ($scalar, @ra) = @_;
;;
print qq{scalar: '$scalar' array:(@ra)};
}
;;
my @array = (1, 2, 3);
S('foo', @array);
"
scalar: 'foo' array:(1 2 3)