# Conditional Decisions

Perl conditional statements allow conditions to be evaluated or tested with a statement or statements to be executed per the condition value which can be either `true` or `false`.

Perl does not have native boolean types. However, the numeric literal 0, the strings "0" and "", the empty array `()` and `undef` are all considered `false` in the context of condition evaluation.

Below are several types of conditional statements:

• `if (condition) statement`
• `if (condition) {statement1; statement2; statement3;}`
• `if (condition) statement else statement`
• `if (condition) elsif (condition) statement else statement`
• `unless (condition) statement`
• `unless (condition) statement else statement`
• `unless (condition) elsif (condition) statement else statement`

## Ternary operator

The `?` conditional operator is a simplified method of `if (condition) statement else statement`. It has the general form of: `(condition) ? statement1 : statement2`.

First the condition is evaluated. If true, then `statement1` is executed and becomes the value of the expression, otherwise, `statement2` is executed and becomes the value of the expression.

## Equality and Comparison Operators

These operators can be used to define conditions in conditional statements. Numeric values and string values are compared using different operators

### Numeric values operators

• `==` true if the value of the left operand is equal to the value of right operand, else false
• `!=` true if the value of the left operand is not equal to the value of right operand, else false
• `!` negates the boolean value of whatever comes after this in a conditional expression
• `<=>` Compares the values of two numeric values and returns -1, 0, or 1 if the left argument is numerically less than, equal to, or greater than the right argument, respectively
• `>` true if the value of the left operand is smaller than the value of right operand, else false
• `<` true if the value of the left operand is lower than the value of right operand, else false
• `>=` true if the value of the left operand is smaller or equal than the value of right operand, else false
• `<=` true if the value of the left operand is lower or equal than the value of right operand, else false

### String values operators

• `eq` true if the left argument is stringwise equal to the right argument
• `ne` true if the left argument is stringwise not equal to the right argument
• `gt` true if the left argument is stringwise greater than the right argument
• `lt` true if the left argument is stringwise less than the right argument
• `ge` true if the left argument is stringwise greater than or equal to the right argument
• `le` true if the left argument is stringwise less than or equal to the right argument
• `cmp` -1, 0, or 1 depending on whether the left argument is stringwise less than, equal to, or greater than the right argument, respectively

Example:

``````\$x = 5;
\$y = 10;
# if
if (\$x == 5) {
print "x is indeed 5\n";
}
# if ... else
if (\$y == 5) {
print "y is indeed 5\n"
} else {
print "y is not 5\n";
}
# if ... else using the ? : operator
\$my_result = (\$y == 5) ? "y is indeed 5" : "y is not 5";
print "My result is: \$my_result\n";

# if ... elsif ... else with multiple statements
if (\$x > \$y) {
print "Result is: x (\$x) is greater than y (\$y)\n";
} elsif (\$my_result eq "y is not 5") {
print "Result is: I know that \$my_result\n";
} else {
print "Result is: x (\$x) is not greater than y (\$y)\n";
}
``````

## Exercise

An array `@family` holds a list of family member names. The first hash `%shoe_color` contains favorite shoe color per person name. The second hash `%shoe_size` contains shoe size per person name.

Evaluate and print the favorite shoe color and shoe size per each family member. For shoe sizes 10 and above, add the word 'large' to the output line.

Output lines should be in the format: "Homer wears large brown shoes size 12".

Note: not all family members may be included in the hash variables, so you better conditionally check if they exist or not (using the `exists` operator). If a name does not exist, add the key/value pair into the hash variables - for show color add: `black`; for shoe size add `99`.