Same for autovivification. Insane feature. Useful for some problems but causes many more.
Which is a shame, because perl5 semantics had some nice features too! But there’s only so much you can do with a structure whose foundation is so wacky.
Real arguments were added as of perl 5.20, which was in 2014.
In retrospect, probably 90% of my enthusiasm for python over perl was just "if you use python, you never have to think about variable sigils ever again." That and `string.split()`.
Comparably: today, in the Python world, people are praising tools like uv because now they "don't have to understand virtual environments". And continuously since the introduction of PEP 668 three years ago, people have been grumbling about the expectation to leave "externally managed environments" alone. But uv still uses virtual environments; and `venv` has been in the standard library since 2012, and the third-party `virtualenv` that it's based on has been available since 2007.
I never understood why Perl has all these crazy features. It feels like someone going "hah it would be funny if it worked like this..." but actually really implementing it.
People always said "it's because Larry Wall is a linguist!" as if it explains anything!
You always go from "this is neat" to "...but why" quickly with perl.
@array = ("a", "b", "c", "d"); # @array contains scalars
$array[0]; # use `$` for a single element
@array[0..2]; # use `@` for an array slice
@array = ( [1..5], [6..10] ); # @array now contains array references
$array[0]; # use `$` still because references are scalars
$array[0][1]; # still use `$` even when going multidimensional
@{ $array[0] }; # use `@` to dereference an array ref to array
%hash = ( a => "b", c => "d"); # % for hash of key/value pairs
$hash{a}; # `$` because you're getting a single scalar
@hash{"a","c"}; # `@` because you're getting an array of values
Where things become a bit less regular is the difference between reference and non-reference for hashes and arrays when they are top level. At the top level, you need a `->` but that becomes optional at levels below (because at levels below, they have to be references). $arrayref = [1,1,2,3,5]; # `$` because we're creating an array reference
$arrayref->[0]; # `->` because top level
$arrayref = [ [ 1 ], [ 2 ] ]; # arrayref of arrayrefs
$arrayref->[0][0]; # no second `->`
$arrayref->[0]->[0]; # ... but you can use it if you want!
And then there's stuff like getting a slice out of an arrayref $arrayref = [1,1,2,3,5];
$arrayref->@[0..3]; # oh dear. get a real array with an `@` but not at the start!
So... yeah.Yes, that's probably what I was remembering. Thanks for the exposition.
Perl originated from shell programming and inherited some of its patterns. If you ever looked at a bash script using arrays you will immediately recognize "@" to access the array as a whole and the switch to the "$" sigil to access a single element from that array. Perl was designed to make it easy for shell script writers to pick it up.