Perl
プログラミング入門
1 #!/usr/bin/perl -w use strict; print("Hello, Bioinformatics!\n"); $ perl hello.pl hello.pl ファイル名 ソースコード 実行方法資料の見方
2プログラムの基本
3 #!/usr/bin/perl -w use strict; print("Hello, Bioinformatics!\n"); $ perl hello.pl hello.pl 4 #!/usr/bin/perl -w use strict; print("Hello, Bioinformatics!\n”); $ perl hello.pl hello.pl Perlの場所 Perlの動作 処理 プログラムの構造は3つに分かれる #!/usr/bin/perl -w use strict; print("Hello, Bioinformatics!\n”); $ perl hello.pl hello.pl Perlの場所 Perlの動作 処理 実行はシェルから行う#!/usr/bin/perl use strict; print("Hello, Bioinformatics!\n”); $ perl hello.pl hello.pl Perlの場所 Perlの動作 処理 文の末尾はセミコロン 文の終りを示す 7 #!/usr/bin/perl use strict; print("Hello, Bioinformatics!\n"); $ perl hello.pl hello.pl 関数 ダブルクオート文字列 関数と文字列 8 引数 戻り値 print() "Hello, Bioinformatics!\n”; Hello, Bioinformatics! 関数
関数とは
9ダブルクォート文字列
“29”
“ATG”
“¥n”
10¥n
改行文字
¥r
復帰文字
¥t
タブ文字
¥”
ダブルクォート
ダブルクォート文字列で使える
バックスラッシュエスケープ
#!/usr/bin/perl -w use strict; my $name = ‘Itoshi’; print("Hello, $name!\n");$ perl hello.pl Itoshi hello2.pl
シングルクォート文字
‘29’
‘ATG’
‘¥n’
13スカラー変数
my $box my $box = ‘boy’
14
#!/usr/bin/perl -w
use strict;
my $name = ‘Itoshi’; print("Hello, $name!\n");
$ perl hello.pl Itoshi hello2.pl 15 #!/usr/bin/perl -w use strict; my $name = ‘Itoshi’; print("Hello, $name!\n");
$ perl hello.pl Itoshi hello2.pl スカラー変数 代入 シングルクォート文字列 スカラー変数へ代入する 16 #!/usr/bin/perl -w use strict; my $name = ‘Itoshi’; print("Hello, $name!\n");
$ perl hello.pl Itoshi hello2.pl 変数展開
まとめ
1.プログラムの構造は3つに分かれる 2.プログラムの実行方法 3.関数 4.スカラー変数 5.ダブル/シングルクォート文字列 1.バックスラッシュエスケープ 2.変数展開#!/usr/bin/perl -w use strict; my $height = 1.63; my $weight = 58;
my $bmi = $weight / ($height * $height); print “$bmi¥n”; $ perl bmi.pl bmi.pl 19 #!/usr/bin/perl -w use strict; my $height = 1.63; my $weight = 58;
my $bmi = $weight / ($height * $height); print “$bmi¥n”; $ perl bmi.pl bmi.pl 四則演算 20
$a + $b
加算
$a - $b
減算
$a * $b
乗算
$a / $b
除算
$a % $b
剰余
$a++
インクリメント
$a--
デクリメント
$a**$b
$a
の$b乗
算術演算子
21 my $height = 1.63; my $weight = 58;my $bmi = $weight / ($height * $height); my $fat_index; if ($bmi >= 25) { $fat_index = 1; } else { $fat_index = 0; }
print “Your BMI: $bmi¥n”;
print “Your Fat index: $fat_index¥n”; $ perl fat_index.pl fat_index.pl 22
if
文
if else my $height = 1.63; my $weight = 58;my $bmi = $weight / $length * $length my $fat_index; if ($bmi >= 25) { $fat_index = 1; } else { $fat_index = 0; }
print “Your BMI: $bmi¥n”;
print “Your Fat index: $fat_index¥n”; $ perl fat_index.pl
if ($bmi >= 25 and $bmi < 30) { $fat_index = 1;
} elsif ($bmi >= 30 and $bmi < 35){ $fat_index = 2;
} elsif ($bmi >= 35 and $bmi < 40) { $fat_index = 3; } elsif ($bmi >= 40) { $fat_index = 4; } else { $fat_index = 0; } $ perl fat_index2.pl fat_index2.pl 25 elsifの使いすぎには注意! 26 $a == $b 数値が等しい $a eq $b 文字列が等しい $a != $b 数値が等しくない $a ne $b 文字列が等しくない $a < $b $aが$より小さい $a <= $b $aが$b以下 $a > $b $aが$bより大きい $a >= $b $aが$b以上 $a and $b (&&) $aでかつ$b $a or $b (||) $aか$b $a not $b $aだが$bでない
演算子
27まとめ2
•
数値の演算•
演算子•
if文 28プログラムへの入出力
繰り返し処理
DNA9 gagcctaaggtttagggaggtcgtggtactttacgtaaggagtcagaaacgggcctcggt DNA6 ctaaggtgggtgtgtagtggtacgtggtactaaggtgggtgtgtagtggtactaaggtgt DNA3 atgcctgaggggcctcggtgtttagggtcctgggagcctaacggtcgtggtactttaccc DNA4 ctcggtgtttagggaggagcctaaggtaaggtcgtggtactttacgcagtcagaaacggg DNA8 gtcgtggtactttacaaggtatcggtgtttagggaggagcctaggagtcagaaacgggcc DNA1 ctttgtgggctcctgcaagtgccaggcgctgaaggagcctaaggtaaggagtcagaaacg DNA2 gcgtagagtcccttggtggaaggtgggtgtgtaggcagcagaggttaacagaaatctcag DNA7 gttagggaggagcggggtactttacgcctcggtgttctaaggtaaggagtcagaaacgtc DNA5 gggtgtgtataatggagtcgtggtacttcagaggttaacagaaatctcaggtccctaggt $ cat genelist.txt genelist.txt#!/usr/bin/perl use strict; while(my $line = <>) { chomp($line); print "$line\n"; }
$ perl cat.pl genelist.txt cat.pl 31 #!/usr/bin/perl use strict; while(my $line = <>) { chomp($line); print "$line\n"; }
$ perl cat.pl genelist.txt cat.pl while文 真か疑かを調べる 真ならここを実行し 次の真偽を評価する whileを使った繰り返し 32 #!/usr/bin/perl use strict; while(my $line = <>) { chomp($line); print "$line\n"; }
$ perl cat.pl genelist.txt cat.pl ダイヤモンド演算子 <>を使った入力 33
ダイヤモンド演算子 = 1行と取り出す
1行取り出して$lineに渡す whileの中身を実行 1行取り出して$lineに渡す whileの中身を実行 1行取り出して$lineに渡す whileの中身を実行 取り出せないのでundef (偽) を返す whileを抜ける 水が出る 猫が飲む 水が出る 猫が飲む 水が出る 猫が飲む 水が出ないので 蛇口から抜ける 34 #!/usr/bin/perl use strict; while(my $line = <>) { chomp($line); print "$line\n"; }$ perl cat.pl genelist.txt cat.pl
文字列の最後の改行文字を除く
入力から改行を除く
my ($file) = @ARGV; open(FILE, $file);
while(my $line = <FILE>) { chomp($line);
print "$line\n"; }
$ perl cat2.pl genelist.txt cat2.pl
my ($file) = @ARGV; open(FILE, $file);
while(my $line = <FILE>) { chomp($line);
print "$line\n"; }
$ perl cat2.pl genelist.txt cat2.pl 配列 (アレイ)データを複数格納できる配列 37
スカラーと配列
箱がひとつ $box 箱が複数 @box 38配列変数
my @box = (‘boy’, ‘’) $box[0] $box[1] my ($first_box, $second_box) = @box$first_box: ‘boy’ $second_box: ‘’
39
my ($file) = @ARGV; open(FILE, $file);
while(my $line = <FILE>) { chomp($line);
print "$line\n"; }
$ perl cat2.pl genelist.txt cat2.pl 引数を格納した配列変数 引数 特殊変数@ARGVは引数を格納 40 my ($file) = @ARGV; open(FILE, $file);
while(my $line = <FILE>) { chomp($line);
print "$line\n"; }
$ perl cat2.pl genelist.txt cat2.pl open = ファイルを開く関数
開くファイルを指定
my ($file) = @ARGV; open(FILE, $file);
while(my $line = <FILE>) { chomp($line);
print "$line\n"; }
$ perl cat2.pl genelist.txt cat2.pl
ファイルハンドル
<>演算子で1行ずつ取りだす ファイルをファイルハンドルに
Perlプログラム 命名 ファイル ファイルハンドル 親 命名 子 名前 43
まとめ3
•
while: 偽になるまでくりかえす•
<>による入力•
スカラーと配列•
@ARGV•
open関数とファイルハンドル 44 my ($file) = @ARGV; open(FILE, $file); my @lines;while(my $line = <FILE>) { chomp($line);
push(@lines, $line); }
print "$lines[1]\n";
$ perl pickaline.pl genelist.txt pickaline.pl
45
my ($file) = @ARGV; open(FILE, $file);
my @lines;
while(my $line = <FILE>) { chomp($line);
push(@lines, $line); }
print "$lines[1]\n";
$ perl pickaline.pl genelist.txt pickaline.pl 配列変数を用意 配列に入れる 配列から取り出す 配列の作成と要素の取り出し 46
push
関数
my @box = (‘boy’, ‘’) $box[0] $box[1] push(@box, ‘boy’)my ($file, $index) = @ARGV; open(FILE, $file);
my @lines;
while(my $line = <FILE>) { chomp($line);
push(@lines, $line); }
print "$lines[$index]\n"; pickaline2.pl
my ($file, $index) = @ARGV;
open(FILE, $file); my @lines;
while(my $line = <FILE>) { chomp($line);
push(@lines, $line); }
print "$lines[$index]\n";
$ perl pickaline2.pl genelist.txt 1
pickaline2.pl 引数を配列で受けとる
49
my ($file, $index) = @ARGV; open(FILE, $file);
my @lines;
while(my $line = <FILE>) { chomp($line);
push(@lines, $line); }
print "$lines[$index]\n"; pickaline2.pl
$ perl pickaline2.pl genelist.txt 1 $lines[1] 引数を配列の添字にする 50
まとめ4
•
配列の添字による取り出し•
引数から添字を得る•
push関数•
添字に変数が使える 51my ($file, $name) = @ARGV; open(FILE, $file);
my %lines;
while(my $line = <FILE>) { chomp($line);
my ($genename, $sequence) = split(/ /, $line); $lines{$genename} = $sequence; }
print "$name $lines{$name}\n"; pickaline3.pl
$ perl pickaline3.pl genelist.txt DNA1
52
my ($file, $name) = @ARGV; open(FILE, $file);
my %lines;
while(my $line = <FILE>) { chomp($line);
my ($genename, $sequence) = split(/ /, $line); $lines{$genename} = $sequence; }
print "$name $lines{$name}\n";
pickaline3.pl 文字列を分割する関数 DNA9 gagcctaaggtttagggaggtcgtggtactttacgtaaggagtcagaaacgggcctcggt DNA6 ctaaggtgggtgtgtagtggtacgtggtactaaggtgggtgtgtagtggtactaaggtgt DNA3 atgcctgaggggcctcggtgtttagggtcctgggagcctaacggtcgtggtactttaccc DNA4 ctcggtgtttagggaggagcctaaggtaaggtcgtggtactttacgcagtcagaaacggg DNA8 gtcgtggtactttacaaggtatcggtgtttagggaggagcctaggagtcagaaacgggcc DNA1 ctttgtgggctcctgcaagtgccaggcgctgaaggagcctaaggtaaggagtcagaaacg DNA2 gcgtagagtcccttggtggaaggtgggtgtgtaggcagcagaggttaacagaaatctcag DNA7 gttagggaggagcggggtactttacgcctcggtgttctaaggtaaggagtcagaaacgtc DNA5 gggtgtgtataatggagtcgtggtacttcagaggttaacagaaatctcaggtccctaggt genelist.txt my ($genename, $sequence) = split(/ /, $line); split関数 切るパターン 切るもの
DNA9 gagcctaaggtttagggaggtcgtggtactttacgtaaggagtcagaaacgggcctcggt DNA6 ctaaggtgggtgtgtagtggtacgtggtactaaggtgggtgtgtagtggtactaaggtgt DNA3 atgcctgaggggcctcggtgtttagggtcctgggagcctaacggtcgtggtactttaccc DNA4 ctcggtgtttagggaggagcctaaggtaaggtcgtggtactttacgcagtcagaaacggg DNA8 gtcgtggtactttacaaggtatcggtgtttagggaggagcctaggagtcagaaacgggcc DNA1 ctttgtgggctcctgcaagtgccaggcgctgaaggagcctaaggtaaggagtcagaaacg DNA2 gcgtagagtcccttggtggaaggtgggtgtgtaggcagcagaggttaacagaaatctcag DNA7 gttagggaggagcggggtactttacgcctcggtgttctaaggtaaggagtcagaaacgtc DNA5 gggtgtgtataatggagtcgtggtacttcagaggttaacagaaatctcaggtccctaggt genelist.txt my ($genename, $sequence) = split(/ /, $line); 55
パターンマッチ
/PATTERN/
56文字列を操作する関数
split(/P/, $s) パターンPで文字列$sをアレイに分割する index($s, $subs) 文字列$sの中で,文字列$subsが表れる位置を返す
substr($s, $subs, 5) 文字列$sの中で,文字列$subsが表れる位置 から5文字取り出す
chomp($s) 文字列$sの末尾にある連続した改行文字を 削除する
chop($s) 文字列$sの末尾にある文字を削除する
57
my ($file, $name) = @ARGV; open(FILE, $file);
my %lines;
while(my $line = <FILE>) { chomp($line);
my ($genename, $sequence) = split(/ /, $line); $lines{$genename} = $sequence; }
print "$name $lines{$name}\n"; pickaline3.pl
$ perl pickaline3.pl genelist.txt DNA1 ハッシュ変数を用意 ハッシュ変数に代入 ハッシュ変数からとりだす ハッシュの作成とデータアクセス 58
ハッシュ(連想配列)変数
my $white = $colors{‘leftbottom’} my %colors = (‘leftbottom’ => ‘white’,‘righttop’ => ‘orange’)
my ($file, $name) = @ARGV; open(FILE, $file);
my %lines;
while(my $line = <FILE>) { chomp($line);
my ($genename, $sequence) = split(/ /, $line); $lines{$genename} = $sequence; }
print "$name $lines{$name}\n"; pickaline3.pl
$ perl pickaline3.pl genelist.txt DNA1 引数でハッシュにアクセスする
まとめ5
•
文字列を操作する関数•
パターンマッチ•
ハッシュ変数 61 while(my $line = <>) { chomp($line); if ($line =~ /tataa/) { print "$line 1\n"; } else { print “$line 0¥n”; } } patternmatch.pl$ perl patternmatch.pl genelist.txt
62 while(my $line = <>) { chomp($line); if ($line =~ /tataa/) { print "$line 1\n"; } else { print “$line 0¥n”; } } patternmatch.pl
$ perl patternmatch.pl genelist.txt ifで処理を分岐させる 63 while(my $line = <>) { chomp($line); my ($genename, $sequence) = split(/ /, $line); if ($sequence =~ /^atg/) { print "$line 1\n"; } else { print "$line 0\n"; } } patternmatch2.pl
$ perl patternmatch2.pl genelist.txt
64 while(my $line = <>) { chomp($line); my ($genename, $sequence) = split(/ /, $line); if ($sequence =~ /^atg/) { print "$line 1\n"; } else { print "$line 0\n"; } } patternmatch2.pl 正規表現を使った パターンマッチ a a abc abc a* aが0個以上 a+ aが1個以上 a+? なるべく少ないa ^ 行頭 $ 行末 . 1文字 [abc] abcのどれか [abcABC] abcABCのどれか [0-9] 0から9のどれか [0-9¥-] 0から9, - のどれか [^0-4] 0から4以外の数字 ¥d [0-9] ¥w [a-zA-Z0-9_] ¥s [ ¥r¥t¥n¥f] ¥D [^0-9] ¥W [^a-zA-Z0-9_] 正規表現
while( my $line = <> ) { chomp($line); my($name, $sequence) = split(/ /, $line); $name =~ s/DNA/RNA/; $sequence =~ s/t/u/g; print "$name\t$sequence\n"; } dna2rna.pl $ dna2rna.pl genelist.txt 67 while( my $line = <> ) { chomp($line); my($name, $sequence) = split(/ /, $line); $name =~ s/DNA/RNA/; $sequence =~ s/t/u/g; print "$name\t$sequence\n"; } dna2rna.pl $ dna2rna.pl genelist.txt 文字列の置換 68 while( my $line = <> ) { chomp($line); my($name, $sequence) = split(/ /, $line); $name =~ s/DNA/RNA/; $sequence =~ s/t/u/g; print "$name\t$sequence\n"; } dna2rna.pl $ dna2rna.pl genelist.txt マッチするすべての文字列を置換 69
まとめ6
•
パターンマッチと正規表現•
置換 70 my %seqs; while(my $line = <>){ chomp($line); my ($name, $sequence) = split(/ /, $line); $seqs{$name} = $sequence; } my @names = keys(%seqs); @names = sort(@names); foreach my $name (@names){print "$name\t$seqs{$name}\n"; } sort.pl $ sort.pl genelist.txt my %seqs; while(my $line = <>){ chomp($line); my ($name, $sequence) = split(/ /, $line); $seqs{$name} = $sequence; } my @names = keys(%seqs); @names = sort(@names);
foreach my $name (@names){
print "$name\t$seqs{$name}\n"; } sort.pl $ sort.pl genelist.txt 配列とハッシュを 操作する関数
sort(@a) ソートした配列を返す reverse(@a) 逆順にした配列を返す join(“¥t”, @a) 配列を¥tで結合したスカラーとして返す
shift(@a) 最初の要素を返す/最初の要素はなくなる unshift(@a, ‘a’) 配列の先頭にaを加える
pop(@a) 最後の要素を返す/最後の要素はなくなる push(@a, ‘a’) 配列の最後にaを加える
配列を操作する関数
73
values(%a)
value
の配列を返す
keys(%a)
key
の配列を返す
each(%a)
key
とvalueのペアを返す
ハッシュを操作する関数
74 my %seqs; while(my $line = <>){ chomp($line); my ($name, $sequence) = split(/ /, $line); $seqs{$name} = $sequence; } my @names = keys(%seqs); @names = sort(@names);foreach my $name (@names){
print "$name\t$seqs{$name}\n"; } sort.pl $ sort.pl genelist.txt foreachを使った繰り返し 75