
![]() | ![]() |
4.1. Specifying a List in Your Program
4.1.1. Problem
You want to include a list in your
program. This is how you initialize arrays.
4.1.2. Solution
You can write out a
comma-separated list of elements:@a = ("quick", "brown", "fox");
If you have a lot of
single-word elements, use the qw( ) operator:@a = qw(Meddle not in the affairs of wizards.);
If you have a lot of multiword elements, use a here document and
extract lines:@lines = (<< "END_OF_HERE_DOC" =~ /^\s*(.+)/gm);
I sit beside the fire and think
of all that I have seen,
of meadow-flowers and butterflies
and summers that have been;
END_OF_HERE_DOC
4.1.3. Discussion
The first technique is the one most commonly used, often because only
small arrays are normally initialized as program literals.
Initializing a large array would fill your program with values and
make it hard to read, so such arrays either tend to be initialized in
a separate library file (see Chapter 12), or else
have their values read in from a file:@bigarray = ( );
open(FH, "<", "myinfo") or die "Couldn't open myinfo: $!";
while (<FH>) {
chomp;
push(@bigarray, $_);
}
close(FH);
The second technique uses qw( ), one of several
pseudo-functions in Perl used for quoting without having to resort to
actual quotation marks. This one splits its string argument on
whitespace to produce a list of words, where "words" in this instance
means strings that don't contain any whitespace. The initial argument
is not subject to interpolation of variables or (most) backslash
escape sequences.@banner = ('Costs', 'only', '$4.95');
@banner = qw(Costs only $4.95);
@banner = split(' ', 'Costs only $4.95');
You can use qw( ) only when each
whitespace-separated argument is to be a distinct element in the
return list. Be careful not to give Columbus four ships instead of
three:@ships = qw(Niña Pinta Santa María); # WRONG
@ships = ('Niña', 'Pinta', 'Santa María'); # right
The third solution takes a here document, which is a single,
multiline string, and applies a global pattern match to that string.
The pattern /^\s*(.+)/ says to skip any whitespace
at the start of the line, then capture everything through the end of
each line. The /g modifier means to apply that
match globally, and the /m modifier says to permit
^ to match not just at the beginning of the
string, but also immediately after a newline, which, in a multiline
string, is just what you need. Applying that technique to the ships
example yields:@ships = ( << "END_OF_FLOTILLA" =~ /^\s*(.+)/gm);
Niña
Pinta
Santa María
END_OF_FLOTILLA
4.1.4. See Also
The "List Value Constructors" section of
perldata(1); the "List Values and Arrays"
section of Chapter 2 of Programming Perl; the
"Quote and Quote-Like Operators" section of
perlop(1); the s/// operator
in perlop(1) and Chapter 5 of
Programming Perl
![]() | ![]() | ![]() |
4. Arrays | ![]() | 4.2. Printing a List with Commas |

Copyright © 2003 O'Reilly & Associates. All rights reserved.