Back  Index  Next

Conditional Statements


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').
32-33  117-119,126-128  80-83

Carefully note the position of the braces and the indentation. This is the "O'Reilly Standard". 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 tabs. Tabs are usually set at 4.

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++.

'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!
139-140  126-128  80-84

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
31-32  57-58  81-82

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


==         numeric equal
!=         not equal
>          greater than
<          less than
>=         greater than or equal
<=         less than or equal
31-32  51-52  81-82

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


&&      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) {
    ...
}
148-149  54,123-124  89-91

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.
33  119  80-81

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.
35-36  (189)  (101)

Exercises

  1. 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.

  2. 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.

  3. 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.

Back  Index  Next