Óé¬å Üw, - knob.osdn.jpknob.osdn.jp/cbrc/lecture/text/bit2_text2.pdf · print("hello,...
TRANSCRIPT
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つに分かれる
5
#!/usr/bin/perl -w
use strict;
print("Hello, Bioinformatics!\n”);
$ perl hello.pl
hello.pl
Perlの場所
Perlの動作
処理
実行はシェルから行う
6
#!/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 タブ文字
¥” ダブルクォート
ダブルクォート文字列で使えるバックスラッシュエスケープ
11
#!/usr/bin/perl -w
use strict;
my $name = ‘Itoshi’;
print("Hello, $name!\n");
$ perl hello.pl Itoshi
hello2.pl
12
シングルクォート文字
‘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
変数展開
17
まとめ1. プログラムの構造は3つに分かれる
2. プログラムの実行方法
3. 関数
4. スカラー変数
5. ダブル/シングルクォート文字列
1. バックスラッシュエスケープ
2. 変数展開
18
#!/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
23
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
fat_index.pl
24
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
プログラムへの入出力繰り返し処理
29
DNA9 gagcctaaggtttagggaggtcgtggtactttacgtaaggagtcagaaacgggcctcggt
DNA6 ctaaggtgggtgtgtagtggtacgtggtactaaggtgggtgtgtagtggtactaaggtgt
DNA3 atgcctgaggggcctcggtgtttagggtcctgggagcctaacggtcgtggtactttaccc
DNA4 ctcggtgtttagggaggagcctaaggtaaggtcgtggtactttacgcagtcagaaacggg
DNA8 gtcgtggtactttacaaggtatcggtgtttagggaggagcctaggagtcagaaacgggcc
DNA1 ctttgtgggctcctgcaagtgccaggcgctgaaggagcctaaggtaaggagtcagaaacg
DNA2 gcgtagagtcccttggtggaaggtgggtgtgtaggcagcagaggttaacagaaatctcag
DNA7 gttagggaggagcggggtactttacgcctcggtgttctaaggtaaggagtcagaaacgtc
DNA5 gggtgtgtataatggagtcgtggtacttcagaggttaacagaaatctcaggtccctaggt
$ cat genelist.txt
genelist.txt
30
#!/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
文字列の最後の改行文字を除く
入力から改行を除く
35
my ($file) = @ARGV;
open(FILE, $file);
while(my $line = <FILE>) {
chomp($line);
print "$line\n";
}
$ perl cat2.pl genelist.txt
cat2.pl
36
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 = ファイルを開く関数
開くファイルを指定
41
my ($file) = @ARGV;
open(FILE, $file);
while(my $line = <FILE>) {
chomp($line);
print "$line\n";
}
$ perl cat2.pl genelist.txt
cat2.pl
ファイルハンドル<>演算子で1行ずつ取りだす
ファイルをファイルハンドルに結びつける
42
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’)
47
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
48
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関数
• 添字に変数が使える
51
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
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
$ perl pickaline3.pl genelist.txt DNA1
文字列を分割する関数
53
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関数
切るパターン 切るもの
54
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’)
59
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
引数でハッシュにアクセスする
60
まとめ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
$ perl patternmatch2.pl genelist.txt
正規表現を使ったパターンマッチ
65
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_]
¥S [^ ¥r¥t¥n¥f]
正規表現
66
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.txt67
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.txt71
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
配列とハッシュを操作する関数
72
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
foreach
要素をひとつ取り出して$nameに渡すforeachの中身を実行
要素をひとつ取り出して$nameに渡すforeachの中身を実行
要素をひとつ取り出して$nameに渡すforeachの中身を実行
取り出せないのでforeachを抜ける
水が出る猫が飲む
水が出る猫が飲む
水が出る猫が飲む
水が出ないので蛇口から抜ける
76
まとめ7
• 配列やハッシュを操作する関数
• foreach
77
学んだこと• 文字列と数値
• データ構造 (スカラー,配列,ハッシュ)
• 入出力 (<>, open)
• 関数 (文字列,配列,ハッシュ)
• 分岐処理 (if)
• 繰り返し処理 (while, foreach)
• 正規表現とパターンマッチング
• 置換 (s//)
78
さらに学ぶべきこと• 外部のプログラムを実行する
• ディレクトリ,ファイル操作
• 関数を自分で作る
• モジュールを利用する
• オブジェクト指向プログラミング
• ほかの言語
79
おすすめの書籍• 初級者向け
• 初めてのPerl 第3版 (オライリー)
• 新版Perl言語プログラミングレッスン入門編 (ソフトバンククリエイティブ)
• 中級者向け
• Effective Perl (アスキー)
• Perlクックブック (オライリー)
80