Simple Statements
Compound Statements
if and unless Statements
Loop Statements
Bare Blocks
goto
Global Declarations
Scoped Declarations
Pragmas
A Perl program consists of a sequence of declarations and statements. A declaration may be placed anywhere a statement may be placed, but its primary effect occurs at compile time. A few declarations do double duty as ordinary statements, but most are totally transparent at run time. After compilation, the main sequence of statements is executed just once.
Unlike many programming languages, Perl doesn't require variables to be explicitly declared; they spring into existence upon their first use, whether you've declared them or not. If you try to use a value from a variable that's never had a value assigned to it, it's quietly treated as 0 when used as a number, as "" (the null string) when used as a string, or simply as false when used as a logical value. If you prefer to be warned about using undefined values as though they were real strings or numbers, or even to treat doing so as an error, the use warnings declaration will take care of that; see the section Section 4.9, "Pragmas" at the end of this chapter.
You may declare your variables though, if you like, using either my or our in front of the variable name. You can even make it an error to use an undeclared variable. This kind of discipline is fine, but you have to declare that you want the discipline. Normally, Perl minds its own business about your programming habits, but under the use strict declaration, the use of undeclared variables is apprehended at compile time. Again, see Section 4.9, "Pragmas".
A simple statement is an expression evaluated for its side effects. Every simple statement must end in a semicolon, unless it is the final statement in a block. In that case, the semicolon is optional--Perl knows that you must be done with the statement, since you've finished the block. But put the semicolon in anyway if it's at the end of a multiline block, because you might eventually add another line.
Even though operators like eval {}, do {}, and sub {} all look like compound statements, they really aren't. True, they allow multiple statements on the inside, but that doesn't count. From the outside, those operators are just terms in an expression, and thus they need an explicit semicolon if used as the last item in a statement.
Any simple statement may optionally be followed by a single modifier, just before the terminating semicolon (or block ending). The possible modifiers are:
The if and unless modifiers work pretty much as they do in English:if EXPR unless EXPR while EXPR until EXPR foreach LIST
$trash->take('out') if $you_love_me; shutup() unless $you_want_me_to_leave;
The while and until modifiers evaluate repeatedly. As you might expect, a while modifier keeps executing the expression as long as its expression remains true, and an until modifier keeps executing only as long as it remains false:
$expression++ while -e "$file$expression"; kiss('me') until $I_die;
The foreach modifier (also spelled for) evaluates once for each element in its LIST, with $_ aliased to the current element:
s/java/perl/ for @resumes; print "field: $_\n" foreach split /:/, $dataline;
The while and until modifiers have the usual while-loop semantics (conditional evaluated first), except when applied to a doBLOCK (or to the now-deprecated doSUBROUTINE statement), in which case the block executes once before the conditional is evaluated. This allows you to write loops like this:
See the three different do entries in Chapter 29, "Functions". Note also that the loop-control operators described later will not work in this construct, since modifiers don't take loop labels. You can always place an extra block around it to terminate early, or inside it to iterate early, as described later in the section Section 4.5, "Bare Blocks". Or you could write a real loop with multiple loop controls inside. Speaking of real loops, we'll talk about compound statements next.do { $line = <STDIN>; ... } until $line eq ".\n";
Copyright © 2001 O'Reilly & Associates. All rights reserved.