Picking Up Perl
Copyright 1998, 1999, 2001 Bradley M. Kuhn.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.1 or any later
version published by the Free Software Foundation; with Invariant Sections being
"The GNU Free Documentation License", with no Front-Cover Texts, and
with no Back-Cover Texts. A copy of the license is included in the section
entitled "GNU Free Documentation License" (see GNU
Free Documentation License).
Node:Top, Next:Preface, Previous:(dir), Up:(dir)
Node:Preface, Next:Getting Started, Previous:Top, Up:Top
Preface
Node:Purpose of this Book,
Next:Acknowledgments, Previous:Preface, Up:Preface
Purpose of this Book
This book has been created for a number of reasons. The primary reason is to
provide a freely redistributable tutorial for the Perl language. In writing this
freely redistributable tutorial, it is our hope that the largest number of
people can have access to it and share it.
In the Perl community, we have discovered ways to save time by writing Perl
programs that make our jobs and lives easier. Surely, Perl is not a panacea, but
it has certainly made our lives a little bit better. It is hoped that you can
use Perl to make your jobs and lives easier, too.
Node:Acknowledgments, Next:Obtaining the Most Recent Version, Previous:Purpose of this Book, Up:Preface
Acknowledgments
Thanks to all those who sent grammar fixes and feedback over the years. There
are far too many of you to name here, but I have tried to list you all in the
THANKS file that comes with the transparent copy of this book.
Node:Obtaining the Most Recent
Version, Next:Audience, Previous:Acknowledgments, Up:Preface
Obtaining the Most Recent Version
This book is still under development. The most recent version can be obtained
at http://www.ebb.org/PickingUpPerl.
Node:Audience, Next:Material Covered, Previous:Obtaining the Most Recent Version, Up:Preface
Audience
This book does not that assume any prior knowledge of Perl. However, a reader
familiar with standard computer science concepts such as abstraction, stacks,
queues, and hash tables will definitely find her1 way through this book with ease. In other words,
anyone with a knowledge equivalent to a first-year of college computer science
courses should find this book very basic. Those of less experience may find this
book challenging.
Node:Material Covered, Next:Conventions Used in this Book, Previous:Audience, Up:Preface
Material Covered
The material covered in this book is designed to prepare the reader to enter
the world of Perl programming. This book covers the basic data and control
structures of Perl, as well as the philosophies behind Perl programming. The
native search patterns used in Perl, called regular expressions, are introduced
and discussed.
These concepts are introduced through the use of examples. It is hoped that
readers find these examples fun.
Node:Conventions Used in this
Book, Previous:Material Covered, Up:Preface
Conventions Used in this Book
In this text, a variety of conventions are used to explain the material.
Certain typographical and display elements are used for didactic purposes.
Any Perl code that is included directly in flowing text appears like this:
$x = 5. Any operating system commands discussed in flowing text
appear like this: program. Operating system files that are
discussed directly in the flowing text appear like this: file. When
a technical term of particular importance is first introduced and explained, it
appears in emphasized text, like this: an important term.
When Perl code examples or operating system commands need to be separated
away from the flowing text for emphasis, or because the code is long, it appears
like this: my $x = "foo"; # This is a Perl assignment
print $x, "\n"; # Print out "foo" and newline
All Perl code shown in this manner will be valid in Perl, version
5.6.0. In most cases, you can paste code from one of these sections
into a Perl program, and the code should work, even under use
strict and use warnings.
Sometimes, it will be necessary to include code that is not valid Perl. In
this case, a comment will appear right after the invalid statement indicating
that it is not valid, like this: $x = "foo; # INVALID: a " character is missing
When code that we set aside forms an entire Perl program that is
self-contained, and not simply a long example code section, it will appear like
this: #!/usr/bin/perl
use warnings;
use strict;
print "Hello World\n";
Finally, when text is given as possible output that might be given as error
messages when perl is run, they will appear like this: Semicolon seems to be missing
syntax error
Keep these standards in mind as you read this book.
Node:Getting Started, Next:Working with Scalars, Previous:Preface, Up:Top
Getting Started
This chapter begins the introduction to Perl by giving a simple code example.
We do not expect the reader to understand this example completely (yet). We
present this example to ease the reader into Perl's syntax and semantics.
Node:A First Perl Program,
Next:Expressions, Previous:Getting Started, Up:Getting Started
A First Perl Program
So, to begin our study of Perl, let us consider a small Perl program. Do not
worry that you are not familiar with all the syntax used here. The syntax will
be introduced more formally as we continue on through this book. Just try to
infer the behavior of the constructs below as best you can.
For our first Perl program, we will ask the user their username, and print
out a message greeting the user by name. #!/usr/bin/perl
use strict; # important pragma
use warnings; # another important pragma
print "What is your username? "; # print out the question
my $username; # "declare" the variable
$username = <STDIN>; # ask for the username
chomp($username); # remove "new line"
print "Hello, $username.\n"; # print out the greeting
# Now we have said hello to our user
Let us examine this program line by line to ascertain its meaning. Some
hand-waving will be necessary, since some of the concepts will not be presented
until later. However, this code is simple enough that you need not yet
understand completely what each line is doing.
The first line is how the program is identified as a Perl program. All Perl
programs should start with a line like #!/path/perl.
Usually, it is just #!/usr/bin/perl. You should put this line at
the top of each of your Perl programs.
In the lines that follow, halfway through each line, there is a
# character. Everything from the # character until the
end of the line is considered a comment. You are not required to
comment each line. In fact, commenting each line is rare. However, you will find
in this text that we frequently put comments on every line, since we are trying
to explain to the reader exactly what each Perl statement is doing. When you
write Perl programs, you should provide comments, but you need not do so as
verbosely as we do in this text.
Note, too, that comments can also occur on lines by themselves. The last line
of the program above is an example of that.
Now, consider the code itself, ignoring everything that follows a
# character. Notice that each line (ignoring comments) ends with a
;. This is the way that you tell Perl that a statement
is complete. We'll talk more about statements soon; for now, just consider a
statement to be a single, logical command that you give to Perl.
The first line, use strict, is called a pragma in
Perl. It is not something that "explicitly" gets executed, from your point of
view as the programmer. Instead, a pragma specifies (or changes) the rules that
Perl uses to understand the code that follows. The use strict;
pragma enforces the strictest possible rules for compiling the code. You should
always use this pragma while you are still new to Perl, as it will help you find
the errors in your code more easily.
The second line is another pragma, use warnings. This pragma
tells Perl that you'd like to be warned as much as possible when you write code
that might be questionable. Certain features of Perl can confuse new (and
sometimes even seasoned) Perl programmers. The use warnings pragma,
like use strict, is a way to tell Perl that you'd like to be warned
at run-time when certain operations seem questionable.
So, you might wonder why two separate pragmas are needed. The reason is that
they are enforced by Perl at different times. The use strict pragma
enforces compile-time constraints on the program source code. You can even test
them without running the program by using perl -c
filename, where filename is the file containing
your program. That option does not run your program, it merely checks that they
syntax of your program is correct. (To remember this, remember that the letter
c in -c stands for "check the program".)
By contrast, the use warnings pragma controls run-time behavior.
With use warnings, messages could be printed while your program
runs, if Perl notices something wrong. In addition, different inputs to the
program can cause different messages to be printed (or suppress such messages
entirely).
The third line is the first statement of the program the performs an action
directly. It is a call to Perl's built-in print function. In this
case, it is taking a string (enclosed in double quotes) as its argument, and
sending that string to the standard output, which is, by default, the terminal,
window, or console from which the program is run.
The next line is a variable declaration. When in
strict mode (set by the use strict pragma), all
variables must be declared. In this case, Perl's my keyword is
used to declare the variable $username. A variable like
$username that starts with a $ is said to be a
scalar variable. For more information on scalar variables, see Working
with Scalars. For now, just be aware that scalar variables can hold strings.
The next line, $username = <STDIN> is an assignment
statement, which is denoted by the =. The left hand side of the
assignment is that scalar variable, $username, that we declared in
the line before it. Since $username is on the left hand side of the
=, that indicates $username will be assigned a new
value by this assignment statement.
The right hand side of the assignment is a construct that allows us to get
input from the keyboard, the default standard input. STDIN is
called a file handle that represents the standard input. We will
discuss more about file handles later. For now, just remember that the construct
<STDIN>, when assigned to a scalar variable, places the next
line of standard input into that scalar variable.
Thus, at this point, we have the next line of the input (which is hopefully
the username that we asked for), in the $username variable. Since
we got the contents of $username from the standard input, we know
that the user hit return after typing her username. The return key inserts a
special character, called newline, at the end of the line. The
$username variable contains the full contents of the line, which is
not just the user's name, but also that newline character.
To take care of this, the next thing we do is chomp($username).
Perl's built-in function, chomp, removes any newline characters
that are on the end of a variable. So, after the chomp operation,
the variable $username
The final statement is another print statement. It uses the
value of the $username variable to greet the user with her name.
Note that it is acceptable to use $username inside of the string to
be printed, and the contents of that scalar are included.
This ends our discussion of our small Perl program. Now that you have some
idea of what Perl programs look like, we can begin to look at Perl, its data
types, and its constructs in detail.
Node:Expressions, Previous:A First Perl Program, Up:Getting Started
Expressions, Statements, and Side-Effects
Before we begin introduce more Perl code examples, we want to explain the
ideas of an expression and a statement, and how each looks
in Perl.
Any valid "chunk" of Perl code can be considered an expression.
That expression always evaluates to some value. Sometimes, the value to which
expression evaluates is of interest to us, and sometimes it is not. However, we
always must be aware that each expression has some "value" that is the
evaluation of that expression.
Zero or more expressions to make a statement in Perl. Statements in
Perl end with a semi-colon. For example, in the Perl code we saw before, we
turned the expression, chomp($userName), into a statement,
chomp($userName); by adding a ; to the end. If it
helps, you can think about the ;s as separating sets of expressions
that you want Perl to evaluate and execute in order.
Given that every expression, even when combined into statements, evaluate to
some value, you might be tempted to ask: What does the expression
chomp($userName) evaluate to? It turns out that expression
evaluates to the total number of characters removed from the end of the variable
$userName. This is actually one of those cases where we are not
particularly interested in the evaluation result of the code. In this case, we
were instead interested in what is called the side-effect of the
expression.
The side-effect of an expression is some change that occurs as a
result of that expression's evaluation. Often, a side-effect causes some change
in the state of the running program, such as changing the value of a variable.
In the expression chomp($userName), the side-effect is that any
newline characters are removed from the end of the variable,
$username.
Let's now consider a slightly more complex statement, and look for the the
expressions and side-effect. Consider the statement, $username =
<STDIN>; from our first program. In this case, we used the
expression, <STDIN> as part of a larger expression, namely
$username = <STDIN>. The expression,
<STDIN> evaluated to a scalar value, namely a string that
represented a line from the standard input. It was of particular interest to us
the value to which <STDIN> evaluated, because we wanted to
save that value in the variable, $username.
To cause that assignment to take place, we used the larger expression,
$username = <STDIN>. The side-effect of that larger
expression is that $username contains the value that
<STDIN> evaluated to. That side-effect is what we wanted in
this case, and we ignore the value to which $username =
<STDIN> evaluates. (It turns out that it evaluates to the value
contained in $username after the assignment took place.)
The concepts of statements, expressions and side-effects will become more
clear as we continue. When appropriate, we'll point out various expression and
discuss what they evaluate to, and indicate what side-effects are of interest to
us.
Node:Working with Scalars,
Next:Arrays, Previous:Getting Started, Up:Top
Working with Scalars
Scalar data are the most basic in Perl. Each scalar datum is logically a
single entity. Scalars can be strings of characters or numbers. In Perl, you
write literal scalar strings like this:
For example, the strings "foobar" and 'baz' are
scalar data. The numbers 3, 3.5 and -1
are also scalar data.
Strings are always enclosed in some sort of quoting, the most common of which
are single quotes, '', and and double quotes, "".
We'll talk later about how these differ, but for now, you can keep in mind that
any string of characters inside either type of quotes are scalar string data.
Numbers are always written without quotes. Any numeric sequence without
quotes are scalar number data.
In this chapter, we will take a look at the variety of scalar data available
in Perl, the way to store them in variables, how to operate on them, and how to
output them.
Node:Strings, Next:Numbers, Previous:Working with Scalars, Up:Working with Scalars
Strings
Any sequence of ASCII characters put together as one unit, is
a string. So, the word the is a string. This sentence is a string.
Even this entire paragraph is a string. In fact, you could consider the text of
this entire book as one string.
Strings can be of any length and can contain any characters, numbers,
punctuation, special characters (like !, #, and
%), and even characters in natural languages besides English In
addition, a string can contain special ASCII formatting
characters like newline, tab, and the "bell" character. We will discuss special
characters more later on. For now, we will begin our consideration of strings by
considering how to insert literal strings into a Perl program.
To begin our discussion of strings in Perl, we will consider how to work with
"string literals" in Perl. The word literal here refers to the fact
that these are used when you want to type a string directly to Perl. This can be
contrasted with storing a string in a variable.
Any string literal can be used as an expression. We will find this useful
when we want to store string literals in variables. However, for now, we will
simply consider the different types of string literals that one can make in
Perl. Later, we will learn how to assign these string literals to variables (see
Scalar
Variables).
Node:Single-quoted Strings,
Next:A Digression---The print Function, Previous:Strings, Up:Strings
Single-quoted Strings
String literals can be represented in primarily three ways in Perl. The first
way is in single quotes. Single quotes can be used to make sure that nearly all
special characters that might be interpreted differently are taken at "face
value". If that concept is confusing to you, just think about single quoted
strings as being, for the most part, "what you see is what you get". Consider
the following single-quoted string: 'i\o'; # The string 'i\o'
This represents a string consisting of the character i, followed
by \, followed by o. However, it is probably easier
just to think of the string as i\o. Some other languages require
you think of strings not as single chunks of data, but as some aggregation of a
set of characters. Perl does not work this way. A string is a simple, single
unit that can be as long as you would like.2
Note in our example above that 'i\o' is an expression. Like all
expressions, it evaluates to something. In this case, it evaluates to the string
value, i\o. Note that we made the expression 'i\o'
into a statement, by putting a semi-colon at the end ('i\o';). This
particular statement does not actually perform any action in Perl, but it is
still a valid Perl statement nonetheless.
Node:Special
Characters in Single-quoted Strings, Next:Newlines in Single-quoted Strings, Previous:Single-quoted Strings, Up:Single-quoted Strings
Special Characters in Single-quoted Strings
There are two characters in single quoted strings that do not always
represent themselves. This is due to necessity, since single-quoted strings
start and end with the ' character. We need a way to express inside
a single-quoted string that we want the string to contain a '
character.
The solution to this problem is to preceded any ' characters we
actually want to appear in the string itself with the backslash (\
character). Thus we have strings like this: 'xxx\'xxx'; # xxx, a single-quote character, and then xxx
We have in this example a string with 7 characters exactly. Namely, this is
the string: xxx'xxx. It can be difficult at first to become
accustomed to the idea that two characters in the input to Perl actually produce
only one character in the string itself. 3 However, just keep in mind the rules and you will
probably get used to them quickly.
Since we have used the \ character to do something special with
the ' character, we must now worry about the special cases for the
backslash character itself. When we see a \ character in a
single-quoted string, we must carefully consider what will happen.
Under most circumstances, when a \ is in a single-quoted string,
it is simply a backslash, representing itself, as most other characters do.
However, the following exceptions apply:
- The sequence
\' yields the character ' in the
actual string. (This is the exception we already discussed above).
- The sequence
\\ yields the character \ in the
actual string. In other words, two backslashes right next to each other
actually yield only one backslash.
- A backslash, by itself, cannot be placed at the end of a the single-quoted
string. This cannot happen because Perl will think that you are using the
\ to escape the closing '.
The following examples exemplify the various exceptions, and use them
properly: 'I don\'t think so.'; # Note the ' inside is escaped with \
'Need a \\ (backslash) or \?'; # The \\ gives us \, as does \
'You can do this: \\'; # A single backslash at the end
'Three \\\'s: "\\\\\"'; # There are three \ chars between ""
In the last example, note that the resulting string is Three \'s:
"\\\". If you can follow that example, you have definitely mastered how
single-quoted strings work!
Node:Newlines in Single-quoted
Strings, Next:Examples of Invalid Single-quoted Strings, Previous:Special Characters in Single-quoted Strings, Up:Single-quoted Strings
Newlines in Single-quoted Strings
Note that there is no rule against having a single-quoted string span several
lines. When you do this, the string has newline characters embedded in
it.
A newline character is a special ASCII character that indicates that a new
line should be started. In a text editor, or when printing output to the screen,
this usually indicates that the cursor should move from the end of the current
line to the first position on the line following it.
Since Perl permits the placement of these newline characters directly into
single quoted strings, we are permitted to do the following: 'Time to
start anew.'; # Represents the single string composed of:
# 'Time to' followed by a newline, followed by
# 'start anew.'
This string has a total of twenty characters. The first seven are Time
to. The next character following that is a newline. Then, the eleven
characters, start anew. follow. Note again that this is one
string, with a newline as its eighth character.
Further, note that we are not permitted to put a comment in the middle of the
string, even though we are usually allowed to place a # anywhere on
the line and have the rest of the line be a comment. We cannot do this here,
since we have yet to terminate our single-quoted string with a ',
and thus, any # character and comment following it would actually
become part of the single-quoted string! Remember that single-quotes strings are
delimited by ' at the beginning, and ' at the end, and
everything in between is considered part of the string, included newlines,
# characters and anything else.
Node:Examples of
Invalid Single-quoted Strings, Previous:Newlines in Single-quoted Strings, Up:Single-quoted Strings
Examples of Invalid Single-quoted Strings
In finishing our discussion of singled-quoted strings, consider these
examples of strings that are not legal because they violate the
exceptions we talked about above: 'You cannot do this: \'; # INVALID: the ending \ cannot be alone
'It is 5 o'clock!' # INVALID: the ' in o'clock should be escaped
'Three \'s: \\\\\'; # INVALID: the final \ escapes the ', thus
# the literal is not terminated
'This is my string; # INVALID: missing close quote
Sometimes, when you have invalid string literals such as in the example
above, the error message that Perl gives is not particularly intuitive. However,
when you see error messages such as: (Might be a runaway multi-line '' string starting on line X)
Bareword found where operator expected
Bareword "foo" not allowed while "strict subs" in use
It is often an indication that you have runaway or invalid strings. Keep an
eye out for these problems. Chances are, you will forget and violate one of the
rules for single-quoted strings eventually, and then need to determine why you
are unable to run your Perl program.
Node:A Digression---The print
Function, Next:Double-quoted Strings, Previous:Single-quoted Strings, Up:Strings
A Digression--The print Function
Before we move on to our consideration of double-quoted strings, it is
necessary to first consider a small digression. We know how to represent strings
in Perl, but, as you may have noticed, the examples we have given thus far do
not do anything interesting. If you try placing the statements that we listed as
examples in Single-quoted
Strings, into a full Perl program, like this: #!/usr/bin/perl
use strict;
use warnings;
'Three \\\'s: "\\\\\"'; # There are three \ chars between ""
'xxx\'xxx'; # xxx, a single-quote character, and then xxx
'Time to
start anew.';
you probably noticed that nothing of interest happens. Perl gladly runs this
program, but it produces no output.
Thus, to begin to work with strings in Perl beyond simple hypothetical
considerations, we need a way to have Perl display our strings for us. The
canonical way of accomplishing this in Perl is to use the print
function.
The print function in Perl can be used in a variety of ways. The
simplest form is to use the statement print STRING;, where
STRING is any valid Perl string.
So, to reconsider our examples, instead of simply listing the strings, we
could instead print each one out: #!/usr/bin/perl
use strict;
use warnings;
print 'Three \\\'s: "\\\\\"'; # Print first string
print 'xxx\'xxx'; # Print the second
print 'Time to
start anew.
'; # Print last string, with a newline at the end
This program will produce output. When run, the output goes to what is called
the standard output. This is usually the terminal, console or window
in which you run the Perl program. In the case of the program above, the output
to the standard output is as follows: Three \'s: "\\\"xxx'xxxTime to
start anew.
Note that a newline is required to break up the lines. Thus, you need to put
a newline at the end of every valid string if you want your string to be the
last thing on that line in the output.
Note that it is particularly important to put a newline on the end of the
last string of your output. If you do not, often times, the command prompt for
the command interpreter that you are using may run together with your last line
of output, and this can be very disorienting. So, always
remember to place a newline at the end of each line, particularly on your last
line of output.
Finally, you may have noticed that formatting your code with newlines in the
middle of single-quoted strings hurts readability. Since you are inside a
single-quoted string, you cannot change the format of the continued lines within
the print statement, nor put comments at the ends of those lines because that
would insert data into your single-quoted strings. To handle newlines more
elegantly, you should use double-quoted strings, which are the topic of the next
section.
Node:Double-quoted Strings,
Previous:A Digression---The print Function, Up:Strings
Double-quoted Strings
Double-quoted strings are another way of representing scalar string literals
in Perl. Like single-quoted strings, you place a group of ASCII
characters between two delimiters (in this case, our delimiter is
"). However, something called interpolation happens when
you use a double-quoted string.
Node:Interpolation in
Double-quoted Strings, Next:Examples of Interpolation, Previous:Double-quoted Strings, Up:Double-quoted Strings
Interpolation in Double-quoted Strings
Interpolation is a special process whereby certain special strings written in
ASCII are replaced by something different. In Single-quoted
Strings, we noted that certain sequences in single-quoted strings (namely,
\\ and \') were treated differently. This is very
similar to what happens with interpolation. For example, in interpolated
double-quoted strings, various sequences preceded by a \ character
act different.
Here is a chart of the most common of these:
| String
| Interpolated As
|
\\
| an actual, single backslash character
|
\$
| a single $ character
|
\@
| a single @ character
|
\t
| tab
|
\n
| newline
|
\r
| hard return
|
\f
| form feed
|
\b
| backspace
|
\a
| alarm (bell)
|
\e
| escape
|
\033
| character represented by octal value, 033
|
\x1b
| character represented by hexadecimal value, 1b
|
Node:Examples of Interpolation,
Next:Examples of Interpolation (ASCII Octal Values), Previous:Interpolation in Double-quoted Strings, Up:Double-quoted Strings
Examples of Interpolation
Let us consider an example that uses a few of these characters: #!/usr/bin/perl
use strict;
use warnings;
print "A backslash: \\\n";
print "Tab follows:\tover here\n";
print "Ring! \a\n";
print "Please pay bkuhn\@ebb.org \$20.\n";
This program, when run, produces the following output on the screen: A backslash: \
Tab follows: over here
Ring!
Please pay bkuhn@ebb.org $20.
In addition, when running, you should hear the computer beep. That is the
output of the \a character, which you cannot see on the screen.
However, you should be able to hear it.
Notice that the \n character ends a line. \n should
always be used to end a line. Those students familiar with the C language will
be used to using this sequence to mean newline. When writing Perl,
the word newline and the \n character are roughly
synonymous.
Node:Examples
of Interpolation (ASCII Octal Values), Next:Examples of Interpolation (ASCII Hex Values), Previous:Examples of Interpolation, Up:Double-quoted Strings
Examples of Interpolation (ASCII Octal Values)
With the exception of \n, you should note that the interpolated
sequences are simply shortcuts for actually ASCII characters that
can be expressed in other ways. Specifically, you are permitted to use the
actual ASCII codes (in octal or hexadecimal) to represent
characters. To exemplify this, consider the following program: #!/usr/bin/perl
use strict;
use warnings;
print "A backslash: \134\n";
print "Tab follows:\11over here\n";
print "Ring! \7\n";
print "Please pay bkuhn\100ebb.org \04420.\n";
This program generates exactly the same output as the program we first
discussed in this section. However, instead of using the so-called "shortcuts"
for the ASCII values, we wrote each character in question using
the octal value of that character. Comparing the two programs should provide
some insight into the use of octal values in double-quoted strings.
Basically, you simply write \XYZ, where XYZ is the
octal number of the ASCII character desired. Note that you don't
always need to write all three digits. Namely, notice that the double-quoted
string, "Ring! \7\n", did not require all the digits. This is
because in the string, the octal value is immediately followed by another
\, and thus Perl could figure out what we meant. This is one of the
many cases where you see Perl trying to "do the right thing" when you do
something that is technically not completely legal.
However, note that, in the last string, the three digits are required for the
sequence ("\04420"), because the 20 immediately
following the octal code could be easily confused with the octal value preceding
it. The point, however, is that as long as you obey the rules for doing so, you
can often add characters to your double-quoted strings by simply using the
ASCII value.
Node:Examples of
Interpolation (ASCII Hex Values), Next:Characters Requiring Special Consideration, Previous:Examples of Interpolation (ASCII Octal Values), Up:Double-quoted Strings
Examples of Interpolation (ASCII Hex Values)
You need not use only the octal values when interpolating
ASCII characters into double-quoted strings. You can also use the
hexadecimal values. Here is our same program using the hexadecimal values this
time instead of the octal values: #!/usr/bin/perl
use strict;
use warnings;
print "A backslash: \x5C\n";
print "Tab follows:\x09over here\n";
print "Ring! \x07\n";
print "Please pay bkuhn\x40ebb.org \x2420.\n";
As you can see, the theme of "there's more than one way to do it" is really
playing out here. However, we only used the ASCII codes as a
didactic exercise. Usually, you should use the single character sequences (like
\a and \t), unless, of course, you are including an
ASCII character that does not have a shortcut, single character
sequence.
Node:Characters
Requiring Special Consideration, Previous:Examples of Interpolation (ASCII Hex Values), Up:Double-quoted Strings
Characters Requiring Special Consideration
The final issue we have yet to address with double-quoted strings is the use
of $ and @. These two characters must always be
quoted. The reason for this is not apparent now, but be sure to keep this rule
in mind until we learn why this is needed. For now, it is enough to remember
that in double-quoted strings, Perl does something special with $
and @, and thus we must be careful to quote them. (If you cannot
wait to find out why, you should read Scalar
Interpolation and Array
Interpolation.
Node:Numbers, Next:Scalar Variables, Previous:Strings, Up:Working with Scalars
Numbers
Perl has the ability to handle both floating point and integer numbers in
reasonable ranges4.
Node:Numeric Literals, Previous:Numbers, Up:Numbers
Numeric Literals
Numeric literals are simply constant numbers. Numeric literals are much
easier to comprehend and use than string literals. There are only a few basic
ways to express numeric literals.
The numeric literal representations that Perl users are similar to those used
in other languages such as C, Ada, and Pascal. The following are a few common
examples: 42; # The number 42
12.5; # A floating point number, twelve and a half
101873.000; # 101,873
.005 # five thousandths
5E-3; # same number as previous line
23e-100; # 23 times 10 to the power of -100 (very small)
2.3E-99; # The same number as the line above!
23e6; # 23,000,000
23_000_000; # The same number as line above
# The underscores are for readability only
As you can see, there are three basic ways to express numeric literals. The
most simple way is to write an integer value, without a decimal point, such as
42. This represents the number forty-two.
You can also write numeric literals with a decimal point. So, you can write
numbers like 12.5, to represent numbers that are not integral
values. If you like, you can write something like 101873.000, which
really simply represents the integral value 101,873. Perl does not mind that you
put the extra 0's on the end.
Probably the most complex method of expressing a numeric literal is using
what is called exponential notation. These are numbers of the form b
* 10^x , where b is some decimal number, positive or negative, and x is some
integer, positive or negative. Thus, you can express very large numbers, or very
small numbers that are mostly 0s (either to the right or left of the decimal
point) using this notation. However, when you write such a number as a literal
in Perl, you must write it in the from bEx, where b
and x are the desired base and exponent, but E is the
actual character, E (or e, if you prefer). The
examples of 5E-3, 23e-100, 2.3E-99, and
23e6 in the code above show how the exponential notation can be
used.
Finally, if you write out a very large number, such as 23000000,
you can place underscores inside the number to make it more readable. 5 Thus, 23000000 is exactly the same
as
23_000_000.
Node:Printing Numeric Literals,
Previous:Numeric Literals, Up:Numeric Literals
Printing Numeric Literals
As with string literals, you can also use the print function in
Perl to print numerical literals. Consider this program: #!/usr/bin/perl
use strict;
use warnings;
print 2E-4, ' ', 9.77E-5, " ", 100.00, " ", 10_181_973, ' ', 9.87E9,
" ", 86.7E14, "\n";
which produces the output: 0.0002 9.77e-05 100 10181973 9870000000 8.67e+15
First of all, we have done something new here with print.
Instead of giving print one argument, we have given it a
number of arguments, separated by commas. Arguments are simply the parameters on
which you wish the function to operate. The print function, of
course, is used to display whatever arguments you give it.
In this case, we gave a list of arguments that included both string and
numeric literals. That is completely acceptable, since Perl can usually tell the
difference! The string literals are simply spaces, which we are using to
separate our numeric literals on the output. Finally, we put the newline at the
end of the output.
Take a close look at the numeric literals that were output. Notice that Perl
has made some formatting changes. For example, as we know, the _'s
are removed from 10_181_973. Also, those decimals and large
integers in exponential notation that were relatively reasonable to expand were
expanded by Perl. In addition, Perl only printed 100 for
100.00, since the decimal portion was zero. Of course, if you do
not like the way that Perl formats numbers by default, we will later learn a way
to have Perl format them differently (see Output
of Scalar Data).
Node:Scalar Variables, Next:Operators, Previous:Numbers, Up:Working with Scalars
Scalar Variables
Since we have now learned some useful concepts about strings and numbers in
Perl, we can consider how to store them in variables. In Perl, both
numeric and string values are stored in scalar variables.
Scalar variables are storage areas that you can use to store any scalar
value. As we have already discussed, scalar values are strings or numbers, such
as the literals that we discussed in previous sections.
You can always identify scalar variables because they are in the form
$NAME, where NAME is any string of alphanumeric
characters and underscores starting with a letter, up to 255 characters total.
Note that NAME will be case sensitive, thus
$xyz is a different variable than $xYz.
Note that the first character in the name of any scalar variable must be
$. All variables that begin with $ are always scalar.
Keep this in mind as you see various expressions in Perl. You can remember that
anything that begins with $ is always scalar.
As we discussed (see A
First Perl Program), it is best to always declare variables with the
my function. You do not need to do this if you are not using
strict, but you should always use strict until you
are an experienced Perl programmer.
The first operation we will consider with scalar variables is
assignment. Assignment is the way that we give a value from some
scalar expression to a scalar variable.
The assignment operator in Perl is =. On the left hand side of
the =, we place the scalar variable whose value we wish to change.
On the right side of the =, we place the scalar expression. (Note
that so far, we have learned about three types of scalar expressions: string
literals, numeric literals, and scalar variables).
Consider the following code segment: use strict;
my $stuff = "My data"; # Assigns "My data" to variable $stuff
$stuff = 3.5e-4; # $stuff is no longer set to "My data";
# it is now 0.00035
my $things = $stuff; # $things is now 0.00035, also.
Let us consider this code more closely. The first line does two operations.
First, using the my function, it declares the variable
$stuff. Then, in the same statement, it assigns the variable
$stuff with the scalar expression, "My data".
The next line uses that same variable $stuff. This time, it is
replacing the value of "My data" with the numeric value of
0.00035. Note that it does not matter that $stuff once
contained string data. We are permitted to change and assign it with a different
type of scalar data.
Finally, we declare a new variable $things (again, using the
my function), and use assignment to give it the value of the scalar
expression $stuff. What does the scalar expression,
$stuff evaluate to? Simply, it evaluates to whatever scalar value
is held by $stuff. In this case, that value is
0.00035.
Node:Scalar Interpolation, Next:Undefined Variables, Previous:Scalar Variables, Up:Scalar Variables
Scalar Interpolation
Recall that when we discussed double-quotes strings (see Double-quoted
Strings), we noted that we had to backslash the $ character
(e.g., "\$"). Now, we discuss the reason that this was necessary.
Any scalar variable, when included in a double-quoted string
interpolates.
Interpolation of scalar variables allows us to insert the value of a scalar
variable right into a double-quoted string. In addition, since Perl largely does
all data conversion necessary, we can often use variables that have integer and
float values and interpolate them right into strings without worry. In most
cases, Perl will do the right thing.
Consider the following sample code: use strict;
my $friend = 'Joe';
my $greeting = "Howdy, $friend!";
# $greeting contains "Howdy, Joe!"
my $cost = 20.52;
my $statement = "Please pay \$$cost.\n";
# $statement contains "Please pay $20.52.\n"
my $debt = "$greeting $statement";
# $debt contains "Howdy, Joe! Please pay $20.52.\n"
As you can see from this sample code, you can build up strings by placing
scalars inside double-quotes strings. When the double-quoted strings are
evaluated, any scalar variables embedded within them are replaced with the value
that each variable holds.
Note in our example that there was no problem interpolating
$cost, which held a numeric scalar value. As we have discussed,
Perl tries to do the right thing when converting strings to numbers and numbers
to strings. In this case, it simply converted the numeric value of
20.52 into the string value '20.52' to interpolate
$cost into the double-quoted string.
Interpolation is not only used when assigning to other scalar variables. You
can use a double-quoted string and interpolate it in any context where a scalar
expression is appropriate. For example, we could use it as part of the
print statement. #!/usr/bin/perl
use strict;
use warnings;
my $owner = 'Elizabeth';
my $dog = 'Rex';
my $amount = 12.5;
my $what = 'dog food';
print "${owner}'s dog, $dog, ate $amount pounds of $what.\n";
This example produces the output: Elizabeth's dog, Rex, ate 12.5 pounds of dog food.
Notice how we are able to build up a large string using four variables, some
text, and a newline character, all contained within one interpolated
double-quoted string. We needed only to pass one argument to
print! Recall that previously (see Printing
Numeric Literals) we had to separate a number of scalar arguments by commas
to pass them to print. Thus, using interpolation, it is very easy to build up
smaller scalars into larger, combined strings. This is a very convenient and
frequently used feature of Perl.
You may have noticed by now that we did something very odd with
$owner in the example above. Instead of using $owner,
we used ${owner}. We were forced to do this because following a
scalar variable with the character ' would confuse Perl. 6 To make it clear to Perl that we wanted to use
the scalar with name owner, we needed to enclose owner
in curly braces ({owner}).
In many cases when using interpolation, Perl requires us to do this. Certain
characters that follow scalar variables mean something special to Perl. When in
doubt, however, you can wrap the name of the scalar in curly braces (as in
${owner}) to make it clear to Perl what you want.
Note that this can also be a problem when an interpolated scalar variable is
followed by alpha-numeric text or an underscore. This is because Perl cannot
tell where the name of the scalar variable ends and where the literal text you
want in the string begins. In this case, you also need to use the curly braces
to make things clear. Consider: use strict;
my $this_data = "Something";
my $that_data = "Something Else ";
print "_$this_data_, or $that_datawill do\n"; # INVALID: actually refers
# to the scalars $this_data_
# and $that_datawill
print "_${this_data}_, or ${that_data}will do\n";
# CORRECT: refers to $this_data and $that_data,
# using curly braces to make it clear
Node:Undefined Variables,
Previous:Scalar Interpolation, Up:Scalar Variables
Undefined Variables
You may have begun to wonder: what value does a scalar variable have if you
have not given it a value? In other words, after: use strict;
my $sweetNothing;
what value does $sweetNothing have?
The value that $sweetNothing has is a special value in Perl
called undef. This is frequently expressed in English by saying
that $sweetNothing is undefined.
The undef value is a special one in Perl. Internally, Perl keeps
track of which variables your program has assigned values to and which remain
undefined. Thus, when you use a variable in any expression, Perl can inform you
if you are using an undefined value.
For example, consider this program: #!/usr/bin/perl
use strict;
use warnings;
my $hasValue = "Hello";
my $hasNoValue;
print "$hasValue $hasNoValue\n";
When this program is run, it produces the following output: Use of uninitialized value at line 8.
Hello
What does this mean? Perl noticed that we used the uninitialized (i.e.,
undefined) variable, $hasNoValue at line 8 in our program. Because
we were using warnings, Perl warned us about that use of the
undefined variable.
However, Perl did not crash the program! Perl is nice enough not to make
undefined variables a hassle. If you use an undefined variable and Perl expected
a string, Perl uses the empty string, "", in its place. If Perl
expected a number and gets undef, Perl substitutes 0
in its place.
However, when using warnings, Perl will always warn you when you
have used an undefined variable at run-time. The message will print to the
standard error (which, by default, is the screen) each time Perl encounters a
use of a variable that evaluates to undef. If you do not use
warnings, the warnings will not print, but you should probably wait
to turn off warnings until you are an experienced Perl programmer.
Besides producing warning messages, the fact that unassigned variables are
undefined can be useful to us. The first way is that we can explicitly test to
see if a variable is undefined. There is a function that Perl provides called
defined. It can be used to test if a variable is defined or not.
In addition, Perl permits the programmer to assign a variable the value
undef. The expression undef is a function provided by
Perl that we can use in place of any expression. The function undef
is always guaranteed to return an undefined value. Thus, we can take a variable
that already has a value and make it undefined.
Consider the following program: #!/usr/bin/perl
use strict;
use warnings;
my $startUndefined;
my $startDefined = "This one is defined";
print "defined \$startUndefined == ",
defined $startUndefined,
", defined \$startDefined == ",
defined $startDefined, "\n";
$startUndefined = $startDefined;
$startDefined = undef;
print "defined \$startUndefined == ",
defined $startUndefined,
", defined \$startDefined == ",
defined $startDefined, "\n";
Which produces the output: defined $startUndefined == , defined $startDefined == 1
defined $startUndefined == 1, defined $startDefined ==
Notice a few things. First, since we first declared
$startUndefined without giving it a value, it was set to
undef. However, we gave $startDefined a value when it
was declared, thus it started out defined. These facts are exemplified by the
output.
To produce that output, we did something that you have not seen yet. First,
we created some strings that "looked" like the function calls so our output
would reflect what the values of those function calls were. Then, we simply used
those functions as arguments to the print function. This is
completely legal in Perl. You can use function calls as arguments to other
functions.
When you do this, the innermost functions are called first, in their argument
order. Thus, in our print statements, first defined
$startUndefined is called, followed by defined
$startDefined. These two functions each evaluate to some value. That
value then becomes the argument to the print function.
So, what values did defined return? We can determine the answer
to this question from the printed output. We can see that when we called
defined on the variable that we started as undefined,
$startUndefined, we got no output for that call (in fact,
defined returned an empty string, ""). When we called
defined on the value that we had assigned to,
$startDefined, we got the output of 1.
Thus, from the experiment, we know that when its argument is not defined,
defined returns the value "", otherwise known as the
empty string (which, of course, prints nothing to the standard output when given
as an argument to print).
In addition, we know that when a variable is defined, defined
returns the value 1.
Hopefully, you now have some idea of what an undef value is,
and what defined does. It might not yet be clear why
defined returns an empty string or 1. If you are
particularly curious now, see A
Digression--Truth Values.
Node:Operators, Next:Output of Scalar Data, Previous:Scalar Variables, Up:Working with Scalars
Operators
There are a variety of operators that work on scalar values and variables.
These operators allow us to manipulate scalars in different ways. This section
discusses the most common of these operators.
Node:Numerical Operators, Next:Comparison Operators, Previous:Operators, Up:Operators
Numerical Operators
The basic numerical operators in Perl are like others that you might see in
other high level languages. In fact, Perl's numeric operators were designed to
mimic those in the C programming language.
First, consider this example: use strict;
my $x = 5 * 2 + 3; # $x is 13
my $y = 2 * $x / 4; # $y is 6.5
my $z = (2 ** 6) ** 2; # $z is 4096
my $a = ($z - 96) * 2; # $a is 8000
my $b = $x % 5; # 3, 13 modulo 5
As you can see from this code, the operators work similar to rules of
algebra. When using the operators there are two rules that you have to keep in
mind--the rules of precedence and the rules of
associativity.
Precedence involves which operators will get evaluated first when the
expression is ambiguous. For example, consider the first line in our example,
which includes the expression, 5 * 2 + 3. Since the multiplication
operator (*) has precedence over the addition operator
(+), the multiplication operation occurs first. Thus, the
expression evaluates to 10 + 3 temporarily, and finally evaluates
to 13. In other words, precedence dictates which operation occurs
first.
What happens when two operations have the same precedence? That is when
associativity comes into play. Associativity is either left or right 7. For example, in the expression 2 * $x /
4 we have two operators with equal precedence, * and
/. Perl needs to make a choice about the order in which they get
carried out. To do this, it uses the associativity. Since multiplication and
division are left associative, it works the expression from left to right, first
evaluating to 26 / 4 (since $x was 13),
and then finally evaluating to 6.5.
Briefly, for the sake of example, we will take a look at an operator that is
left associative, so we can contrast the difference with right associativity.
Notice when we used the exponentiation (**) operator in the example
above, we had to write (2 ** 6) ** 2, and not 2 ** 6 **
2.
What does 2 ** 6 ** 2 evaluate to? Since **
(exponentiation) is right associative, first the 6 **
2 gets evaluated, yielding the expression 2 ** 36, which
yields 68719476736, which is definitely not 4096!
Here is a table of the operators we have talked about so far. They are listed
in order of precedence. Each line in the table is one order of precedence.
Naturally, operators on the same line have the same precedence. The higher an
operator is in the table, the higher its precedence.
| Operator
| Associativity
| Description
|
| **
| right
| exponentiation
|
| *, /, %
| left
| multiplication, division, modulus
|
| +, -
| left
| addition, subtraction
|
Node:Comparison Operators, Next:Auto-Increment and Decrement, Previous:Numerical Operators, Up:Operators
Comparison Operators
Comparing two scalars is quite easy in Perl. The numeric
comparison operators that you would find in C, C++, or Java are available.
However, since Perl does automatic conversion between strings and numbers for
you, you must differentiate for Perl between numeric and string comparison. For
example, the scalars "532" and "5" could be compared
two different ways--based on numeric value or ASCII string value.
The following table shows the various comparison operators and what they do.
Note that in Perl "", 0 and undef are
false and anything else as true. (This is an over-simplified definition of true
and false in Perl. See A
Digression--Truth Values, for a complete definition.)
The table below assumes you are executing $left <OP>
$right, where <OP> is the operator in question.
| Operation
| Numeric Version
| String Version
| Returns
|
| less than
| <
| lt
| 1 iff. $left is less than $right
|
| less than or equal to
| <=
| le
| 1 iff. $left is less than or equal to $right
|
| greater than
| >
| gt
| 1 iff. $left is greater than $right
|
| greater than or equal to
| >=
| ge
| 1 iff. $left is greater than or equal to
$right
|
| equal to
| ==
| eq
| 1 iff. $left is the same as $right
|
| not equal to
| !=
| ne
| 1 iff. $left is not the same as $right
|
| compare
| <=>
| cmp
| -1 iff. $left is less than $right, 0 iff.
$left is equal to $right 1 iff.
$left is greater than $right
|
Here are a few examples using these operators. use strict;
my $a = 5; my $b = 500;
$a < $b; # evaluates to 1
$a >= $b; # evaluates to ""
$a <=> $b; # evaluates to -1
my $c = "hello"; my $d = "there";
$d cmp $c; # evaluates to 1
$d ge $c; # evaluates to 1
$c cmp "hello"; # evaluates to ""
Node:Auto-Increment and Decrement,
Next:String Operators, Previous:Comparison Operators, Up:Operators
Auto-Increment and Decrement
The auto-increment and auto-decrement operators in Perl work almost
identically to the corresponding operators in C, C++, or Java. Here are few
examples: use strict;
my $abc = 5;
my $efg = $abc-- + 5; # $abc is now 4, but $efg is 10
my $hij = ++$efg - --$abc; # $efg is 11, $abc is 3, $hij is 8
Node:String Operators, Previous:Auto-Increment and Decrement, Up:Operators
String Operators
The final set of operators that we will consider are those that operate
specifically on strings. Remember, though, that we can use numbers with them, as
Perl will do the conversions to strings when needed.
The string operators that you will see and use the most are .
and x. The . operator is string concatenation, and the
x operator is string duplication. use strict;
my $greet = "Hi! ";
my $longGreet = $greet x 3; # $longGreet is "Hi! Hi! Hi! "
my $hi = $longGreet . "Paul."; # $hi is "Hi! Hi! Hi! Paul."
Assignment with Operators
It should be duly noted that it is possible to concatenate, like in C, an
operator onto the assignment statement to abbreviate using the left hand side as
the first operand. For example, use strict;
my $greet = "Hi! ";
$greet .= "Everyone\n";
$greet = $greet . "Everyone\n"; # Does the same operation
# as the line above
This works for any simple, binary operator.
Node:Output of Scalar Data,
Next:Special Variables, Previous:Operators, Up:Working with Scalars
Output of Scalar Data
To output a scalar, you can use the print and
printf built-in functions. We have already seen examples of the
print command, and the printf command is very close to
that in C or C++. Here are a few examples: use strict;
my $str = "Howdy, ";
my $name = "Joe.\n";
print $str, $name; # Prints out: Howdy, Joe.<NEWLINE>
my $f = 3e-1;
printf "%2.3f\n", $f; # Prints out: 0.300<NEWLINE>
Node:Special Variables, Next:Summary of Scalar Operators, Previous:Output of Scalar Data, Up:Working with Scalars
Special Variables
It is worth noting here that there are some variables that are considered
"special" by Perl. These variables are usually either read-only variables that
Perl sets for you automatically based on what you are doing in the program, or
variables you can set to control the behavior of how Perl performs certain
operations.
Use of special variables can be problematic, and can often cause unwanted
side effects. It is a good idea to limit your use of these special variables
until you are completely comfortable with them and what they do. Of course, like
anything in Perl, you can get used to some special variables and not others, and
use only those with which you are comfortable.
Node:Summary of Scalar Operators,
Previous:Special Variables, Up:Working with Scalars
Summary of Scalar Operators
In this chapter, we have looked at a number of different scalar operators
available in the Perl language. Earlier, we gave a small chart of the operators,
ordered by their precedence. Now that we have seen all these operators, we
should consider a list of them again, ordered by precedence. Note that some
operators are listed as "nonassoc". This means that the given operator is not
associative. In other words, it simply does not make sense to consider
associative evaluation of the given operator.
| Operator
| Associativity
| Description
|
++, --
| nonassoc
| auto-increment and auto-decrement
|
**
| right
| exponentiation
|
*, /, %
| left
| multiplication, division, modulus
|
+, -, .
| left
| addition, subtraction, concatenation
|
<, >, <=,
>=, lt, gt, le,
ge
| nonassoc
| comparison operators
|
==, !=, <=>,
eq, ne, cmp
| nonassoc
| comparison operators
|
This list is actually still quite incomplete, as we will learn more operators
later on. However, you can always find a full list of all operators in Perl in
the perlop documentation page, which you can get to on most systems
with Perl installed by typing perldoc perlop.
Node:Arrays, Next:Control Structures, Previous:Working with Scalars, Up:Top
Arrays
Now that we have a good understanding of the way scalar data and variables
work and what can be done with them in Perl, we will look into the most basic of
Perl's natural data structures--arrays.
Node:The Semantics of Arrays,
Next:List Literals, Previous:Arrays, Up:Arrays
The Semantics of Arrays
The arrays in Perl are semantically closest to lists in Lisp or Scheme (sans
cons cells), however the syntax that is used to access arrays is closer to
arrays in C. In fact, one can often treat Perl's arrays as if they were simply C
arrays, but they are actually much more powerful than that.
Perl arrays grow and shrink dynamically as needed. The more data you put into
a Perl list, the bigger it gets. As you remove elements from the list, the list
will shrink to the right size. Note that this is inherently different from
arrays in the C language, where the programmer must keep track and control the
size of the array.
However, Perl arrays are accessible just like C arrays. So, you can subscript
to anywhere within a given list at will. There is no need to process through the
first four elements of the list to get the fifth element (as in Scheme). In this
manner, you get the advantages of both a dynamic list, and a static-size array.
The only penalty that you pay for this flexibility is that when an array is
growing very large very quickly, it can be a bit inefficient. However, when this
must occur, Perl allows you to pre-build an array of certain size. We will show
how to do this a bit later.
A Perl array is always a list of scalars. Of course, since Perl makes no
direct distinction between numeric and string values, you can easily mix
different types of scalars within the same array. However, everything in the
array must be a scalar8.
Note the difference in terminology that is used here. Arrays refer to
variables that store a list of scalar values. Lists can be written as
literals (see List
Literals) and used in a variety of ways. One of the ways that list literals
can be used is to assign to array variables (see Array
Variables). We will discuss both list literals and array variables in this
chapter.
Node:List Literals, Next:Array Variables, Previous:The Semantics of Arrays, Up:Arrays
List Literals
Like scalars, it is possible to write lists as literals right in your code.
Of course, as with inserting string literals in your code, you must use proper
quoting.
There are two primary ways to quote list literals that we will discuss here.
One is using (), and the other is using what is called a quoting
operator. The quoting operator for lists is qw. A quoting operator
is always followed by a single character, which is the "stop character". It will
eat up all the following input until the next "stop character". In the case of
qw, it will use each token that it finds as an element in a list
until the second "stop character" is reached. The advantage of the
qw operator is that you do not need to quote strings in any
additional way, since qw is already doing the quoting for you.
Here are a few examples of some list literals, using both () and
the qw operator. (); # this list has no elements; the empty list
qw//; # another empty list
("a", "b", "c",
1, 2, 3); # a list with six elements
qw/hello world
how are you today/; # another list with six elements
Note that when we use the (), we have to quote all strings, and
we need to separate everything by commas. The qw operator does not
require this.
Finally, if you have any two scalar values where all the values between them
can be enumerated, you can use an operator called the .. operator
to build a list. This is most easily seen in an example: (1 .. 100); # a list of 100 elements: the numbers from 1 to 100
('A' .. 'Z'); # a list of 26 elements: the uppercase letters From A to Z
('01' .. '31'); # a list of 31 elements: all possible days of a month
# with leading zeros on the single digit days
You will find the .. operator particularly useful with slices,
which we will talk about later in this chapter.
Node:Array Variables, Next:Manipulating Arrays and Lists, Previous:List Literals, Up:Arrays
Array Variables
As with scalars, what good are literals if you cannot have variables? So,
Perl provides a way to make array variables.
Node:Using Array Variables,
Next:Associated Scalars, Previous:Array Variables, Up:Array Variables
Array Variables
Each variable in Perl starts with a special character that identifies what
type of variable it is. We saw that scalar variables always start with a
$. Similarly, all array variables start with the character,
@, under the same naming rules that are used for scalar variables.
Of course, we cannot do much with a variable if we cannot assign things to
it, so the assignment operator works as perfectly with arrays as it did with
scalars. We must be sure, though, to always make the right hand side of the
assignment a list, not a scalar! Here are a few examples: use strict;
my @stuff = qw/a b c/; # @stuff a three element list
my @things = (1, 2, 3, 4); # @things is a four element list
my $oneThing = "all alone";
my @allOfIt = (@stuff, $oneThing,
@things); # @allOfIt has 8 elements!
Note the cute thing we can do with the () when assigning
@allOfIt. When using (), Perl allows us to insert
other variables in the list. These variables can be either scalar or array
variables! So, you can quickly build up a new list by "concatenating" other
lists and scalar variables together. Then, that new list can be assigned to a
new array, or used in any other way that list literals can be used.
Node:Associated Scalars, Previous:Using Array Variables, Up:Array Variables
Associated Scalars
Every time an array variable is declared, a special set of scalar variables
automatically springs into existence, and those scalars change along with
changes in the array with which they are associated.
First of all, for an array, @array, of n elements. There are
scalar variables $array[0], $array[1],
..., $array[n-1] that contain first, second, third,
..., nth elements in the array, respectively. The variables in
this format are full-fledged scalar variables. This means that anything you can
do with a scalar variable, you can do with these elements. This provides a way
to access array elements by subscript. In addition, it provides a way to change,
modify and update individual elements without actually using the
@array variable.
Another scalar variable that is associated to any array variable,
@array, is $#array. This variable always contains the
subscript of the last element in the array. In other words,
$array[$#array] is always the last element of the array. The length
of the array is always $#array + 1. Again, you are permitted to do
anything with this variable that you can normally do with any other scalar
variable; however, you must always make sure to leave the value as an integer
greater than or equal to -1. In fact, if you know an array is going to grow very
large quickly, you probably want to set this variable to a very high value. When
you change the value of $#array, you not only resize the array for
your use, you also direct Perl to allocate a specific amount of space for
@array.
Here are a few examples that use the associated scalar variables for an
array: use strict;
my @someStuff = qw/Hello and
welcome/; # @someStuff: an array of 3 elements
$#someStuff = 0; # @someStuff now is simply ("Hello")
$someStuff[1] = "Joe"; # Now @someStuff is ("Hello", "Joe")
$#someStuff = -1; # @someStuff is now empty
@someStuff = (); # does same thing as previous line
Node:Manipulating Arrays and
Lists, Previous:Array Variables, Up:Arrays
Manipulating Arrays and Lists
Clearly, arrays and lists are very useful. However, there are a few more
things in Perl you can use to make arrays and lists even more useful.
Node:It Slices!, Next:Functions, Previous:Manipulating Arrays and Lists, Up:Manipulating Arrays and Lists
It Slices!
Sometimes, you may want to create a new array based on some subset of
elements from another array. To do this, you use a slice. Slices use a subscript
that is itself a list of integers to grab a list of elements from an array. This
looks easier in Perl than it does in English: use strict;
my @stuff = qw/everybody wants a rock/;
my @rock = @stuff[1 .. $#stuff]; # @rock is qw/wants a rock/
my @want = @stuff[ 0 .. 1]; # @want is qw/everybody wants/
@rock = @stuff[0, $#stuff]; # @rock is qw/everybody rock/
As you can see, you can use both the .. operator and commas to
build a list for use as a slice subscript. This can be a very useful feature for
array manipulation.
Node:Functions, Next:The Context (List vs. Scalar), Previous:It Slices!, Up:Manipulating Arrays and Lists
Functions
Perl also provides quite a few functions that operate on arrays. As you learn
more and more Perl, you will see lots of interesting functions that work with
arrays.
Now, we'll discuss a few of these functions that work on arrays:
push, pop, shift, and
unshift.
The names shift and unshift are an artifact of the
Unix shells that used them to "shift around" incoming arguments.
Node:Arrays as Stacks, Next:Arrays as Queues, Previous:Functions, Up:Functions
Arrays as Stacks
What more is a stack than an unbounded array of things? This attitude is seen
in Perl through the push and pop functions. These
functions treat the "right hand side" (i.e., the end) of the array as the top of
the stack. Here is an example: use strict;
my @stack;
push(@stack, 7, 6, "go"); # @stack is now qw/7 6 go/
my $action = pop @stack; # $action is "go", @stack is (7, 6)
my $value = pop(@stack) +
pop(@stack); # value is 6 + 7 = 13, @stack is empty
Node:Arrays as Queues, Previous:Arrays as Stacks, Up:Functions
Arrays as Queues
If we can do stacks, then why not queues? You can build a queue in Perl by
using the unshift and pop functions together.9 Think of the unshift function as
"enqueue" and the pop function as "dequeue".
Here is an example: use strict;
my @queue;
unshift (@queue, "Customer 1"); # @queue is now ("Customer 1")
unshift (@queue, "Customer 2"); # @queue is now ("Customer 2" "Customer 1")
unshift (@queue, "Customer 3");
# @queue is now ("Customer 3" "Customer 2" "Customer 1")
my $item = pop(@queue); # @queue is now ("Customer 3" "Customer 2")
print "Servicing $item\n"; # prints: Servicing Customer 1\n
$item = pop(@queue); # @queue is now ("Customer 3")
print "Servicing $item\n"; # prints: Servicing Customer 2\n
This queue example works because unshift places items onto the
front of the array, and pop takes items from the end of the array.
However, be careful using more than two arguments on the unshift
when you want to process an array as a queue. Recall that unshift
places its arguments onto the array in order as they are listed in the
function call. Consider this example: use strict;
my @notAqueue;
unshift(@notAqueue, "Customer 0", "Customer 1");
# @queue is now ("Customer 0", "Customer 1")
unshift (@notAqueue, "Customer 2");
# @queue is now ("Customer 2", "Customer 0", "Customer 1")
Notice that this variable, @notAqueue, is not really a queue, if
we use pop to remove items. The moral here is to be careful when
using unshift in this manner, since it places it arguments on the
array in order.
Node:The Context (List vs.
Scalar), Next:Array Interpolation, Previous:Functions, Up:Manipulating Arrays and Lists
The Context--List vs. Scalar
It may have occurred to you by now that in certain places we can use a list,
and in other places we can use a scalar. Perl knows this as well, and decides
which is permitted by something called a context.
The context can be either list context or scalar context. Many operations do
different things depending on what the current context is.
For example, it is actually valid to use an array variable, such as
@array, in a scalar context. When you do this, the array variable
evaluates to the number of elements in the array. Consider this example: use strict;
my @things = qw/a few of my favorite/;
my $count = @things; # $count is 5
my @moreThings = @things; # @moreThings is same as @things
Note that Perl knows not to try and stuff @things into a scalar,
which does not make any sense. It evaluates @things in a scalar
context and given the number of elements in the array.
You must always be aware of the context of your operations. Assuming the
wrong context can cause a plethora of problems for the new Perl programmer.
Node:Array Interpolation,
Previous:The Context (List vs. Scalar), Up:Manipulating Arrays and Lists
Array Interpolation
Array variables can also be evaluated through interpolation into a
double-quoted string. This works very much like the interpolation of scalars
into double-quoted strings (see Scalar
Interpolation). When an array variable is encountered in a double-quoted
string, Perl will join the array together, separating each element by spaces.
Here is an example: use strict;
my @saying = qw/these are a few of my favorite/;
my $statement = "@saying things.\n";
# $statement is "these are a few of my favorite things.\n"
my $stuff = "@saying[0 .. 1] @saying[$#saying - 1, $#saying] things.\n"
# $stuff is "these are my favorite things.\n"
Note the use of slices when assigning $stuff. As you can see,
Perl can be very expressive when we begin to use the interaction of different,
interesting features.
Node:Control Structures, Next:Associative Arrays (Hashes), Previous:Arrays, Up:Top
Control Structures
The center of any imperative programming language is control structures.
Although Perl is not purely an imperative programming language, it has ancestors
that are very much imperative in nature, and thus Perl has inherited those same
control structures. It also has added a few of its own.
As you begin to learn about Perl's control structures, realize that a good
number of them are syntactic sugar. You can survive using only a subset of all
the control structures that are available in Perl. You should use those with
which you are comfortable. Obey the "hubris" of Perl, and write code that is
readable. But, beyond that, do not use any control structures that you do not
think you need.
Node:Blocks, Next:A Digression---Truth Values, Previous:Control Structures, Up:Control Structures
Blocks
The first tool that you need to begin to use control structures is the
ability to write code "blocks". A block of code could be any of the code
examples that we have seen thus far. The only difference is, to make them a
block, we would surround them with {}. use strict;
{
my $var;
Statement;
Statement;
Statement;
}
Anything that looks like that is a block. Blocks are very simple, and are
much like code blocks in languages like C, C++, and Java. However, in Perl, code
blocks are decoupled from any particular control structure. The above code
example is a valid piece of Perl code that can appear just about anywhere in a
Perl program. Of course, it is only particularly useful for those functions and
structures that use blocks.
Note that any variable declared in the block (in the example,
$var) lives only until the end of that block. With variables
declared my, normal lexical scoping that you are familiar with in
C, C++, or Java applies.
Node:A Digression---Truth Values,
Next:The if/unless Structures, Previous:Blocks, Up:Control Structures
A Digression--Truth Values
We have mentioned truth and "true and false" a few times now; however, we
have yet to give a clear definition of what truth values are in Perl.
Every expression in Perl has a truth value. Usually, we ignore the truth
value of the expressions we use. In fact, we have been ignoring them so far!
However, now that we are going to begin studying various control structures that
rely on the truth value of a given expression, we should look at true and false
values in Perl a bit more closely.
The basic rule that most Perl programmers remember is that 0,
the empty string and undef are false, and everything else is true.
However, it turns out that this rule is not actually completely accurate.
The actual rule is as follows:
Everything in Perl is true, except:
- the strings
"" (the empty string) and "0" (the
string containing only the character, 0), or any string expression that
evaluates to either "" (the empty string) or "0".
- any numeric expression that evaluates to a numeric
0.
- any value that is not defined (i.e., equivalent to
undef).
If that rule is not completely clear, the following table gives some example
Perl expressions and states whether they are true or not:
| Expression
| String/Number?
| Boolean value
|
| 0
| number
| false
|
| 0.0
| number
| false
|
| 0.0000
| number
| false
|
| ""
| string
| false
|
| "0"
| string
| false
|
| "0.0"
| string
| true
|
| undef
| N/A
| false
|
| 42 - (6 * 7)
| number
| false
|
| "0.0" + 0.0
| number
| false
|
| "foo"
| string
| true
|
There are two expressions above that easily confuse new Perl programmers.
First of all, the expression "0.0" is true. This is true because it
is a string that is not "0". The only string that is not empty that
can be false is "0". Thus, "0.0" must be true.
Next, consider "0.0" + 0.0. After what was just stated, one
might assume that this expression is true. However, this expression is
false. It is false because + is a numeric
operator, and as such, "0.0" must be turned into its numeric
equivalent. Since the numeric equivalent to "0.0" is
0.0, we get the expression 0.0 + 0.0, which evaluates
to 0.0, which is the same as 0, which is false.
Finally, it should be noted that all references are true. The topic of Perl
references is beyond the scope of this book. However, if we did not mention it,
we would not be giving you the whole truth story.
Node: |