Сигил дает вам тип возврата контейнера. Поэтому, если что-то начинается с @
, вы знаете, что оно возвращает список. Если он начинается с $
, он возвращает скаляр.
Теперь, если после сигилы есть только идентификатор (например, $foo
или @foo
, то это простой доступ к переменной. Если за ним следует [
, это доступ к массиву, если он сопровождается {
- это доступ к хешу.
# variables
$foo
@foo
# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
# (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array
Некоторые человеческие языки имеют очень похожие понятия.
Однако многие программисты находят, что это сбивает с толку, поэтому в Perl 6 используется инвариантный символ.
В общем, компилятор Perl 5 хочет знать во время компиляции, есть ли что-то в списке или в скалярном контексте, поэтому без начального символа некоторые термины станут неоднозначными.