Specifying a List in Your Program (Perl Cookbook, 2nd Edition)

## 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

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