V1

Perl入門Copyright © Amelieff Corporation All Rights Reserved.

本講義にあたってテキストが穴埋めになっています
埋めて完成させてください

クイズがたくさんあります
めざせ全問正解！

実習がたくさんありますとにかく書いてみるのが理解の早道です

Copyright © Amelieff Corporation All Rights Reserved.

2Perlが導く
明るい未来

Copyright © Amelieff Corporation All Rights Reserved.

3

Perlが導く明るい未来
あなたは解析担当者です
シェルスクリプトを使いこなして毎日
効率的に解析しています
共同研究者から電話がかかってきました
この間はどうも！
今メールで送ったファイルをXというソフトで実行してもらえるかな？
Copyright © Amelieff Corporation All Rights Reserved.

4Perlが導く明るい未来（送られてきたのは

Excelファイル
じゃないか！）（ソフトXはExcelファイルを入力できるようになっていないのに）（ソフトXでこのファイルを実行するのは無理だ...）

バイオインフォのすばらしいソフトウェアがたくさん公開されています
入出力するファイルのフォーマットが共通化されてきてはいますが
ソフト独自仕様になっていて他との互換性がないことがよくあります
Copyright © Amelieff Corporation All Rights Reserved.

5Perlが導く明るい未来• その時です

諦めないで！
Perlを使えばフォーマットを変換できるかもしれないよ！
Copyright © Amelieff Corporation All Rights Reserved.

6Perlが導く明るい未来
あなたはPerlを使って、受け取ったファイルをソフトXへ入力できる
フォーマットに変換し、無事Xを実行することができました
さすが！

Copyright © Amelieff Corporation All Rights Reserved.

7Perlが書けるとデータ操作が捗る！

Perlが導く明るい未来・完

Copyright © Amelieff Corporation All Rights Reserved.

8

本講義の内容
Perlとは

文法の話

•
•
•
•
•
•
•
•
•

変数
配列
コマンドライン引数
ハッシュ
条件付き処理繰り返し処理ファイル入出力シバン
正規表現

Copyright © Amelieff Corporation All Rights Reserved.

9Perlとはオープンソースのプログラミング言語の一つです
高速な処理には向きませんが、比較的手軽に書けることと、「 テキスト処理 」が得意なところから、バイオインフォマ
ティクス業界でよく使われています
Copyright © Amelieff Corporation All Rights Reserved.

10Perlのゆるさ
Perlは同じ処理をいろいろな書き方で書ける言語です
解答例は一例です

資料中のクイズは弊社社員で手分けして考えましたのでいろいろな書き方が出てきます「こう書くともっと良いのでは？」というスクリプトが書けた方は積極的に教えてください

様々な解を皆でシェアしましょう
Copyright © Amelieff Corporation All Rights Reserved.

11シェルスクリプトとの比較
Perlのほうが複雑な処理に向きます
シェル
スクリプト

Perl

ファイル読み込み○○○

正規表現・複雑な計算・複雑な処理

△

○
○
○
○

コマンド連続実行

変数・条件付き処理・繰り返し処理

Copyright © Amelieff Corporation All Rights Reserved.

12Perlを使うとよい場面
ファイルフォーマットの変換例）「 BAMフォーマットをBEDフォーマットに変換 」（一般的なフォーマット間であれば大体変換スクリプトがありますが...）結果ファイルの独自解析
異なるソフトの出力結果をマージ
例）「

Copyright © Amelieff Corporation All Rights Reserved.

」

13

まずは日常会話から「英語が苦手なのに、来月海外の学会に行くことになってしまった！」–ネイティブに負けないくらいの英語力を身に着けよう →無謀–とりあえず学会参加に最低限必要な英語力を身に着けよう →現実的Copyright © Amelieff Corporation All Rights Reserved.

14

まずは日常会話からPerlも「言語」なのは英語と同じです
解析に必要な「日常会話」をとりあえず喋って（＝書いて）みましょう
Hello!

print "Hello";

Hello

通じた！

Hello

通じた！
Copyright © Amelieff Corporation All Rights Reserved.

15

まずは日常会話からPerlでは複雑なプログラムを書くこともできます...が本講義ではバイオの解析を行うのに必要最低限な部分のみを紹介します

こんな方を想定しています– とりあえずPerlの雰囲気を知りたい– 人が書いたPerlを読めるようになりたい
Copyright © Amelieff Corporation All Rights Reserved.

16Perlスクリプトの作成と実行
1. テキストエディタ（vi, gedit等）で実行内容をファイルに書いて保存
テキストエディタの使いかたは資料末尾をご覧ください
Perlスクリプトファイルは拡張子を「.pl」にします

2. perlコマンドで実行$ perl Perlスクリプトファイル名
Copyright © Amelieff Corporation All Rights Reserved.

17

実習環境
1. 仮想環境を起動します
2. デスクトップに「perl」ディレクトリを作成します$ cd ~/Desktop$ mkdir perl
$ cd perl

本日の実習はすべてこの中で行います
Copyright © Amelieff Corporation All Rights Reserved.

18

実習環境
テストデータデスクトップの「Sample Data」から以下の1ファイルを「perl」にコピーしてください「../S」だけ入力してTabキーを押すと「Sample¥ Data」まで入ります$ cp ../Sample¥ Data/peptide_seqs/p
eptides_longer_headers.fasta .

改行を入れ
ずに続けて
入力

Fastaフォーマットのファイルです
Copyright © Amelieff Corporation All Rights Reserved.

19

Fastaフォーマット
＞で始まるID行と配列行（塩基またはアミノ酸）から成るフォーマットです
ゲノムや遺伝子の配列を表すのによく使われます
ID行>NP_571718.1|DRERSOX9A
MNLLDPYLKMTDEQEKCLSDAPSPSMSEDSAGSPCPSASGSDTENTRPAENSLLAADGTLGDF
配列行KKDEEDKFPVCIREAVSQVLKGYDWTLVPMPVRVNGSSKNKPHVKRPMNAFMVWAQAARRKLADQYPHLHNAELSKTLGKLWRLLNEVEKRPFVEEAERLRVQHKKDHPDYKYQPRRRKSVKNGQSESEDGSEQTHISPNAIFKALQQADSPASSMGEVHSPSEHSGQSQGPPTPPTTPKTDTQPGKADLKREARPLQENTGRPLSINFQDVDIGELSSDVIETFDVNEFDQYLPPNG：

Copyright © Amelieff Corporation All Rights Reserved.

20本講義の達成目標
以下の作業をPerlスクリプトで実行できるようになります「FastaのID行を変更したり、アミノ酸の出現頻度を数えたりできる」

Copyright © Amelieff Corporation All Rights Reserved.

21Perlの記載方法• 値を出力するにはprintを実行します• 文字列はダブルクォートかシングルクォートで囲みます• 行の末尾に;をつけます
print "Hello!";• 全角記号・全角空白は使わないでください
Copyright © Amelieff Corporation All Rights Reserved.

22

実習1
次のPerlスクリプト・perl1.plを書いて実行してみましょう
Hello!と出力するPerlスクリプトです$ gedit perl1.pl
perl1.plにこの1行を書いて保存します

print "Hello!";$ perl perl1.pl
Copyright © Amelieff Corporation All Rights Reserved.

23

改行
Perlのprintはシェルスクリプトのechoと違って最後が改行されないんだ！

改行したい場合は明示的に改行コードを書く必要があります
print "Hello!¥n";¥n：改行コード「¥」はバックスラッシュですキーボードの「¥」を打ってください

Copyright © Amelieff Corporation All Rights Reserved.

24

質問

では、Bye!と出力するにはどう変更すればよいでしょう？

Copyright © Amelieff Corporation All Rights Reserved.

25

解答
実行内容を変えればいいですね
print "Hello!¥n";print "Bye!¥n";
ここで「変数」を使うとスマートです
Copyright © Amelieff Corporation All Rights Reserved.

26

変数
シェルスクリプト同様、Perlでも「変数」を使うことができます–「my $変数名=値;」と書くと、変数に値を代入できます–「$変数」と書くと、変数に入っている値を呼び出すことができます
Copyright © Amelieff Corporation All Rights Reserved.

27

変数「my」の話
とりあえず、最初に変数が出てくるときにはmyをつけると覚えてください
myで定義した変数は、定義したスコープ内でのみ有効ですスコープについては後でご紹介します

Copyright © Amelieff Corporation All Rights Reserved.

28

実習2
次のPerlスクリプト・perl2.plを書いて実行してみましょう$ cp perl1.pl perl2.pl$ gedit perl2.pl
perl2.plを以下のように変更して保存します

my $message="Bye!¥n";print $message;$ perl perl2.pl

代入の=の前後に半角空白が入ってもOKです
my $message = "Bye!¥n";

Copyright © Amelieff Corporation All Rights Reserved.

29難易度：★

Q1.pl

クイズ
実行結果は
どうなりますか？

my $str = "Amelieff's blog";
print "$str¥n";$ perl Q1.pl

A

C

Amelieff's blog

Amelieff s blog

BD

Amelieff's blog

Amelieffs blogCopyright © Amelieff Corporation All Rights Reserved.

30

クイズ

A！！

正解は、

Amelieff's blog

Copyright © Amelieff Corporation All Rights Reserved.

31難易度：★★

Q2.pl

クイズ
実行結果は
どうなりますか？

my $str = "Amelieff's blog";
print '$str¥n';
print "$str¥n";$ perl Q2.pl

A

C

Amelieff's blogAmelieff's blog

Amelieff's blog
Amelieff's blog

B$str¥nAmelieff's blog

D$str¥nAmelieff's blog

Copyright © Amelieff Corporation All Rights Reserved.

32

Q2.pl

クイズ

D！！

正解は、

my $str = "Amelieff's blog";
print '$str¥n';
print "$str¥n";$ perl Q2.pl$str¥nAmelieff's blog

print '$str¥n';

print "$str¥n";

シングルクォート内の変数は展開されない

ダブルクォート内の変数は展開される

Copyright © Amelieff Corporation All Rights Reserved.

33

値がたくさんある時
あなたは小学校の先生です
クラス40名のテストの平均点をPerlで計算してみようと思いましたが...
my $seito1 = 65;
my $seito2 = 90;
my $seito3 = 78;:
my $seito40 = 70;
Copyright © Amelieff Corporation All Rights Reserved.

入力するだけで大変！

34

値がたくさんある時「 配列 」を使うとたくさんの値をまとめて扱うことができます
変数（単体）

配列（複数）

複数の値をまとめて扱えるので便利
Copyright © Amelieff Corporation All Rights Reserved.

35

配列
配列は複数の値を1つの名前でまとめたものです
配列に値を入れるには
my @配列名＝(値,値,...);と書きます
my @seito = (65,90,78, ..., 70);
Copyright © Amelieff Corporation All Rights Reserved.

36

配列
配列から値を取り出すには$配列名[数字] と書きます↑これを「 添字 」と呼びます

my @seito = (65,90,78, ..., 70);
print $seito[1], "¥n";
Copyright © Amelieff Corporation All Rights Reserved.

37配列
添字は0から始まります
先頭の値＝添字0
2番目の値＝添字1：
my @seito = (65,90,78, ..., 70);
print $seito[1], "¥n";
添字1＝2番目の値＝90
Copyright © Amelieff Corporation All Rights Reserved.

38

実習3
次のPerlスクリプト・perl3.plを書いて実行してみましょう$ gedit perl3.pl

my @nuc = ("A", "T", "G", "C");
print $nuc[2], "¥n";$ perl perl3.pl
Copyright © Amelieff Corporation All Rights Reserved.

39

実習3・解答
添字が2の値＝「G」が出力されます$nuc[0]$nuc[1]$nuc[2]$nuc[3]

my @nuc = ("A", "T", "G", "C");
print $nuc[2], "¥n";

Copyright © Amelieff Corporation All Rights Reserved.

40難易度：★
Q3.pl
my @pig = ("boo", "foo", "woo");

クイズ
実行結果は
どうなりますか？

my $str = $pig[2] . $pig[1] . $pig[0];# . は変数を連結して文字列にします
print $str, "¥n";$ perl Q3.pl

A boowoofoo
B woofooboo
C boofoowoo
D foowooboo
Copyright © Amelieff Corporation All Rights Reserved.

41

Q3.plmy @pig = ("boo", "foo", "woo");

クイズ

B！！

正解は、

my $str = $pig[2] . $pig[1] . $pig[0];# . は変数を連結して文字列にします
print $str, "¥n";$ perl Q3.pl

B woofooboo

Copyright © Amelieff Corporation All Rights Reserved.

42配列に値を追加する
以下のような方法があります
1. 配列[添字]=値
2. pushを使う
my @nuc = ("A", "T", "G", "C");$nuc[4] = "N";
5番目に「N」がpush @nuc, "a";６番目に「a」が追加されますCopyright © Amelieff Corporation All Rights Reserved.

43配列の要素数を調べる
以下のような方法があります
1. 配列を数値に変換する
2. $#配列 + 1 を計算する
my $seito_su_1 = int(@seito);
my $seito_su_2 = $#seito + 1;
どちらも値は40になる
Copyright © Amelieff Corporation All Rights Reserved.

44

配列と文字列を相互に変換する
配列を結合して文字列にする
join（"結合に使う文字", 配列）
my @array1 = ('Are', 'you', 'fine?');my $string1 = join('-', @array1);
print $string1;「Are-you-fine?」と表示されます文字列を分割して配列にする
split（/分割に使う文字/, 文字列）
my $string2 = 'Tokyo,Japan';
my @arrary2 = split(/,/, $string2);
print $array2[0], "¥n";
Copyright © Amelieff Corporation All Rights Reserved.

「Tokyo」と表示されます45

コマンドライン引数
Perlでも外から値を与えることができるの？

Perlでは、コマンドラインからの引数を@ARGVという配列で受け取ります$ARGV[0]に1番目の値が、$ARGV[1]に2番目の値が（以下同様）入ります※空白が値の区切りとみなされます
Copyright © Amelieff Corporation All Rights Reserved.

46

実習4
次のPerlスクリプト・perl4.plを書いて実行してみましょう$ gedit perl4.pl
print "Num: ", int(@ARGV), "¥n";print "3rd: ", $ARGV[2], "¥n";$ perl perl4.pl Pink Red Blue
値は何でもいいので、値を3つ以上指定して実行してください
Copyright © Amelieff Corporation All Rights Reserved.

47

実習4・解答
print "Num: ", int(@ARGV), "¥n";print "3rd: ", $ARGV[2], "¥n";$ perl perl4.pl Pink Red Blue
Num: 33rd: Blue

値が3未満だと$ARGV[2]は未定義になります$ perl perl4.pl Pink Red
Num: 2
3rd:
Copyright © Amelieff Corporation All Rights Reserved.

48

値がたくさんあって各データに名前をつけたい時
ふたたび、あなたは小学校の先生です
クラス40名の誕生日をPerlで管理したいと思います
Aさんは5月10日、Bさんは2月28日、...
my @birth = ("0510", "0228", ... );配列では駄目だ！日付が誰の誕生日かわからない
Copyright © Amelieff Corporation All Rights Reserved.

49

値がたくさんあって各データに名前をつけたい時「 ハッシュ 」を使うと、各データの名前（キー）と値を対で入力できます例）Aさん →
キー

5月5日
値

Copyright © Amelieff Corporation All Rights Reserved.

50

ハッシュ
ハッシュに値を入れるには、
my %ハッシュ名=(キー=>値);と書きます
my %birth = ("A"=>"0505", "B"=>"0228",... );
Aさんは5月5日、Bさんは2月28日、...
Copyright © Amelieff Corporation All Rights Reserved.

51

ハッシュ
ハッシュから値を取り出すには、$ハッシュ名{キー} と書きます
my %birth = ("A"=>"0505", "B"=>"0228",... );
print $birth{"B"}, "¥n";0228が出力されます
Copyright © Amelieff Corporation All Rights Reserved.

52

実習5
次のPerlスクリプト・perl5.plを書いて実行してみましょう$ gedit perl5.pl
my %atom = ("H"=>1, "He"=>2, "Li"=>3);
print $atom{"He"}, "¥n";$ perl perl5.pl

Copyright © Amelieff Corporation All Rights Reserved.

53

実習5・解答
キー「He」の値＝「2」が出力されます$atom{"He"}

my %atom = ("H"=>1, "He"=>2, "Li"=>3);
print $atom{"He"}, "¥n";

Copyright © Amelieff Corporation All Rights Reserved.

54

ハッシュにキーと値を追加する$ハッシュ名{キー}＝値 を実行します
my %atom = ("H"=>1, "He"=>2, "Li"=>3);$atom{"Fe"} = 26;$atom{"Ca"} = 20;
キー「Ca」の値として20、
キー「Fe」の値として26が入力されます配列と違ってハッシュは添字でアクセスしないため最初に入力する順番には意味がありません
Copyright © Amelieff Corporation All Rights Reserved.

55

配列とハッシュの違い
配列のイメージ

配列は、複数のデータに
端から順にアクセスしたい
場合に向く

ハッシュのイメージ

ハッシュは、該当データにピンポイントにアクセスしたい場合に向く

Copyright © Amelieff Corporation All Rights Reserved.

56

質問

シェルスクリプトのように、Perlでも条件付き処理や繰り返し処理が行えるの？

Perlでも条件付き処理や繰り返し処理が可能です
シェルスクリプトと書き方が似ていますが微妙に異なるので混乱しないようにしましょう

Copyright © Amelieff Corporation All Rights Reserved.

57条件付き処理if-elsif-else
構文を使いますif(条件1){～条件1を満たした時の処理～}
elsif(条件2){～条件1は満たさなかったが、条件2を満たした時の処理～}
else{～どの条件も満たさなかった
時の処理～}

Copyright © Amelieff Corporation All Rights Reserved.

58条件付き処理
シェルスクリプトとPerlの違う点を探してみましょうif(条件1){
Perl～条件1を満たした時の処理～}
elsif(条件2){～条件1は満たさなかったが、条件2を満たした時の処理～}
else{～どの条件も満たさなかった
時の処理～}

if [ 条件1 ]シェルスクリプト
then～条件1を満たした時の処理～
elif [ 条件2 ]then～条件1は満たさなかったが、条件2を満たした時の処理～
else～どの条件も満たさなかった
時の処理～
fi

Copyright © Amelieff Corporation All Rights Reserved.

59条件付き処理
Perlの比較演算子

シェルスクリプトの比較演算子と混同しない
ようにしましょう
文字列の比較演算子

数値の比較演算子
A == B

A＝Bなら

A eq B

A != B
A<B

A≠Bなら
A＜Bなら

AとBが
同じなら

A ne BA <= B

A≦Bなら

AとBが
異なれば

A >= B

A≧Bなら

A>B

A＞Bなら
Copyright © Amelieff Corporation All Rights Reserved.

60条件付き処理
複数の条件を指定する場合の書き方
Perl【参考】シェル
スクリプト

条件1 AND 条件2

条件1 && 条件2

条件1 -a 条件2

条件1

OR

条件1 || 条件2

条件1 -o 条件2

条件1

でなければ

! 条件1

! 条件1

条件2

Copyright © Amelieff Corporation All Rights Reserved.

61

実習6
次のPerlスクリプト・perl6.plを書いてコマンドライン引数にいろいろな数字を指定して実行してみましょう
my $i = $ARGV[0];if($i >= 10){print "$i is equal to or larger than 10¥n";}else{
print "$i is smaller than 10¥n";}$ perl perl6.pl 6$ perl perl6.pl 11

Copyright © Amelieff Corporation All Rights Reserved.

62

実習6・解答
コマンドライン引数の値により結果が変わります$ perl perl6.pl 6
6 is smaller than 10$ perl perl6.pl 11
11 is equal to or larger than 10

Copyright © Amelieff Corporation All Rights Reserved.

63

Q4.plクイズ
実行結果はどうなりますか？
$ perl Q4.pl

難易度：★

my $time=13;
if ($time < 12 ){print "Good morning¥n";}elsif ($time <18 ){print "Hello¥n";}else {
print "Good evening¥n";}A

CGood morning

Good evening

B
Hello

D
エラーになる
Copyright © Amelieff Corporation All Rights Reserved.

64

Q4.pl

クイズ

B！！

正解は、

Hello

my $time=13;
if ($time < 12 ){print "Good morning¥n";}elsif ($time < 18 ){print "Hello¥n";}else {
print "Good evening¥n";}

1. ifの条件を満たさないので、if文は実行されません
2. elsifの条件を満たすのでelsif文が実行されます
3. elsif文が実行されたので、else文は実行されません

Copyright © Amelieff Corporation All Rights Reserved.

65

繰り返し処理指定した条件の間、同じ処理を繰り返す
ことができますPerlの繰り返し処理にはwhile、forなどの書き方があります

Copyright © Amelieff Corporation All Rights Reserved.

66

繰り返し処理・while
条件を満たす間繰り返す
while(繰り返し条件){処理内容}
my @gene_arr = ("Oct4","Sox2","Kif4","c-Myc");

my $i=0;
while($i<int(@gene_arr)){
print $gene_arr[$i], "¥n";$i = $i + 1;}
この行がないとずっと$iが0のままなので、実行が終わらなくなります（無限ループ）
Copyright © Amelieff Corporation All Rights Reserved.

出力結果

Oct4
Sox2
Kif4
c-Myc
67

繰り返し処理・for
配列の各要素に対して繰り返す
for $変数(@配列){処理内容}
my @gene_arr = ("Oct4","Sox2","Kif4","c-Myc");for my $gene(@gene_arr){
print $gene, "¥n";}@gene_arrの先頭から値を一つずつ取り出して変数$geneに入れてprint
Copyright © Amelieff Corporation All Rights Reserved.

出力結果

Oct4
Sox2
Kif4
c-Myc
68

繰り返し処理・for【別の書き方】
変数の値の変化に応じて繰り返す
for(変数の初期値; 繰り返し条件; 変数増分){処理内容}
my @gene_arr = ("Oct4","Sox2","Kif4","c-Myc");for(my $i=0; $i<int(@gene_arr); $i=$i+1){
print $gene_arr[$i], "¥n";
出力結果
Oct4
}
$iが@gene_arrの要素数より小さい
Sox2
間、@gene_arrの各値をprint
Kif4
c-Myc
Copyright © Amelieff Corporation All Rights Reserved.

69

実習7
次のPerlスクリプト・perl7.plを書いて実行してみましょう$ cp perl3.pl perl7.pl$ gedit perl7.pl
perl7.plを以下のように変更して保存します
my @nuc = ("A", "T", "G", "C");
my $i = int(@nuc);
余裕のある方はwhile($i > 0){
同じ処理をforでも$i = $i - 1;
書いてみてください
print $nuc[$i], "¥n";}
Copyright © Amelieff Corporation All Rights Reserved.

70

実習7・解答
添字3→2→1→0の順に@nucの値がprintされます$ perl perl7.plC
my @nuc = ("A", "T", "G", "C");G
my $i = int(@nuc);T
while($i > 0){A$i = $i - 1;
print $nuc[$i], "¥n";}
Copyright © Amelieff Corporation All Rights Reserved.

71

実習7・解答違う書き方もできます
my @nuc = ("A", "T", "G", "C");
my $i = int(@nuc);while($i > 0){$i = $i - 1;
print $nuc[$i], "¥n";
}

「

$i--;

$#nuc + 1」

$i--は$i=$i-1と$i++は$i=$i+1と同じ意味になります

Copyright © Amelieff Corporation All Rights Reserved.

72

実習7・解答
同じ処理をforで書いた場合
for(my $i=int(@nuc)-1; $i>=0; $i=$i-1){
print $nuc[$i], "¥n";}for my $base(reverse @nuc){print $base, "¥n";}reverse:
配列を逆順にする

どちらでも同じ結果になります
Copyright © Amelieff Corporation All Rights Reserved.

73

繰り返し処理でハッシュにアクセス

forを使う場合
my %atom = ("H"=>1, "He"=>2, "Li"=>3);
for my $key(keys %atom){$val = $atom{$key};
print $key, ":", $val, "¥n";}whileを使う場合
my %atom = ("H"=>1, "He"=>2, "Li"=>3);
while(my ($key, $val) = each %atom){print $key, ":", $val, "¥n";}
Copyright © Amelieff Corporation All Rights Reserved.

74

繰り返し処理繰り返し処理の中で次の要素にスキップするにはnextを使います
次にお待ちの方ー

お先にどうぞ

急に腹痛が...
Copyright © Amelieff Corporation All Rights Reserved.

75

繰り返し処理繰り返し処理の中で次の要素にスキップするにはnextを使います
for(my $i=0; $i<5; $i++){if($i == 2){
next;}
print $i, "¥n";}print "END¥n";

Copyright © Amelieff Corporation All Rights Reserved.

出力結果

0
1
3
4
END
76

繰り返し処理繰り返し処理自体を中止するにはlastを使います
スープがなくなりました

閉店
Copyright © Amelieff Corporation All Rights Reserved.

77

繰り返し処理繰り返し処理自体を中止するにはlastを使いますfor(my $i=0; $i<5; $i++){if($i == 2){
last;}print $i, "¥n";}print "END¥n";

Copyright © Amelieff Corporation All Rights Reserved.

出力結果

0
1
END

78

スコープ
{}で囲んだ範囲をスコープと呼びます
スコープ内で定義した変数はそのスコープでのみ有効です（ローカル変数と呼びます）$enの有効範囲
my $en = "egg";$jpの有効範囲
if($en eq "egg"){
my $jp = "tamago";}
print "$en¥n";
print "$jp¥n";$enはeggと出力されるが$jpは何も出力されない
Copyright © Amelieff Corporation All Rights Reserved.

79

不満

配列やハッシュを使っても大量のデータを手入力するのは大変！
ファイルから読み込めるといいのにデータをファイルから読み込んだり、ファイルに書き出したりできます
ファイル入出力には「ファイルハンドル」を使います
Copyright © Amelieff Corporation All Rights Reserved.

80

ファイル入出力
ファイルから1行ずつ読み込んで処理するには次のように書きます
my $file = "input.txt";

変数fileにファイル名を入力

open my $fh, "<", $file or die; ファイルハンドル$fhを読込用で開く$fhから1行ずつ読み込んで変数$lineに入れる
while(my $line = <$fh>){
chomp($line);$line末尾の改行コードを除去する
if($line eq "abc"){$lineが"abc"なら改行コードを付与して出力
print "$line¥n";}}close $fh;
ファイルハンドル$fhを閉じる
Copyright © Amelieff Corporation All Rights Reserved.

81

ファイル入出力
ファイルから1行ずつ読み込んで処理するには次のように書きます
my $file = "input.txt";
open my $fh, "<", $file or die;while(<$fh>){
chomp($_);
if($_ eq "abc"){
print "$_¥n";}}close $fh;

ファイル読み込み結果を代入する変数を省略すると$_という特殊な変数に入ります

chomp;

Copyright © Amelieff Corporation All Rights Reserved.

さらに、
chompの引数を省略すると$_が処理されます82

ファイル入出力
ファイルに書き出すには次のように書きます
my $file = "output.txt"; 変数fileにファイル名を入力
open my $fh, ">", $file or die; $fhを書出用で開く＄fhに文字列"test"を改行をつけて出力
print $fh "test¥n";close $fh;
$fhを閉じる

Copyright © Amelieff Corporation All Rights Reserved.

83

バグを見つけやすくする
Perlは制約が緩い言語のため、
バグ（プログラムの誤り）を見つけにくいことがあります

以下を記述すると、プログラム実行時に文法や変数の定義をチェックできます
use strict;
use warnings;
Copyright © Amelieff Corporation All Rights Reserved.

84

実習8 1/2
次のPerlスクリプト・perl8-1とperl8-2.plを書いて実行してみましょう$ cp perl2.pl perl8-1.pl$ gedit perl8-1.pl
perl8-1.plを以下のように変更して保存します
1行目先頭のmyを削除$message="Bye!¥n";print $message;$ perl perl8-1.plCopyright © Amelieff Corporation All Rights Reserved.

次ページにつづく 85

実習8 2/2
次のPerlスクリプト・perl8-1とperl8-2.plを書いて実行してみましょう$ cp perl8-1.pl perl8-2.pl$ gedit perl8-2.plperl8-2.plを以下のように変更して保存します

use strict;
use warnings;$message="Bye!¥n";print $message;use ~ を追記

$ perl perl8-2.pl
エラーが出るようになります

Copyright © Amelieff Corporation All Rights Reserved.

86実習8・解答
perl8-1$ perl perl8-1.plBye!

$ perl perl8-2.plGlobal symbol "$message" requires explicit package
name at perl8.pl line 3.
Global symbol "$message" requires explicit package
name at perl8.pl line 4.
Execution of perl8.pl aborted due to compilation
errors.

Copyright © Amelieff Corporation All Rights Reserved.

87

コメント
#で始まる行はコメント扱いとなり処理に影響しません# 日本語でお礼
print "Arigatou¥n";# 英語でお礼
print "Thank you¥n";

コメント
コメント

Copyright © Amelieff Corporation All Rights Reserved.

88

シバン
スクリプトの1行目に以下を記述すると
このファイルがPerlスクリプトである
ことが明示的になります#!/usr/bin/perl

これにより、perlコマンドをつけずファイル
単体で実行できるようになります$ chmod a+x perl9.pl$ ./perl9.pl

chmod a+x：実行権限をつける

Copyright © Amelieff Corporation All Rights Reserved.

89

正規表現
文字列のパターンを表現する方法
Perlでは、正規表現を//で定義します
my $str = "bioinfo";
if($str =~ /info/){print "match¥n";}else{
print "not match¥n ";}変数$strに「info」という文字列が含まれていれば「match」と出力、
そうでなければ「not match」と出力

Copyright © Amelieff Corporation All Rights Reserved.

90メタ文字の例
正規表現では以下のような記号を使えます
正規表現

意味

[atgc]a, t, g, cのいずれか

¥w

英数字

¥W

英数字以外

¥d

数字

¥D

数字以外

¥s

空白・タブ・改行¥S

空白・タブ・改行以外.

任意の1文字

^

行頭

$

行末
Copyright © Amelieff Corporation All Rights Reserved.

91

いろいろなマッチングパターン
正規表現

文字列

マッチしたか？

/bioinfo/

bioinformatics

Yes/bioinfo/

informatics

No/^bioinfo/

bioinformatics

Yes/bioinfo$/

bioinformatics

No/[atgc]/bioinformatics

Yes/[a-z]/

bioinformatics

Yes/bio./

bioinfoYes/bio./

bioNo/bi*o/

biiio, bio, boYes/bi*o/

aioNo/bi+o/

biiio,bioYes/bi+o/bo, dioNo
Copyright © Amelieff Corporation All Rights Reserved.

a* aの0回以上の繰返しa+ aの1回以上の繰返し92

マッチした箇所の取り出し
正規表現パターン中の()で囲った箇所を$1, $2, ...
で取り出すことができます
my $str = "Amelieff";

if($str =~ /(Ame*)li(ef+)/)print $1, "¥n";print $2, "¥n";}

1番目の()にマッチした文字列が$1に2番目の()にマッチした文字列が$2に...（以下同じ）入る

Ame
eff

Copyright © Amelieff Corporation All Rights Reserved.

93正規表現を用いた置換~s/正規表現パターン/置換文字列/オプション
my $str1 = "genome,proteome";$str1 =~ s/ome/omics/;
print "$str1¥n";genomics,proteome
my $str2 = "genome,proteome";$str2 =~ s/ome/omics/g;
print "$str2¥n";genomics,proteomics

変数$str1中に最初に登場した「ome」という文字列が「omics」に置き換わる

変数$str2中に登場した全ての「ome」という文字列が「omics」に置き換わる
gオプションをつけるとマッチしたすべてについて置換

Copyright © Amelieff Corporation All Rights Reserved.

94正規表現を用いた置換~s/正規表現パターン/置換文字列/オプション
my $str3 = "I sing a song.";$str3 =~ s/I/You/;
print "$str3¥n";

You sing a song.
my $str4 = "I sing a song.";$str4 =~ s/I/You/i;
print "$str4¥n";

You sYoung a song.

変数$str3中に登場した全ての「I」という文字列が「You」に置き換わる

変数$str4中に登場した全ての「Iまたはi」という文字列が「You」に置き換わる
iオプションをつけると大文字個別を区別せず置換

Copyright © Amelieff Corporation All Rights Reserved.

95難易度：★

クイズ
実行結果はどうなりますか？
$ perl Q5.pl

Q5.pl

my $org = "Gallus gallus gallus";$org =~ s/gallus/gorilla/g;
print $org, "¥n";A

C

Gallus gallus gallus

Gorilla gorilla gorilla

B

D

Gallus gorilla gorilla

gorilla gorilla gorilla

Copyright © Amelieff Corporation All Rights Reserved.

96

クイズ

B！！

正解は、

Gallus gorilla gorilla• iがついていないので、大文字小文字が Gallus gallus gallus
区別されます（gallus→マッチ、
Gallus→マッチしない）• gがついているので、全てのgallusがgorillaに置換されます
Gallus gorilla gorilla

Copyright © Amelieff Corporation All Rights Reserved.

97難易度：★★

クイズ
実行結果はどうなりますか？
$ perl Q6.pl

Q6.pl

my $gene = "hg19;chr12;KRAS";$gene =~ s/*;//g;
print $gene, "¥n";AC

chr12;KRAS

chr12hg19KRAS

B
KRAS

D
エラーになる
Copyright © Amelieff Corporation All Rights Reserved.

98

クイズ

D！！

正解は、

エラーになる
Quantifier follows nothing inregex; marked by <-- HERE in m/*<-- HERE ;/ at quiz.pl line 2.

Perlの正規表現では「*」は「直前の文字の0回以上の繰り返し」を意味するため、「*」の前には何らかの文字が必要です
Copyright © Amelieff Corporation All Rights Reserved.

99

必要スキル
•
•
•
•
•
•

実習９

変数
配列
条件付き処理繰り返し処理ファイル入出力
正規表現

次のPerlスクリプト・perl9.plを書いて実行してみましょう
1. peptides_longer_headers.fastaを読込用で開いて1行ずつ読み込んで改行コードを削除する
2. 読み込んだ行がID行（「>xxx|yyy」形式）なら、「xxx|yyy」に改行コード（¥n）を付けて出力3. それ以外の行なら、内容を変えずに改行コード（¥n）を付けて出力

Copyright © Amelieff Corporation All Rights Reserved.

100

#!/usr/bin/perl

実習９

use strict;
use warnings;
use autodie; # or dieを勝手にやってくれます
my $file = "peptides_longer_headers.fasta";

open my $fh, "<", $file;
while(<$fh>){
chomp;
if($_ =~ /^>(.+)$/){
print ">$1¥n";}else {
print $_, "¥n";}}close $fh;

Copyright © Amelieff Corporation All Rights Reserved.

101

必要スキル
•
•
•
•
•
•
•
•

最終課題

変数
配列
条件付き処理繰り返し処理ファイル入出力
正規表現
コマンドライン引数
ハッシュ

次のPerlスクリプト・
perl10.plを書いて実行してみましょう$ cp perl9.pl perl10.pl$ gedit perl10.pl1. コマンドライン引数で指定したファイルを読込用で開いて、1行ずつ読み込んで改行コードを削除する
2. 読み込んだ行がID行以外なら、一文字ずつ区切って各アミノ酸の出現頻度をハッシュでカウントする
3. カウント結果を出力
4. コマンドライン引数にpeptides_longer_headers.fastaを与えて実行
Copyright © Amelieff Corporation All Rights Reserved.

102

最終課題

：
（シバン及びuse~）：
my $file = $ARGV[0];my %aaCount;←ハッシュの定義をしている

open my $fh, "<", $file;
while(<$fh>){
chomp;
if($_ !~ /^>/){
my @aaArr = split(//, $_);
for my $aa(@aaArr){$aaCount{$aa} ++;}}}close $fh;
while(my ($aa, $count) = each %aaCount){
print $aa, ":", $count, "¥n";}

Copyright © Amelieff Corporation All Rights Reserved.

103現在いる場所を確認する【pwd】
現在Linuxのどのディレクトリにいるか確認するには次のコマンドを
実行します
$ pwd

コマンドを入力した後、Enterキーを押すとコマンドが実行されますデ ィ レ ク ト リ 内 を 確 認 す る 【 l s 】
現在いる場所にどのようなファイル・ディレクトリがあるか確認するには次のコマンドを実行します$ ls -l-lをつけて実行するとlsだけを実行するより詳しい結果が表示されます（アクセス権限など）-lを「オプション」と呼びます

他 の デ ィ レ ク ト リ に 移 動 す る 【 c d 】
他のディレクトリに移動するには次のコマンドを実行します$ cd 移動先ディレクトリ

コマンドとオプションの間、コマンドと値の間には半角空白を1つ以上入れます
Copyright © Amelieff Corporation All Rights Reserved.

104ディレクトリを作成する【mkdir】$ mkdir 移動先ディレクトリフ ァ イ ル を 作 成 す る 【 t o u c h 】$ touch 作成するファイル名

ファイルを閲覧するにはlessやmore、
ファイルを編集するにはgeditやviを使いますフ ァ イ ル を 編 集 す る 【 g e d i t 】$ gedit 編集するファイル名

ファイルが存在しない場合は新規作成されます
GUI環境がない場合はviを使います

Copyright © Amelieff Corporation All Rights Reserved.

105

ファイルまたはディレクトリをコピーする【cp】$ cp ファイル名|ディレクトリ名 コピー先名

フ ァ イ ル ま た は デ ィ レ ク ト リ を 移 動 す る 【 m v 】$ mv ファイル名|ディレクトリ名 コピー先名

ア ク セ ス 権 限 を 変 更 す る 【 c h m o d 】$ chmod 付与する権限 ファイル名|ディレクトリ名
権限の例）755：全員に読み書き実行を許可、700：所有者のみに読み書き実行を許可

Copyright © Amelieff Corporation All Rights Reserved.

106

主な解凍コマンド
拡張子.tar.gz

圧縮形式
gzip

コマンド
$ tar zxvf ファイル名.tar.bz2

bzip2$ tar jxvf ファイル名

.gz

gzip

$ gunzip ファイル名$ gzip -d ファイル名$ bunzip2 ファイル名

.bz2

bzip2

.zip

zip

$ unzipファイル名

.tar

tar

$ tar xvf ファイル名$ bzip2 -d ファイル名

Copyright © Amelieff Corporation All Rights Reserved.

107

Linuxのテキストエディタ
GUIのエディタとCUIのエディタがあります
GUI：Windows/Macソフトのように、マウスで操作する
長所：Linux初心者にも操作が容易

短所：GUIがない環境では使えない
CUI：キーボードからコマンドで操作する
長所：GUIがない環境でも使える
短所：操作コマンドを覚える必要がある

Copyright © Amelieff Corporation All Rights Reserved.

108

gedit
CentOSにはデフォルトでgeditというGUIエディタが入っていますgeditを起動するには$ gedit

コマンドを実行します「×」をクリックして終了します「保存」をクリックして保存します

Copyright © Amelieff Corporation All Rights Reserved.

109

vi
CentOSにはデフォルトでviというCUIエディタが入っています
viを起動するには$ vi

コマンドを実行します

viには2つのモードがあり、モードを切り替えながら操作します

入力モード：文字を入力する
コマンドモード：編集する（切り貼り、ファイルの保存など）
コマンドモード

入力モード

Copyright © Amelieff Corporation All Rights Reserved.

110

vi
入力モードのコマンド
Escキー

コマンドモードに移行

コマンドモードのコマンドa

入力モードに移行（カーソルの右から入力）

o

入力モードに移行（次の行の行頭から入力）

x

1文字カットdd

今いる行をカット

yy

１行コピー

p

カットした行をペースト[数字]g[数字]行に移動

G

最終行に移動:%s/foo/bar/

文字列置換（fooをbarに置換）

Copyright © Amelieff Corporation All Rights Reserved.

111