home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam

2.4. 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;`