Section 3.5. Interpolating Arrays into Strings


3.5. Interpolating Arrays into Strings

Like scalars, array values may be interpolated into a double-quoted string. Elements of an array are automatically separated by spaces[*] upon interpolation:

[*] The separator is the value of the special $" variable, which is a space by default.

     @rocks = qw{ flintstone slate rubble };     print "quartz @rocks limestone\n";  # prints five rocks separated by spaces

There are no extra spaces added before or after an interpolated array; if you want those, you'll have to put them in yourself:

     print "Three rocks are: @rocks.\n";     print "There's nothing in the parens (@empty) here.\n";

If you forget that arrays interpolate like this, you'll be surprised when you put an email address into a double-quoted string. For historical reasons,[] this is a fatal error at compile time:

] Since you asked: Before Version 5, Perl would silently leave uninterpolated an unused arrays name in a double-quoted string. So, "fred@bedrock.edu" might be a string containing an email address. This attempt to "Do What I Mean" will backfire when someone adds a variable named @bedrock to the program; now the string becomes "fred.edu" or worse.

     $email = "fred@bedrock.edu";  # WRONG! Tries to interpolate @bedrock     $email = "fred\@bedrock.edu"; # Correct     $email = 'fred@bedrock.edu';  # Another way to do that

However, in versions of Perl 5 soon to be released as we write this, the behavior of an unseen array variable will become similar to an unseen scalar variable, i.e., replaced with an empty string with a warning if warnings are enabled. The Perl developers apparently figure that 10 years of fatality are enough warning.

A single element of an array will be replaced by its value as you'd expect:

     @fred = qw(hello dolly);     $y = 2;     $x = "This is $fred[1]'s place";    # "This is dolly's place"     $x = "This is $fred[$y-1]'s place"; # same thing

The index expression is evaluated as an ordinary expression, as if it were outside a string. It is not variable interpolated first. In other words, if $y contains the string "2*4", we're still talking about element 1, not element 7, because "2*4" as a number (the value of $y used in a numeric expression) is just plain 2.[*] If you want to follow a simple scalar variable with a left square bracket, you need to delimit the square bracket so it isn't considered part of an array reference:

[*] Of course, if you've got warnings turned on, Perl is likely to remind you that "2*4" is a funny-looking number.

     @fred = qw(eating rocks is wrong);     $fred = "right";               # we are trying to say "this is right[3]"     print "this is $fred[3]\n";    # prints "wrong" using $fred[3]     print "this is ${fred}[3]\n";  # prints "right" (protected by braces)     print "this is $fred"."[3]\n"; # right again (different string)     print "this is $fred\[3]\n";   # right again (backslash hides it)



Learning Perl
Learning Perl, 5th Edition
ISBN: 0596520107
EAN: 2147483647
Year: 2003
Pages: 232

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net