Variables

Not surprisingly, there are three variable types corresponding to the three abstract data types we mentioned earlier. Each of these is prefixed by what we call a funny character.[5] Scalar variables are always named with an initial $, even when referring to a scalar that is part of an array or hash. It works a bit like the English word "the". Thus, we have:

[5] That's another technical term in computer science. (And if it wasn't before, it is now.)

Construct Meaning
$days Simple scalar value $days
$days[28] 29th element of array @days
$days{'Feb'} "Feb" value from hash %days

Note that we can use the same name for $days, @days, and %days without Perl getting confused.

There are other, fancier scalar terms, useful in specialized situations that we won't go into yet. They look like this:

Construct Meaning
${days} Same as $days but unambiguous before alphanumerics
$Dog::days Different $days variable, in the Dog package
$#days Last index of array @days
$days->[28] 29th element of array pointed to by reference $days
$days[0][2] Multidimensional array
$days{2000}{'Feb'} Multidimensional hash
$days{2000,'Feb'} Multidimensional hash emulation

Entire arrays (or slices of arrays and hashes) are named with the funny character @, which works much like the words "these" or "those":

Construct Meaning
@days Array containing ($days[0], $days[1],... $days[n])
@days[3, 4, 5] Array slice containing ($days[3], $days[4], $days[5])
@days[3..5] Array slice containing ($days[3], $days[4], $days[5])
@days{'Jan','Feb'} Hash slice containing ($days{'Jan'},$days{'Feb'})

Entire hashes are named by %:

Construct Meaning
%days (Jan => 31, Feb => $leap ? 29 : 28, ...)

Any of these constructs may also serve as an lvalue, specifying a location you could assign a value to. With arrays, hashes, and slices of arrays or hashes, the lvalue provides multiple locations to assign to, so you can assign multiple values to them all at once:

@days = 1 .. 7;