Perl Tutorial For
Bioinformatics
Speaker: Ping-lun Liao
pinglunliao@gmail.com
What is Perl?

Perl is an acronym that stands for Practical
Extraction and Reporting Language.

History
− Written by Larry Wall.
− The three chief virtues of a Perl programmer:

Laziness

Impatience

Hubris
Purpose of Perl

World Wide Web Programming (CGI)

Internet Server Application Programming
Interface extension

ActiveX script language

System Administration chores

Object Linking Embedded Automation

Network Programming

Graphics User Interface
Perl's Benefits

Ease of Programming

Rapid Prototyping

Portability

Speed

Program Maintenance
Software

Interpreter
− Windows

ActivePerl

StrawberryPerl
− Linux

ActivePerl

perl
− Mac OS X

ActivePerl
− Perl Download

IDE
− Padre
− Eclipse + EPIC
− Perl Express
− Open Perl IDE
Hello Perl

#!/usr/bin/perl

# This line is comment

print "Hello Perl";
Save this file as hello.pl
Type “perl hello.pl” from the MS command line
Hello Perl
perl cmd

perl –h: print summary of options

"perl –c: test01.pl": check syntax without
running program

perl –v: version and patch-level of perl

"perl –W test01.pl": prints warnings about
possible bad constructs
perl cmd
User Input

print "Who are you?n";

$name = <STDIN>;

chomp $name;

print "Hello, $name!n";

name.pl
Data Type

純量 (scalars)
− $variableName

陣列 (array)
− @variableName

雜湊 (hash)
− %variableName
Scalars
純量是 Perl 能夠操作的資料型態中最簡單的一
種。
Perl 的純量由數值及字串組成。對其它程式語言來
說,數值和字串的處理方式是不同的,但對 Perl
來說,則沒有太大的不同。
數值
數值計算
運算子

-> 方法呼叫、解參考

++ 遞增, -- 遞減

** 乘冪 ( 次方 )

! 非, ~ 位元運算的 非,  參考

=~ 比對相符, !~ 比對不符

* 乘, / 除, % 求餘數, x 字串倍數

+ 加、 - 減, . 字串連接

<< 位元左移, >> 位元右移
運算子

< 小於

> 大於

<= 小於或等於

>= 大於或等於

lt 字串小於

gt 字串大於

le 字串小於或等於

ge 字串大於或等於

== 等於

!= 不等於

<=> 數值比較

eq 字串等於

ne 字串不等於

cmp 字串比較
運算子

& 位元 AND

| 位元 OR

^ 位元 XOR

&& AND( 且 )

|| OR ( 或 )

.. 範圍

? : 三元運算子,例:
($a > $b) ? $a : $b;

= 指定, += 、 -
= , *= 等等

, 逗號運算子, => 箭
號運算子

not 邏輯的 NOT

and 邏輯的 AND

or 邏輯的 OR

xor 邏輯的 XOR
字串

字串由任何字元所組成, Perl 的字串須以單引
號或雙引號括起來 (stringDemo.pl)
跳脫字元 (escapes)
引號的區別

跳脫符號在雙引號中才有效,在單引號中無效。

雙引號中可以做變數代換,單引號則不行。
字串的運算

stringDemo.pl
純量變數

純量變數是向記憶體要求配置一個空間,用來存
放數值或字串之用。

大部份高階語言皆要求使用變數之前要先宣告,
但 Perl 不必,隨時隨處均可立即產生,不必預
先宣告。

Perl 的純量變數表示法很簡單: $ 加上變數名
稱。變數名稱的第一個字必須為英文字元或底線
_ 。
純量變數
顯示純量變數內容

scalarDemo.pl
數值和字串也可運算

scalarWithStrDemo.pl
比較算符
真假值

0 為假,其它數值皆為真。

'0' 、 "0" 及空字串 '' 、 "" 為假,其它字串皆為
真。

運算結果可以轉換成 "0" 者為假。

undef 這個特別值為假。

任何未定義的值為假。

上述假值定義之外,其餘為真。
真假值例子
亂數

randomDemo.pl
Data Type
陣列

談 Perl 的陣列之前,應先來了解何謂串列 (list)

串列
− 串列是小括號 () 內,由一串純量組成 (0 個元素以
上 ) ,彼此以逗點分開。
串列
串列

像 ("Mmm", "NNN", "Jjj", "Kkk", "Xxx") 這種串
列要鍵入那麼多雙引號,挺累人的,您也可以用
qw 算符來簡化它 ( 別忘了 Perl 是懶惰程式設
計師的最愛 ) :
串列

除此之外,您也不一定要用小括號,您可用任何
符號做為起始及結束符號:
串列

串列可用來快速交換變數內容,不需要中間暫存
變數:
產生陣列

Perl 的陣列,以 @ 加上變數名稱來表示,比如:
− @oklist ,它的元素可由 index 索引逐一取得,第一個 index 值由 0 開始,最
後一個 index 值由 $#oklist 來表示。陣列的第一個元素為 $oklist[0] ,第二個元
素為 $oklist[1] ,第三個元素為 $oklist[2] ,其它依此類推,最後一個元素為
$oklist[$#oklist]
@oklist=(1, 2, 4, 6);
@oklist 陣列共有 4 個元素,分別是 $oklist[0], $oklist[1],
$oklist[2], $oklist[3]
$#oklist 值為 3
最後一個元素可表示成 $oklist[$#oklist] ,其值為 6
@tiny=(); # 空陣列
產生陣列產生陣列

arrayDemo1.pl
產生陣列

arrayDemo2.pl
產生陣列

arrayDemo3.pl
走返陣列元素

for loop: arrayDemo4.pl
走返陣列元素

foreach: arrayDemo5.pl
陣列的操作

陣列主要有四個操作
− pop :由陣列尾端,取出最後一個元素
− push :由陣列尾端,置入一個元素,形成最後的元
素
− shift :由陣列頭部,取出第一個元素
− unshift :由陣列頭部,置入一個元素,變成第一個
元素
陣列的操作

pop:arrayDemo6.pl
陣列的操作

push:arrayDemo7.pl
陣列的操作

push:arrayDemo8.pl
陣列的操作

shift:arrayDemo9.pl
陣列的操作

unshift:arrayDemo10.pl
陣列的操作

unshift:arrayDemo11.pl
拷貝陣列

arrayDemo12.pl
陣列逆轉

arrayDemo13.pl
陣列排序

按照 ASCII 排序 :arrayDemo14.pl
陣列排序

arrayDemo15.pl
陣列排序

按照數值排序 :arrayDemo16.pl
陣列排序

按照數值排序 :arrayDemo17.pl
雜湊

雜湊很類似於陣列,但陣列是以數字做索引,雜
湊則以字串做索引,這是最大的不同。雜湊的索
引,我們稱為鍵 (key) ,其對應的內容,我們稱
為值 (value) ,雜湊就是由一對對的 " 鍵 / 值 "
組合而成。換言之,雜湊是把某一套資料對應到
另一套資料。
雜湊

欲存取雜湊的值,只要使用 $ 雜湊名 { 鍵 } 即
可。
雜湊

以下是另一種定義雜湊的方式,結果同上頁
− %all=("t111222333", " 王大空 ", "s444555666", " 李
小二 ", "k333111555", " 陳大一 ");

動態產生雜湊 :HashDemo1.pl
雜湊
雜湊

reverse 可以將一個雜湊的鍵 / 值互調成為值 /
鍵
雜湊的處理

以下幾種函式經常用來處理雜湊:
− keys 取出雜湊的鍵,傳回一個陣列
− values 取出雜湊的值,傳回一個陣列
− each 取出雜湊的鍵 / 值對,傳回一個串列
− exists 用來判斷某一雜湊中是否存在該鍵
− delete 用來移除雜湊中某一對鍵和值
keys

取出雜湊的鍵,傳回一個陣列 :HashDemo2.pl
keys

取出雜湊的鍵,傳回一個陣列 :HashDemo3.pl
values

取出雜湊的值,傳回一個陣列 :HashDemo4.pl
each

取出雜湊的鍵 / 值對,傳回一個串列 :HashDemo5.pl
exists

判斷某鍵是否存在 :HashDemo6.pl
exists

判斷某鍵是否存在 :HashDemo7.pl
delete

將某一對鍵 / 值刪除 :HashDemo8.pl
新增一對鍵 / 值

HashDemo9.pl
特殊符號
變數的範圍

若沒有特別宣告,使用的變數為一全域變數

my 的關鍵字,可讓某一變數變成區域變數

VariableScope.pl
變數檢查

VariableCheck.pl
引號整理
引號整理
引號整理
Flow Control
if 控制結構

if 有四種形式 : IfDemo.pl
if 控制結構

if 有四種形式 :IfDemo.pl
unless

unless 是判斷條件為假時做某事 , 有三種形式 :UnlessDemo.pl
until

直到某事為真之前 ( 若它為假 ) ,都一直做某
事 :UntilDemo.pl
until

UntilDemo.pl
for

ForDemo.pl
while

WhileDemo.pl
foreach

ForeachDemo.pl
迴圈控制

LastDemo.pl
迴圈控制

LastDemo.pl
迴圈控制

NextDemo.pl
迴圈控制

RedoDemo.pl
Subroutine
Subroutines v.s Functions

Subroutines are chunk of code you defines.

Functions are provided by Perl.
Functions
Subroutine

我們經常把若干程式碼集合在一起,以完成特定
的功能,並且予以命名,俾供重覆叫用。像這樣
的區塊,我們稱為副程式或函式。
引數:傳入值

SubMaxDemo.pl

其中 my 使 $a 及 $b 變成區域變數,一旦副
程式結束,區域變數也就消失,不會影響主程式
中同名的變數。
叫用副程式

SubMaxDemo.pl
傳回值

如果副程式的運算結果需要傳回,可以使用
return 將結果傳回給叫用者去接收。

但如果副程式中沒有明顯使用 return ,則 Perl
將以最後一條敘述的執行結果,做為副程式的傳
回值。
範例:時間副程式

SubGetTimeDemo.pl
Regular Express
正規表示式

所謂正規表示式 (Regular Express) 是一種由字
元組成的樣式,用來比對資料,看看究竟符合或
不符合這個樣式,然後可做進一步的處理。比如
說:電子郵件位址的樣式,可寫成:
− ([w-])+@([w-])+(.[w-])+

正規表示式,也可以稱為是樣式 (Pattern) ,本
身自成一種小型的程式語言。由於在文件處理方
面,正規表示式經常可以發揮強大的功能,因
此,只要談到樣式比對,大家第一個聯想到的多
半是 Perl 這個語言。
樣式

BasicPatterns.pl

此例中, $str =~ /like it/ 意思是將 $str 和 "like
it" 這個樣式做比對,看看是否含有該字串? ( 結
果:有 )
樣式字元集
樣式字元集
正規表示式種類

Perl 的正規表示式,概可分成三類:比對、置
換、轉換。
− 比對:若比對成功則傳回真,不成功則傳回假。
− 置換:先進行樣式比對,若有相符的地方,則將相符
之處,置換成指定的字串。
− 轉換:做字元的變換或刪除字元的動作。
比對
比對
比對範例

BasicPatterns.pl
比對範例

BasicPatterns.pl
比對範例

BasicPatterns.pl
比對範例

BasicPatterns.pl

樣式中可以進行變數代換

樣式不符合,使用 !~ 符號
比對範例

BasicPatterns.pl

和檔案配合
比對範例

SpecialCharacters.pl

$& $` $' 的涵義
置換
置換範例

SubstitutingDemo.pl
置換範例

SubstitutingDemo.pl
置換範例

SubstitutingDemo.pl
轉換
轉換範例

TransformDemo.pl
轉換範例

TransformDemo.pl
轉換範例

TransformDemo.pl
References

Perl@Taiwan

http://www.cyut.edu.tw/~ckhung/b/pl/ by 洪朝貴

Online Ebook
http://www.unix.com.ua/orelly/perl/index.htm

Perl網路管理語言 入門與實作

Perl For Bioinformatics