1 Logical expressions

#!/usr/local/bin/perl -w
#
# if statement
#
print "Input first value:";
$a = <STDIN> ;
chomp $a;
print "Input second value:";
$b = <STDIN> ;
chomp $b;
if ($a and $b){
      print "True\n";
} else {
      print "False\n";
}

1.2 Exercises

1) In the following expressions, input '1' (for 'true') and '0' (for 'false') as values for $a and $b. Which expressions are true? Which expressions are logically equivalent? (If you are very familiar with Boolean logic, you can skip this exercise. Otherwise, you can use either truth tables and/or the program from above.)

a) ($a and $b)
b) (not $a and $b)
c) (not ($a and $b))
d) ($a or $b)
e) ($a or not $b)
f) (not ($a or $b))
g) (not (not $a or not $b))
h) ($a and ($a or $b))   Does this really depend on $b?
i) ($a and $b and $c)
j) ($a and $b or $c)
k) ($a and ($b or $c))
l) (($a and $b) or $c)

2a) Write a script that asks someone to input their first name, last name and phone number. If the user does not type at least some characters for each of these, print "Do not leave any fields empty" otherwise print "Thank you". (Hint: if a variable is empty, its value will be "false".)
2b) Change the script so that the script prints "Thank you" if either the first name or the last name or the phone number is supplied. Print "Do not leave all fields empty" otherwise.
2c) Change the script so that only first name and last name are required. The phone number is optional.

1.3 Other logical expressions for if statements

$a eq $b # Is $a equal to $b?
$a ne $b # Is $a not equal to $b?
$a == $b # Is $a numerically equal to $b?
$a != $b # Is $a numerically unequal to $b?
$a <= $b # Is $a smaller or equal to $b?
$a >= $b # Is $a larger or equal to $b?
$a < $b # Is $a smaller than $b?
$a > $b # Is $a larger than $b?
$a le $b # Does $a come before $b in the alphabet or is equal to $b?
$a ge $b # Does $a come after $b in the alphabet or is equal to $b?
$a lt $b # Does $a come before $b in the alphabet?
$a gt $b # Does $a come after $b in the alphabet?

Note: usually "eq" and "ne" work even for numbers. So, you can use them instead of "==" and "!=".

1.4 Exercises

3) Write a program that asks a user to input a color. If the color is black or white, output "The color was black or white". If it starts with a letter that comes after "k" in the alphabet, output "The color starts with a letter that comes after "k" in the alphabet". (Optional: consider both capitalized and non-capitalized words. Note: the order of the alphabet in Unix and Perl is: symbols, numbers, upper case letters, lower case letters.)

4) (Optional Exercise) Perl evaluates expressions from left to right. Consider the following expressions:

a) if ($a++ and $b++) {}
b) if ($a++ or $b++) {}

If you print the values of $a and $b after the if statement is finished then in some cases only the value of $a is increased, in some cases both are. Try it! What is the underlying rule? The conclusion is that programming languages can behave somewhat differently than plain logic would suggest.

2 Control structures: if

#!/usr/local/bin/perl -w
#
# if statement
#
print "Do you like Perl? ";
$answer = <STDIN>;
chomp $answer;
if ($answer eq "yes"){
      print "That is great!\n";
} else {
      print "That is disappointing!\n";
}

2.1 Exercises

5) Modify the program so that it answers "That is great!" if the answer was "yes", "That is disappointing" if the answer was "no" and "That is not an answer to my question." otherwise. Use "if ... elsif ... else ...". Note that "if" and "elsif" are followed by an expression in parenthesis () and then a statement in curly brackets {}, "else" is followed only by a statement in curly brackets.

2.2 While

#!/usr/local/bin/perl -w
#
# while statement
#
$answer = "no";
while ($answer ne "yes"){
   print "Do you like Perl? ";
   $answer = <STDIN>;
   chomp $answer;
   if ($answer eq "yes") {
      print "That is great!\n";
   } else {
     print "That is not the right answer! Try again.\n";
   }
}

2.3 Exercises

6) Modify the program from above so that it asks users to "guess the lucky number". If the correct number is guessed the program stops, otherwise it continues forever.

7) Modify the program so that it asks users whether they want to guess again each time. Use two variables, $number for the number and $answer for the answer to the question whether they want to continue guessing. The program stops if the user guesses the correct number or answers "no". (In other words, the program continues as long as a user has not answered "no" and has not guessed the correct number.)

2.4 Using a counter

8) Write a program that asks five times to guess the lucky number. Use a while loop and a counter, such as

$counter = 1;
while ($counter <= 5) {
   print "Type in the $counter number\n";
   $counter++;
}

The program asks for five guesses (no matter whether the correct number was guessed or not). If the correct number is guessed, the program outputs "Good guess!\n", otherwise it outputs "Try again!\n". After the fifth guess it stops and prints "Game over.\n".

2.5 Last

9) In the previous example, insert "last;" after the "Good guess!\n" print statement. "last" will terminate the while loop so that users do not have to continue guessing after they found the number.

2.6 Setting a flag

10) Let users again guess five numbers but this time do not tell them immediately whether they were successful or not. After the while loop is finished print "The correct number was guessed\n" if the number was among the five guesses and "The correct number was not among them\n" otherwise. To implement this use a variable called $flag that is set to true (or 1) as soon as the number is guessed. After the while loop is finished, the truthvalue of $flag is evaluated in an if statement.

2.7 For

#!/usr/local/bin/perl -w
#
# for statement
#
for ($i =1; $i <= 10; $i++){
      print "$i ";
}

2.8 Exercise

11) Modify the counter program from above using a for loop so that it asks the user for five guesses and then stops. Use "last" to terminate the for loop as soon as the correct number is guessed.