• 検索結果がありません。

Sokushu2_perl

N/A
N/A
Protected

Academic year: 2021

シェア "Sokushu2_perl"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

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の動作 処理 実行はシェルから行う

(2)

#!/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

(3)

シングルクォート文字

‘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.変数展開

(4)

#!/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

(5)

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

(6)

#!/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

(7)

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行ずつ取りだす ファイルをファイルハンドルに

(8)

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

(9)

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 文字列を分割する関数 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関数 切るパターン 切るもの

(10)

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 引数でハッシュにアクセスする

(11)

まとめ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_] 正規表現

(12)

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 配列とハッシュを 操作する関数

(13)

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

学んだこと

• 文字列と数値 • データ構造 (スカラー,配列,ハッシュ) • 入出力 (<>, open) • 関数 (文字列,配列,ハッシュ) • 分岐処理 (if) • 繰り返し処理 (while, foreach) • 正規表現とパターンマッチング • 置換 (s//)

(14)

さらに学ぶべきこと

外部のプログラムを実行する

ディレクトリ,ファイル操作

関数を自分で作る

モジュールを利用する

オブジェクト指向プログラミング

ほかの言語 79

おすすめの書籍

初級者向け

初めてのPerl 第3版 (オライリー)

新版Perl言語プログラミングレッスン入門編 (ソフト バンククリエイティブ)

中級者向け

Effective Perl (アスキー)

Perlクックブック (オライリー) 80

参照

関連したドキュメント

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

備考 1.「処方」欄には、薬名、分量、用法及び用量を記載すること。

操作内容/項目説明 振込金額を入力します。 【留意点】 ・半角数字(最大10桁)

関西学院大学には、スポーツ系、文化系のさまざまな課

前掲 11‑1 表に候補者への言及行数の全言及行数に対する割合 ( 1 0 0 分 率)が掲載されている。