PrevIndexNext
Conditional Statements
Branching in Perl is similar to C:
print "Name? ";
$name = <STDIN>;
chop $name;
if ($name eq "Joe") {
print "hey Joe!\n";
}
The above code asks a question ("Is the name equal to 'Joe'???).
If the answer is yes, the statement(s) between the curly braces
will be executed. If the answer is no, nothing will happen
and execution will continue with the statement after the closing
brace.
Another example:
if ($name eq "Joe") {
print "hey Joe!\n";
$x = 4;
print "yes\n";
}
else {
print "nice to meet you!
$x = 5;
print "indeed\n";
}
Here we have multiple statements inside the braces.
And there is a separate group of statements in case
the answer were no (this is called the 'else clause').
Carefully note the position of the braces and the indentation.
This is the "O'Reilly Standard" (and fully explained in the excellent
book "Perl Best Practices", by Damian Conway).
Use it. This is one of
the few things about which it is a good thing to be obsessive compulsive.
Indentation is most easily accomplished with the tab key.
Tabs are usually set at 4. NOTE! - You should not actually put a tab
character in your file. Have your editor expand tabs to spaces.
Here are the needed configurations for the .exrc file for vi:
set ai ts=4 sw=4 et
Note that unlike C/C++ or Java, braces are required even if
there is only one statement within the condition.
If you think this is annoying, you are right and rest assured
that Perl has an answer to your annoyance - but not just yet.
Here is the full conditional:
if ($name eq "Joe") {
...
}
elsif ($name eq "Mary") {
...
}
elsif ($name eq "Charlie") {
...
}
else {
...
}
This presents a list of questions to ask.
The first one to which you can answer yes is the
one that is chosen. The corresponding statements will
be executed and then the program will continue with
the statement following the else clause.
There is no 'switch' statement in Perl as there is in C/C++.
(2012 update - actually there is a switch statement as of Perl 5.10).
'if' statements can be nested as shown here:
#
# get $name and $city
#
if ($name eq "Joe") {
print "Greetings, Joe\n";
if ($city eq "Santa Cruz") {
print "I live in Santa Cruz, too!\n";
}
}
Perl has no limit to how deep the nesting can be.
The only limit is your imagination and patience!
String Comparision Operators
In addition to 'eq' as shown above there are also
these operators to ask questions inside the 'if' condition:
eq equal
ne not equal
gt greater than
lt less than
ge greater than or equal
le less than or equal
This does character by character ASCII comparision
just like dictionary order. Even if the things you are
comparing are numbers these operators will still do
a character by character comparison.
Numeric Comparison Operators
Comparing numbers is different than comparing strings:
== numeric equal
!= not equal
> greater than
< less than
>= greater than or equal
<= less than or equal
You must be aware of what kind of comparision you are doing!!!
For example:
$x = 11;
$y = 9;
if ($x lt $y) {
print "yes $x lt $y\n"; # this prints
}
if ($x < $y) {
print "yes $x < $y\n"; # this does not
}
Boolean Operators
There are several ways to construct a boolean:
&& and both '&&' and 'and' are used
the latter is often more readable
|| or
! not
if ($x < $y and not ($a gt $b)) {
print "hah!\n";
}
The questions inside the if statements can be as
complex as they need to be. If it doesn't seem to be
working as you expected it to try putting in parentheses to
more precisely state what you want.
How do you ask if a number is between two others?
e.g. In Perl how do you ask if a number is between 1 and 10?
This will not work:
if (1 <= $num <= 10) { # will give an error!
...
}
You have to do this:
if (1 <= $num and $num <= 10) {
...
}
True and False in Perl
One can ask whether a plain variable is true or not.
$finished = 0;
$done = 1;
if ($finished) {
...
}
if ($done) {
...
}
Four things are FALSE:
- 0
- "0"
- "" (the empty string)
- undef (the value of an uninitialized variable)
Everything else is TRUE.
Again, as we noted before,
Perl generally does what you want and expect it to do.
undef
Uninitialized variables appearing for the first
time (not in an assignment statement) have
the value of 'undef' - a perl keyword.
As a string it is the same as the empty string.
As a number it is treated as zero.
As a logical value it is false.
Exercises
-
Mimic a waitress taking an order in a restaurant.
With certain meals you get a choice of soup or salad.
With others you get choice of potato.
If salad, choice of dressing.
Two choices of soup.
If baked potato - butter, sour cream, chives.
Make it simple at first, then elaborate, if time.
Print the final order in some form.
-
Pretend you are a ticket seller at the movies.
Ask the person their name and age.
Children 2 and under are free, 3 through 12 is one price,
teenagers another price, and seniors yet another.
Everyone else pays the standard rate.
Greet them and tell them what price they need to pay.
If you accomplished that okay try a fun twist:
If the person's name is "Pearl" and she is middle aged
ask for the magic and secret password.
If she knows it she gets in free otherwise she pays double
the standard rate.
-
For the mathematically inclined:
Redo the quadratic formula exercise in the previous section.
Test to see whether the value underneath the square root
is negative. If so, print complex numbers as a solution.
Print them with separate real and imaginary parts.
PrevIndexNext