22
More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3. To understand the limitation of using some control flow statements

More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

  • View
    218

  • Download
    3

Embed Size (px)

Citation preview

Page 1: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

More Perl Control Flow

Learning Objectives:1. To learn more commands for control flow

2. To apply the new commands learnt for writing tidier program

3. To understand the limitation of using some control flow statements

Page 2: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 22

Perl Arrays and ListsTable of Content

Control Flow Unless Until do … while do … until foreach foreach $_ “last” again Next Redo

Next & redo Redo & last/next Labeled Blocks Labeled Blocks Examples Backward if Backward unless, while, until && if || unless

Page 3: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 33

Control Flow

We have already seen several Perl control flow statements: if while for last

Other control flow statements: unless until do while do until foreach next redo

Page 4: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 44

“ unless “ statement (1) The Perl unless statement is like an if statement with

the condition negated:

if($temperature <= 20){print "too cold!\n";

}

unless($temperature > 20){ # same thingprint "too cold!\n";

}-------------------------------------------if(!$hot){

print "too cold!\n";}

unless($hot){ # same thingprint "too cold!\n";

}

Page 5: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 55

unless can have else, just like if:

#!/usr/local/bin/perl5 -w

print "Enter temperature: ";

chomp($temperature = <STDIN>);

unless($temperature > 20){

print "too cold!\n";

}else{

print "too hot!\n";

}

“ unless “ statement (2)

Page 6: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 66

unless can also have elsif, just like if:

#!/usr/local/bin/perl5 -w

print "Enter temperature: ";

chomp($temperature = <STDIN>);

unless($temperature >= 20){

print "too cold!\n";

}elsif($temperature == 20){

print "ok!\n";

}else{

print "too hot!\n";

}

“ unless “ statement (3)

Page 7: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 77

The Perl until statement is like an while statement with the condition negated.

Sometimes is is easier to say “until something is true” rather than “while not this is true”:

while(!$endoffile){...

}

until($endoffile){ # same thing...

}

“ until “ statement (1)

Page 8: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 88

The until statement loops indefinitely, until the condition is true, such as a user-controlled condition:

#!/usr/local/bin/perl5 -w$resp = "no";

until($resp eq "yes"){print "Wakeup [yes/no]? ";chomp($resp = <STDIN>);

}$ test11Wakeup [yes/no]? noWakeup [yes/no]? yWakeup [yes/no]? yes$

“ until “ statement (2)

Page 9: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 99

The do while statement is like the C++ do while statement.

It loops indefinitely, while the condition is true, such as a user-controlled condition:

do while always executes the body of the loop at least once. #!/usr/local/bin/perl5 -w

do{

print "Wakeup [yes/no]? ";

chomp($resp = <STDIN>);

}while($resp ne "yes");$ test11Wakeup [yes/no]? noWakeup [yes/no]? yes$

“ do … while “ statement (1)

Page 10: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1010

The do until statement loops indefinitely, until the condition is true, such as a user-controlled condition.

do until always executes the body of the loop at least once.

#!/usr/local/bin/perl5 -w do{

print "Wakeup [yes/no]? ";chomp($resp = <STDIN>);

}until($resp eq "yes");$ test11Wakeup [yes/no]? noWakeup [yes/no]? yWakeup [yes/no]? yes$

“ do … until “ statement (1)

Page 11: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1111

foreach takes a list of values and assigns them one by one to a scalar variable.

The body of the loops is executed once for each successive assignment.

foreach is similar to the shell programming’s for statement.

foreach $i (@some_list){...

}

“ foreach “ statement (1)

Page 12: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1212

The following example sums the contents of an array:

$ cat sum

#!/usr/local/bin/perl5 -w

@a = (21,32,3,44,75,16,19);

$sum = 0;

foreach $b (@a){

$sum += $b;

}

print "The array sum is: $sum\n";$ sumThe array sum is: 210 $

“ foreach “ statement (2)

Page 13: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1313

foreach allows us to easily print an array in our own customized way.

The following example prints an array with each element separated by 2 spaces:

$ cat print1#!/usr/local/bin/perl5 -w@a = (1,2,3,4,5);foreach $i (@a){

print "$i ";}print "\n";$ print11 2 3 4 5 $

“ foreach “ statement (3)

Page 14: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1414

The following example prints the numbers in reverse order without changing the array:

$ cat print2#!/usr/local/bin/perl5 -w@a = (1,2,3,4,5);foreach $i (reverse @a){

print "$i ";}print "\n";$ print25 4 3 2 1 $

reverse @a is the same as writing reverse(@a). Parenthesis are always optional on Perl functions.

“ foreach “ statement (4)

Page 15: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1515

If you omit the scalar variable in foreach, Perl will use $_ automatically:

$ cat print3

#!/usr/local/bin/perl5 -w

@a = (1,2,3,4,5);

foreach (reverse @a){

print;

}

print "\n";$ print354321 $

print (and other Perl functions) use $_ as the default if nothing is specified.

“ foreach “ statement (5)

Page 16: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1616

Of course, if you want double spaces, you will have to use $_ explicitly:

$ cat print3a#!/usr/local/bin/perl5 -w@a = (1,2,3,4,5);foreach (reverse @a){

print "$_ ";}print "\n";$ print3a5 4 3 2 1 $

“ foreach “ statement (6)

Page 17: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1717

The scalar variable in foreach is an alias for each variable in the list, not a copy. (Tricky!)

If you modify the scalar variable in foreach, the aliased element in the list is also changed:

$ cat double

#!/usr/local/bin/perl5 -w

@a = (1,2,3,4);

foreach $b (@a){

$b *= 2;

}

print "@a\n";$ double2 4 6 8 $

“ foreach “ statement (7)

Page 18: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1818

Backward “ if ” (1)

A simple way to write “if this, then that” is:

chomp($user = `whoami`);print("Hi Bill!\n") if($user eq "gates");

is the same as:

chomp($user = `whoami`);if($user eq "gates"){

print "Hi Bill!\n";}

Backward if avoids having to write the curly braces { }. There can only be one statement inside the block.

Page 19: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 1919

Backward if is a natural and tidy way to exit from a loop:

$ cat backif#!/usr/local/bin/perl5 -w

while(1){print "Wakeup [yes/no]? ";chomp($resp = <STDIN>);last if $resp eq "yes";

};$ backifWakeup [yes/no]? noWakeup [yes/no]? yWakeup [yes/no]? yes$

Backward “ if ” (2)

Page 20: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 2020

Another simple way to write “if this, then that” is:

chomp($user = `whoami`);$user eq "gates" && print("Hi Bill!\n");

is the same as:

chomp($user = `whoami`);if($user eq "gates"){

print("Hi Bill!\n");}

&& “ if ” (1)

Page 21: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 2121

this && that;

Why does this work? Isn’t && the logical-and operator? Consider what happens when this and that

take on values of true and false: If this is true, then the value of the entire expression is still

not known, because it depends on the value of that. So that has to be evaluated.

If this is false, there is no need to look at that, because the value of the whole expression must be false. Since there is no need to evaluate that, Perl skips it.

&& “ if ” (2)

Page 22: More Perl Control Flow Learning Objectives: 1. To learn more commands for control flow 2. To apply the new commands learnt for writing tidier program 3

COMP111COMP111Lecture 12 / Slide Lecture 12 / Slide 2222

&& if is also a tidy way to exit from a loop:

$ cat backif1#!/usr/local/bin/perl5 -w

while(1){print "Wakeup [yes/no]? ";chomp($resp = <STDIN>);$resp eq "yes" && last;

};$ backif1Wakeup [yes/no]? noWakeup [yes/no]? yWakeup [yes/no]? yes$

&& “ if ” (3)