... sigh ...
The ultimate reason for that sigil table for P5 is context propagation
Take §{EXPR} = EXPR2 with § as first sigil
- a $ will evaluate EXPR2 in scalar context
- a @ or % will evaluate EXPR2 in list context
I'm always confused how Perl6 is handling that, and I can't remember it long after looking it up.
BUT this is one of the biggest obstacle for backwards compatibility.
The table is also "cheating" in the scalar column, because %$ and @$ denotes de-referencing .
Which is indeed a PITA in Perl5 and IMHO one of the top problems for beginners.
E.g. in order to pass an array to a sub we have to reference
func(\@arr);
but inside the sub we need to start fiddling with array-refs and a new syntax with plenty of arrows
sub func {
my $arr =shift;
print "First: $arr->[0]";
print "Nested List @{$arr->[0]}";
}
I would rather have preferred a new lexical pragma in Perl5 to automatically alias "$ref-form" with "@list-form of a variable.
I.e. the declaration my @arr automatically implies $arr =\@arr and (somehow) vice versa.
Like this $arr[0] and $arr->[0] would lead to the same result and many arrows could be saved.
This would come with the cost of fusing the namespace for scalars and arrays, but
- using the same symbol arr for different vars is considered bad style anyway
- it'll stay fully compatible to old code, by simply avoiding the pragma
Perl inherited this dilemma from Perl4 where the list form of @arr was very convenient, but most other dynamic languages I know operate with the ref form (without sigil) by default.
arr=[] is a ref/obj in JS, Python and Ruby
If these languages need the flattened list form of arr they apply a method or a postfix syntax. You could say everything is a scalar there.
|