Beginning Perl for Bioinformatics - Perl 기본문법 1. Perl 의기본 Perl 프로그램은 text file입니다. 프로그램의각줄은문장 (statement) 으로되어있으며모두 ; 로끝납니다. print "Hello, World! n"; # 로시작되는부위는줄끝까지프로그램의실행과무관한코멘트 ( 주석 ) 가됩니다. print; # 이것은 print 에대한코멘트입니다. 대소문자를엄격히구별합니다. 일반적으로소문자만을쓰는것이좋습니다. 예를들면 $perl_variable 과 $Perl_variable 은다른변수입니다.
2. 변수 스칼라변수 $ 로시작하며수나문자열등의값을하나만넣을수있는변수입니다. 이름에알파벳, 밑줄, 숫자등을쓸수있습니다. 하이픈 ' - ' 은쓸수없으며물론이름이숫자로시작해서는안됩니다. 숫자변수, 문자변수등의구분은없습니다. 또한숫자는일반적으로부동소수점으로간주합니다. $my_money = 9900; $color = 'Cobalt'; print $my_money; # 또는 print $color; 스칼라변수 - 문자열문자열은 " 와 ' 따옴표를모두쓸수있습니다. 이중따옴표 " 안에서는변수나이스케이프문자를해석합니다. ' 따옴표는해석하지않습니다. $color = "red"; $my_color = "$color"; # $my_color 의값은 'red' print $my_color; print " n"; $my_color2 = '$color'; # $my_color 의값은 '$color' print $my_color2; 스칼라변수 - 이스케이프문자이중따옴표 (") 로둘러싸인문자열안의백슬래쉬 ' ' 로시작되는다음문자들은특별한것을의미합니다. 개행문자를표시하거나또는 @ 나 $ 등변수를의미하는글자를해석하지않도록하는역할을합니다. 몇가지중요한것은다음과같습니다. n # 개행문자 (Windows: CR+LF, UNIX: LF, Macintosh: CR) r # CR (carrage return) t # tab 027 # 8진수숫자 (0으로시작 ) xfa # 16진수숫자 (x 로시작 ) " # " $ # $ @ # @
print "Hello n"; # Hello 출력후개행 print " "Hello " n"; # "Hello" 출력후개행 배열변수명은 @ 로시작합니다. 전체는괄호 () 로싸여있으며각요소는쉼표로나뉘어있습니다. 리스트라고생각하시면됩니다. 스칼라변수에어느하나를담고자할때꺾쇠괄호 [] 를쓰고안에배열요소의번호를씁니다. 배열의요소는스칼라이므로이때변수명앞에는 $ 가붙습니다. 다른언어와마찬가지로배열요소의번호는 0부터시작합니다. @colors = ('Red', 'Blue', 'Yellow'); $my_color = $colors[0]; # 'Red' 가들어갑니다. print $my_color; print " n"; @garbage = (32, 'trach', 241, 'brush'); print $garbage[1]; 해시 (Hash) 변수명은 % 로시작합니다. Hash 는 associative array 라고도하므로연상배열이라고번역하기도합니다. 일반적인배열은배열을찾는첨자가저장된순서인숫자입니다만해시는스칼라변수가첨자가되는리스트입니다. 전체는괄호 () 로싸여있으며첨자 (key) 와요소 (value) 는차례대로쉼표로나뉘거나또는알아보기쉽도록 => 기호로나뉘어저장됩니다. 스칼라변수에어느하나를담고자할때중괄호 { 를씁니다. %colors = ('Apple', 'Red', 'Melon', 'Blue', 'Banana', 'Yellow'); %colors = ('Apple'=>'Red', 'Melon'=>'Blue', 'Banana'=>'Yellow'); print $colors{'apple'; print " n"; $my_color = $colors{'banana'; # 'Yellow' 가들어갑니다. print $my_color;
3. 연산자 대입연산자지금까지짐작한바와같이등호 = 가대입을의미합니다. 같다는것을의미하려면등호를두개나란히씁니다. $a = 5; # $a 에 5 가저장됩니다. print "TRUE" if ($a == 5); # $a 가 5 이면 TRUE 가출력됩니다. 수치변수의연산자 $c = $a + $b; # 덧셈 $c = $a - $b; # 뺄셈 $c = $a * $b; # 곱셈 $c = $a / $b; # 나눗셈 $c = $a ** $b; # 거듭제곱 $c = $a % $b; # 나머지 $c = $a ++; # $a 에 1 을더함 $c = $a --; # $a 에 1 을뺌 문자열연산자문자열함수에서설명합니다. 변수의대소비교 Perl 은문자열변수와수치변수를구분하지않으므로변수의대소비교는숫자인지문자열인지명시하여합니다. 관계 수치변수 문자열변수 ============================================ 같다 == eq 같지않다!= ne 왼쪽이크다 > gt 왼쪽이작다 < lt 왼쪽이같거나크다 >= ge 왼쪽이같거나작다 <= le ============================================ 조건연산자조건연산자는 가 OR, && 가 AND 를의미합니다.
$a = 1; $b = 2; ($a < $b) ($a == $b); # OR 이므로참이됩니다. ($a < $b) && ($a == $b); # AND 이므로참이됩니다. 참값과거짓값 true 나 false 등 BOOLEAN 변수는없으며 if 등조건판단문에서빈문자열 (""), 0 이들어있는문자열 ("0"), 수치 0 은거짓으로, 다른값은참으로판단합니다.. (dot 연산자 ) 문자열은 dot '.' 연산자로연결됩니다. 아래예에서 $long_string 과 $result 는같습니다. $long_string = 'This'. ' is'. ' quite a long'. ' string'; print $long_string; print" n"; $short_string1 = 'This is'; $short_string2 = ' quite a short'; $short_string3 = ' string'; print $short_string1.$short_string2.$short_string3; x ( 반복연산자 ) 문자열을여러개반복할때에는알파벳소문자 x 를씁니다. print '=' x 72; # - 를 72개나란히출력합니다... ( 범위연산자 ) @a = (0.. 4); # @a = (0, 1, 2, 3, 4); 와같습니다. print @a;
4. 흐름제어 if.. elsif.. else if ( 조건 ) { 조건에따른처리 ; 또는 if ( 조건 ) { 조건에따른처리 ; else { 다른경우의처리 ; 처리부분은문장이므로뒤에세미콜론 ';' 이있어야함에유의하세요. $a = "NG"; if ($a eq 'OK') { print 'Success'; else { print 'Failed'; # Failed 출력됩니다. if 를여러번쓸때에는 elsif 를씁니다. if ( 조건1) { 조건1 에따른처리 ; elsif ( 조건2) { 조건2 에따른처리 ; elsif ( 조건3) { 조건3 에따른처리 ;... else { 조건에모두안맞는경우의다른처리 ; else if 가아니라 elsif 임에유의하세요. $a = "WAIT"; if ($a eq 'OK') { print 'Success'; elsif ($a eq 'WAIT') { print 'Please wait'; # Please wait가출력됩니다. elsif ($a eq 'REPEAT') { print 'Please repeat'; else { print 'Failed'; 논리연산자를조건문으로쓸수있습니다. OR 조건은어느하나가참이면전체가참이므로조건연산자의앞부분이참이면뒷부분은처리하지않고앞부분이거짓이면뒷부분이참인가평가합니다. AND 조건은모두다참이어야전체가참이므로조건연산자의앞부분이거짓이면당연히전체가거짓이므로뒷부분을평가하지않습니다. 앞부분이참이어야뒷부분이평가됩니다. 이를이용하여 IF ~ THEN 문대신쓸수있습니다.
$a = 'FAIL'; $b = 'OK'; ($a eq 'OK') print 'FAIL'; # 'FAIL' 이출력됩니다. ($b eq 'OK') && print 'Success'; # 'Success' 가출력됩니다. unless if 의반대말입니다. unless 에는 elsif 는없습니다. unless ('TRUE' eq 'FALSE') { print "You are lying"; # 'You are lying' 이출력됩니다. for 보통지정회수를정하고쓰는문장입니다. 처음조건을실행하고끝내는조건이참인동안반복처리와처리를계속합니다. for ( 처음조건 ; 끝내는조건 ; 반복처리 ) { 처리 for ($a = 1; $a <= 10; $a++) { print "value = $a n"; # 1 부터 10까지출력됩니다. 리스트를넣을수도있습니다. 아래문장은위문장과같은의미입니다. @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); for (@array) { print "value of = $_ n"; # 1 부터 10까지출력됩니다. 편하게범위연산자를쓸수도있습니다. 이역시같은의미의문장입니다. for (1.. 10) { print "value = $_ n"; # 1 부터 10까지출력됩니다.
while 조건이참인동안 { 로둘러싸인블록을실행합니다. $a = 1; while ($a < 10) { print "value = $a n"; # 1 부터 10까지출력됩니다. $a ++; until 조건이참이될때까지 { 로둘러싸인블록을실행합니다. $a = 1; until ($a > 10) { print "value = $a n"; # 1 부터 10까지출력됩니다. $a ++; do if, unless, while, until 의구문의순서를바꿀수있습니다. $a = 1; do { print "value = $a n"; if ($a == 5); do { print "value = $a n"; unless ($a == 5); # 1 이출력됩니다. do { print "value = $a n"; $a ++; while ($a < 5); # 1, 2, 3, 4 가출력됩니다. do { print "value = $a n"; $a ++; until ($a > 5); # 5 가출력됩니다. do { ; 안에문장이하나뿐이면 do 자체는생략할수있습니다. $a = 1; print "value = $a n" if ($a == 5); print "value = $a n" unless ($a == 5); # 1이출력됩니다. print "value = $a n" while (++$a ++ < 5); # 2, 3, 4, 5가출력됩니다. print "value = $a n" until ($a ++ > 5);
5. 패턴일치 (Pattern Matching) 패턴 (pattern) 이란문자열내부의어떤특징이있어찾고자하는문자열입니다. 일반적으로두슬래쉬사이에나타냅니다. /abc/ 이것은패턴 abc 입니다. 패턴은특수문자를사용하여여러가지다양한조건으로찾을수있으며매우복잡해질수있습니다. 다음은그중일부입니다. abc 같은문자열 (abc) a* 앞의문자가 0 개이상 ("", a, aa,...) a+ 앞의문자가 1 개이상 (a, aa,...)? 0 또는 1 개의임의의문자 ("", a, b, c,...). 1 개의임의의문자 (a, b, c,...) ^abc abc 로시작함 (abcdef...) abc$ abc 로끝남 (... abc) [abc] 괄호안의문자중하나 (a, b, c) [abc]+ 괄호안의문자중하나이상 (ab, acbcaa, baaacc,...) [a-c] a-c 까지의문자중하나 (a, b, c) [a-za-z0-9] 모든알파벳과숫자중하나 [^abc] abc 가아닌문자 (d, e, f,...) ab bc ca ab, bc, bc 중하나 (ab, bc, ca) w 영숫자또는밑줄 ([a-za-z0-9_] 와같음 ) W w 가아닌것 d 영숫자 ([0-9] 와같음 ) D d 가아닌것 =~ ( 일치연산자 ) 패턴이문자열에있으면참, 그렇지않으면거짓을리턴합니다. $a = 'I love Jane'; $a =~ /love/; # 참 $a =~ /lovejane/; # 거짓 (love 와 you 사이에스페이스가없음 ) Perl 의변수명이맞는지확인해봅시다. 이와같이패턴에변수를쓸수도있습니다.
$var_name = "Jane"; $pattern = '^[A-Za-z_][A-Za-z0-9_]*$'; if ($var_name =~ /$pattern/) { print "This is correct name. n"; # This is correct name이출력됩니다. else { print "This is wrong name. n ; # 만약 var_name이 0Jane 이라면출력됩니다. 뒤에 i ( 대소문자무시 ), g ( 가능한모든패턴과일치 ) 등의옵션이붙기도합니다. $a = 'abc'; $a =~ /ABC/; # 거짓 $a =~ /ABC/i; # 참 ( 대소문자를무시 )!~ ( 불일치연산자 ) =~ 의반대입니다. s/.. /.. / ( 치환연산자 ) s/ 패턴 / 치환할문자열 / 형식으로문자열을치환합니다. $a = 'I love Jane.'; print $a; $a =~ s/jane/alice/; # Jane 이 Alice 로바뀝니다. print $a; tr/.. /.. / ( 변환연산자 ) tr/ 찾을문자열 / 치환할문자열 / 형식으로일련의문자열을다른문자열로치환합니다. $a = 'abcdef'; print $a; $a =~ tr/abc/def/; # a 는 d 로, b 는 e 로, c 는 f 로바꿈 print $a; split split (/ 패턴 /, 문자열 ) 문자열을패턴의경계단위로끊어서배열을리턴합니다. $data = 'one+two+three'; @order = split(/+/,$data); # @order = ('one', 'two', 'three');
6. 리스트 shift 리스트의첫요소를꺼냅니다. @list = (1, 2, 3, 4); $a = shift (@list); # $a 는 1, @list 는 (2, 3, 4) print @list; # 234가출력됩니다. unshift 리스트의머리에첫요소를추가하며각요소들은하나씩밀리게됩니다. @list = (1, 2, 3, 4); unshift (@list, 0); # @list 는 (0, 1, 2, 3, 4) print @list; # 01234가출력됩니다. push 리스트의마지막에요소를추가합니다. @list = (1, 2, 3, 4); push (@list, 5); # @list 는 (1, 2, 3, 4, 5); print @list; # 12345가출력됩니다. pop 리스트의마지막요소를꺼냅니다. @list = (1, 2, 3, 4); $a = pop (@list); # $a 는 4, @list 는 (1, 2, 3); print @list; # 123가출력됩니다. splice splice (list1, offset, length, list2) 리스트의일부분을삭제하거나치환합니다. list1 의처음에서 offset 만큼건너뛴후 length 의길이만큼 list2 로치환합니다. list2 가생략되면삭제를의미하며 length 가생략되면 offset 이후의전체를의미합니다.
sort 리스트를순서를크기대로놓습니다. @list = (2, 1, 3); @new_list = sort @list; # @new_list == (1, 2, 3); print @list; print " n"; # 123이출력됩니다. print @new_list; reverse 리스트의순서를뒤집습니다. @list = (2, 1, 3); @rev_list = reverse @list; # @rev_list == (3, 1, 2); print @list; print " n"; print @rev_list; # 312가출력됩니다.