96-summer 生物資訊程式設計實習 ( 二 )
DESCRIPTION
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\n"; } &hello; &hello();. Quiz – the identical function name ?. - PowerPoint PPT PresentationTRANSCRIPT
96-Summer生物資訊程式設計實習(二 )
Bioinformatics with Perl
8/13~8/22 蘇中才8/24~8/29 張天豪
8/31 曾宇鳯
ScheduleDate Time Subject Spea
ker
8/13 一
13:30~17:30 Perl Basics 蘇中才
8/15 三
13:30~17:30 Programming Basics 蘇中才
8/17 五
13:30~17:30 Regular expression 蘇中才
8/20 一
13:30~17:30 Retrieving Data from Protein Sequence Database
蘇中才
8/22 三
13:30~17:30 Perl combines with Genbank, BLAST 蘇中才
8/24 五
13:30~17:30 PDB database and structure files 張天豪
8/27 一
8:30~12:30 Extracting ATOM information 張天豪
8/27 一
13:30~17:30 Mapping of Protein Sequence IDs and Structure IDs
張天豪
8/31五 13:30~17:30 Final and Examination 曾宇鳳
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#!/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;}
&hello;&a;&hello;&b;&hello;&c;&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#!/usr/bin/perl -w
# if1.pl : if statement
my $proteinA = 300; #protein volumemy $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";}
if (true) { # true } else { # false}
Control statement - if#!/usr/bin/perl -w
# if2.pl : if statement
my $proteinA = 300; #protein volumemy $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";}
if (...) { ... } elsif (...) { ...} else { ...}
Control statement - if
#!/usr/bin/perl -w
# if3.pl : if statement
my $proteinA = 300; #protein volumemy $proteinB = 200;
print "A is the same as B\n" if ($proteinA == $proteinB);
... if (true);
Control statement - unless#!/usr/bin/perl -w
# unless.pl : unless statement
my $proteinA = 300; #protein volumemy $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";}
unless (true) { # false } else { # true}
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#!/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";
for ( initialise; test; increment ) { statement(s); }
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 volumemy $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.plcat 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.plOr ./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"; }}
parameters of printf
specifier Output Example
c Character ad or i Signed decimal integer 392
e Scientific notation (mantise/exponent) using e character 3.9265e+2
E Scientific notation (mantise/exponent) using E character 3.9265E+2
f Decimal floating point 392.65g Use the shorter of %e or %f 392.65G Use the shorter of %E or %f 392.65o Signed octal 610s String of characters sampleu Unsigned decimal integer 7235x Unsigned hexadecimal integer 7faX Unsigned hexadecimal integer (capital letters) 7FA
p Pointer addressB800:000
0
n Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.
% A % followed by another % character will write % to stdout.
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 ]
Exercise
Control statement
Exercise#! /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';
printf("%s %s %s %s %s\n",$var1, $var2, $var3, $var4, $var5);
printf("%f %f %f %f %f\n",$var1, $var2, $var3, $var4, $var5);
An example for CGI : env.pl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "\n";
foreach (keys %ENV) { print $_." ===> ".$ENV{$_}."<br>\n";}
print "\n";
env.pl
proceduresmkdir ~/public_htmlcd ~/public_htmlmkdir cgi-bincd cgi-bincp <your env.pl> .chmod +x ~/
Resultshttp://gene.csie.ntu.edu.tw/~course1/cgi-bin/env.pl