In a way you could say there is a sigil for each ref-type, when it gets deferenced (or when it is actually used as the base type, and not a reference in a scalar),
@ => @$,
% => %$,
& => &$.
For amusement or other purpose, here is code that lets you use a hashref or hash (or arrayref or array) by blessing the former (and the ref of the latter) into an (initially) non-existent package, and then create a function in that package. The function can be called in the usual way ($blessedref->function), but can also be called with NameSpace::function(%indirectlyblessedhash) owing to the \% prototype on the function which uses the reference of that parameter.
If you use references for your data structures instead of plain hashes and arrays, and bless those references into appropriate packages (and dereference where needed), you will have the equivalent functionality to javascript array|objects. For me, at least, the requirement (softened by autobox), that objects be scalars makes sense, as scalars are for holding one value (base type or object) at a time.
use strict;
use warnings;
use Data::Dumper;
my $foo = { foo => [qw{d e f}], bar => [qw{g h i}]};
my %bar = ( foo => [qw{m n o}], bar => [qw{p q r}]);
bless $foo, 'FooStuff';
bless \%bar, 'FooStuff';
sub FooStuff::myMethod (\%) {
my $self = shift;
print Dumper($self);
}
$foo->myMethod;
FooStuff::myMethod(%bar);