540 likes | 639 Views
96-Summer 生物資訊程式設計實習 ( 二 ). Bioinformatics with Perl 8/13~8/22 蘇中才 8/24~8/29 張天豪 8/31 曾宇鳯. Schedule. Programming Basic. Subroutine. Subroutine. #!/usr/bin/perl -w # hello1.pl : say hello sub hello { print "Hello<br>"; } &hello; &hello();. Quiz – the identical function name ?.
E N D
96-Summer生物資訊程式設計實習(二) Bioinformatics with Perl 8/13~8/22 蘇中才 8/24~8/29 張天豪 8/31 曾宇鳯
Programming Basic Subroutine
Subroutine #!/usr/bin/perl -w # hello1.pl : say hello sub hello { print "Hello\n"; } &hello; &hello();
Quiz – the identical function name ? #!/usr/bin/perl -w sub hello { print "Hello\n"; } sub hello { print "HELLO\n"; } &hello;
Subroutine – with a counter #!/usr/bin/perl -w # hello2.pl : say hello with a counter my $counter=0; sub hello { $counter++; print "Hello ($counter)\n"; } &hello; &hello();
Subroutine - parameters #!/usr/bin/perl -w # hello3.pl : say hello to someone with a counter my $counter=0; sub hello { my $name = $_[0]; #all arguments are stored in @_ $counter++; print "Hello,$name ($counter)\n"; } &hello( 'Wang’ ); &hello( "Kuo” ); &hello( "Tsao” );
Subroutine – value return #!/usr/bin/perl -w # hello4.pl : value return my $counter=0; sub hello { my $name = $_[0]; # all parameters are stored in @_ $counter++; return "Hello,$name ($counter)\n"; } my $ret = &hello('Wang'); print "$ret"; $ret = &hello("Kuo"); print $ret; $ret = &hello("Tsao"); print $ret;
Quiz – what is $ret ? #!/usr/bin/perl -w sub hello { print "Hello\n"; } my $ret = &hello; print “\$ret = $ret\n”;
Variable – global/local #!/usr/bin/perl -w # variable.pl : global/local variable my $a = 0; sub max { my ($a, $b); ($a, $b) = @_; print "\$a in &max = $a\n"; if ($a > $b) { $a; } else { $b; } } print "\$a before calling &max = $a\n"; $a = &max(3,5); print "\$a after calling &max = $a\n";
Maximum #!/usr/bin/perl -w # max.pl : get the largest number among a list of numbers my $maximum = &max(1, 10, 5, 7, 4); print "the largest number is $maximum\n"; sub max { my $max_number = shift @_; while ($number = shift @_) { if ($number > $max_number) { $max_number = $number; } } $max_number; }
Return #!/usr/bin/perl # return.pl : use 'return' to stop the subroutine and assign the return value my @names = qw / Wang Kuo Tsao Keng Lo Huang/; my $result = &which_one_is("Tsao", @names); if ($result eq -1) { print "Tsao isn't a pitcher\n"; } else { $result++; print "Tsao is the $result-th pitcher\n"; } sub which_one_is { my ($name, @list) = @_; foreach $idx (0..$#list) { if ($name eq $list[$idx]) { return $idx; } } -1; # $name can't be found among @list }
declaration of variable &hello; &a; &hello; &b; &hello; &c; &hello; #!/usr/bin/perl -w $counter = 1; sub hello { print "$counter\n"; } sub a { local $counter = 2; &hello; } sub b { my $counter = 3; &hello; } sub c { $counter = 4; &hello; }
strict #!/usr/bin/perl -w # strict.pl : use strict to enhance the error checking power of compiler use strict; $taipei101 = 509.2; print "Taipei 101 has $taipei1O1 meter\n";
Programming Basic Control statement
Control statement • if • unless • ?: • while • until • for • foreach
Control statement - if if (true) { # true } else { # false } #!/usr/bin/perl -w # if1.pl : if statement my $proteinA = 300; #protein volume my $proteinB = 200; if ($proteinA == $proteinB) { print "Protein A is the same as Protein B\n"; } else { print "Protein A isn't the same as Protein B\n"; }
Control statement - if if (...) { ... } elsif (...) { ... } else { ... } #!/usr/bin/perl -w # if2.pl : if statement my $proteinA = 300; #protein volume my $proteinB = 200; if ($proteinA > $proteinB) { print "Protein A is larger than Protein B\n"; } elsif ($proteinA < $proteinB) { print "Protein A is smaller than Protein B\n"; } else { print "Protein A is the same as Protein B\n"; }
Control statement - if ... if (true); #!/usr/bin/perl -w # if3.pl : if statement my $proteinA = 300; #protein volume my $proteinB = 200; print "A is the same as B\n" if ($proteinA == $proteinB);
Control statement - unless unless (true) { # false } else { # true } #!/usr/bin/perl -w # unless.pl : unless statement my $proteinA = 300; #protein volume my $proteinB = 200; unless ($proteinA == $proteinB) { print "Protein A isn't the same as Protein B\n"; } else { print "Protein A is the same as Protein B\n"; }
Control statement - ?: #!/usr/bin/perl -w # if4.pl : if statement my $type = "DNA"; # "DNA" or "RNA" my $bp; if ($type eq "DNA") { $bp = "ATCG"; } else { $bp = "AUCG"; } print "$type : $bp\n"; $bp = ($type eq "DNA") ? "ATCG" : "AUCG"; print "$type : $bp\n";
Control statement - while #!/usr/bin/perl -w # while1.pl : count 1 to 10 with while statement my $sum = 0; my $current = 1; while ($current <= 10) { $sum = $sum + $current; $current++; } print "The summary from 1 to 10 is $sum\n";
Control statement - while #!/usr/bin/perl -w # while2.pl : count 1 to 10 with while statement my $sum = 0; my $current = 1; do { $sum = $sum + $current; $current++; } while ($current <= 10); print "The summary from 1 to 10 is $sum\n";
Control statement - while #!/usr/bin/perl -w # while3.pl : count 1 to 10 with while statement my $sum = 0; my $current = 1; $sum = $sum + $current++ while ($current <= 10); print "The summary from 1 to 10 is $sum\n";
Control statement - while #!/usr/bin/perl -w # while4.pl : count 1 to 10 with while statement my $sum = 0; my $current = 1; while ($current <= 10) { $sum = $sum + $current; } continue { $current++; } print "The summary from 1 to 10 is $sum\n";
Control statement - until #!/usr/bin/perl -w # until.pl : count 1 to 10 with until statement my $sum = 0; my $current = 1; until ($current > 10) { $sum = $sum + $current; $current++; } print "The summary from 1 to 10 is $sum\n";
Control statement - for for ( initialise; test; increment ) { statement(s); } #!/usr/bin/perl -w # for1.pl : count 1 to 10 with for statement my $sum = 0; for(my $current=1;$current<=10;$current++) { $sum = $sum + $current; } print "The summary from 1 to 10 is $sum\n";
Control statement - for #!/usr/bin/perl -w # for2.pl : show each pitcher by for statement my @names = qw / Wang Kuo Tsao Keng Lo Huang/; for(my $idx=0;$idx<=$#names;$idx++) { print "$idx : $names[$idx]\n"; }
Control statement - foreach #!/usr/bin/perl -w # foreach.pl : show each pitcher by foreach statement my @names = qw / Wang Kuo Tsao Keng Lo Huang/; my $idx = 0; foreach $name (@names) { print "$idx : $name\n"; $idx++; }
Control statement - foreach #!/usr/bin/perl -w # for3.pl : show each pitcher by foreach statement my @names = qw / Wang Kuo Tsao Keng Lo Huang/; my $idx = 0; for $name (@names) { print "$idx : $name\n"; $idx++; }
Infinite control statement #!/usr/bin/perl -w # infinite.pl : infinite loop, and Ctrl+C to stop it for(;;) { print "for\n"; } while (1) { print "while\n"; } until (0) { print "until\n"; }
Loop control - last #!/usr/bin/perl -w # last.pl : stop infinite loop by last while(1) { if ($counter++ >= 10) { last; } print "while($counter)\n"; } #################################### $counter=0; while ($counter++ < 10) { print "while($counter)\n"; }
Loop control - next #!/usr/bin/perl -w # next.pl : skip loop control by next $counter=0; while ($counter++ < 10) { if ($counter == 5) { next; } print "while($counter)\n"; }
Loop control - redo #!/usr/bin/perl -w # redo.pl : redo loop control by redo $counter=0; while ($counter++ < 10) { if ($counter == 5) { $counter++; redo; } print "while($counter)\n"; }
Exercise Control statement
Exercise • 1+2+…+1000 = ? • Using “while” • Using “until” • Using “for” • Using “foreach”
Programming Basic Logical operator
Logical operator • and : && • or : || • not : ! • Examples • while (($a > 10) && ($a % 2 == 0)) { …} • If (($a > 10) || ($a % 2 == 0)) { … } • If (! defined($a)) { … }
Logical operator – and/or/not #!/usr/bin/perl -w # logical.pl : if statement my $proteinA = 300; #protein volume my $proteinB = 300; my $proteinC; if (($proteinA > 200)&&($proteinA eq $proteinB)) { print "Protein A is larger than 200 and the same as Protein B\n"; } if (($proteinA > 400)||($proteinA eq $proteinB)) { print "Protein A is larger than 400 or the same as Protein B\n"; } if (! defined($proteinC)) { print "Protein C isn't declared\n"; }
Programming Basic INPUT/OUTPUT
Standard Input/Output • Input • STDIN • OUTPUT • STDOUT • ERROR • STDERR Don’t need to open or close it
Standard Input - <STDIN> #! /usr/bin/perl -w # getlines1.pl : like the Unix-command 'cat' while ( $line = <STDIN> ) { print $line; } ./getline1.pl < logical.pl cat logical.pl | ./getlines1.pl -
Diamond - <> #! /usr/bin/perl -w # getlines2.pl : like the Unix-command 'cat' while ( $line = <> ) { print $line; } ./getline2.pl logical.pl or ./getline2.pl < logical.pl
$_ #! /usr/bin/perl -w # getlines3.pl : like the Unix-command 'cat' while ( <> ) { print $_; } ./getline3.pl logical.pl while.pl redo.pl or ./getline3.pl *.pl
Invocation argument - @ARGV #! /usr/bin/perl -w # getlines4.pl : like the Unix-command 'cat' foreach (@ARGV) { print "[$_]\n"; } while ( <> ) { print $_; } ./getline4.pl logical.pl while.pl redo.pl Or ./getline4.pl *.pl
Standard Input/Output #!/usr/bin/perl -w # stdin.pl : read information from STDIN, and output them into STDOUT and STDERR while ($line = <STDIN> ) { if ($line eq "ERROR\n") { print STDERR “STDERR:$line"; } elsif ($line eq "QUIT\n") { last; } else { print STDOUT “STDOUT:$line"; } }
Standard Input/Output #!/usr/bin/perl -w # chomp.pl : read information from STDIN, and output them into STDOUT and STDERR while ($line = <STDIN>) { chomp($line); if ($line eq "ERROR") { print STDERR "$line\n"; } elsif ($line eq "QUIT") { last; } else { print STDOUT "$line\n"; } }
printf #! /usr/bin/perl -w # printf.pl : user-defined type for variable output my $var1 = 1; my $var2 = 1.2; my $var3 = 3.2E10; my $var4 = 65; my $var5 = 'ABC'; print ("$var1 $var2 $var3 $var4 $var5\n"); printf("%d %f %e %c %s\n",$var1, $var2, $var3, $var4, $var5); printf("[%5d] [%5.2f] [%10.2e] [%5c] [%5s]\n",$var1, $var2, $var3, $var4, $var5); printf("[%-5d] [%-5.2f] [%-10.2e] [%-5c] [%-5s]\n",$var1, $var2, $var3, $var4, $var5);
printf - output 1 1.2 32000000000 65 ABC 1 1.200000 3.200000e+10 A ABC [ 1] [ 1.20] [ 3.20e+10] [ A] [ ABC] [1 ] [1.20 ] [3.20e+10 ] [A ] [ABC ]