Perl Study #4

[ 기본 I / O ]

 

l       <STDIN>

①       스칼라 문에서 <STDIN>을 이용

->    $a = <STDIN>;    # 다음 행을 읽음

# 더 이상의 입력 행이 없을 경우 undef를 리턴 한다

 

②       리스트 구문에서의 계산은 모든 나머지 행을 하나의 리스트로 생성

->    @a = <STDIN>;   # 각 요소는 마지막의 개행문자를 포함한 각각의 행이다

 

③       한번에 모든 행을 읽는 두 가지 방법

* 일반적인 방법

->    while(defined($line = <STDIN>)){

여기서 $line을 처리

}                 # <STDIN>이 더 이상 읽을 것이 없을 때 undef를 리턴하고 종료

* 단축형

-> 루프 테스트가 입력 연산자(ex : <…> ) 만으로 구성될 때 perl은 자동으로 읽어 들인 행을 $_ 변수에 복사

->    while(<STDIN>){        #  “while(defined($_=<STDIN>)){“ 와 동일

chomp;              #  “chomp($_)” 와 동일

# $_  에 대한 다른 연산들이 여기에 위치

}

 

l       <> (다이아몬드 연산자)를 이용한 입력

①       <>는 <STDIN>과 유사하게 동작

②       그러나 <>는 <STDIN>과는 달리 Perl 프로그램을 호출하는 명령 행에 명시된 파일을 읽는다

->  #!/usr/bin/perl

while(<>){

print $_;

}

로 구성되는 kitty라는 파일이 있다면

-> kitty file1 file2 file3 과 같이 호출할 경우,

file1의 각 행을 읽고, 그 다음 file2, file3의 각 행을 순서대로 읽는다

(이들 모두의 행을 읽었을 때만 undef를 리턴)

 

③       <>는 실제로는 명령 행 인수를 보는 것이 아니며, @ARGV 라는 배열로부터 작업을 한다

④       @ARGV 배열은 Perl 해석기에 의해 명령 행 인수로 초기화되는 특별한 배열이다

-> @ ARGV = (“aaa”, “bbb”, “ccc”);

while(<>){       # 파일 aaa, bbb, ccc를 처리

print “this line is: $_”;

}

l       print 와 printf

①       print 함수는 문자열 리스트를 순서대로 출력한다

②       print 함수 역시 다른 함수들처럼 참, 거짓 값을 리턴한다

->  $a = print(“hello”, “world”, “ ”);      # 출력 성공시 $a = 1

③       print 함수에 () 사용 시 주의 사항

->  print (2+3), “hello”;      # 5는 출력하고 “hello”는 무시한다

print ((2+3), “hello”);     # 5hello를 출력

print 2+3, ”hello”;        # 5hello를 출력

④       printf 의  사용법은 C의 그것과 동일

 

 

[  정규 표현식  1/2 ]

 

정규표현식

문자열에 대해 일치될 패턴

 

기본 사용

①       문자열을 슬래쉬(/)로 둘러쌈으로써 사용

->  /abc/         # 문자열 abc를 포함하고 있는지 찾는다

②       찾은 문자열을 다른 문자열로 변환하고 싶은경우 s를 / 앞에 붙인다

->  s/abc/def/;    # abc를 포함하는 문자열을 찾아 def로 치환한다

 

단일문자 패턴

①       마침표 “ . ” : 개행문자( )를 제외한 임의의 단일 문자와 일치

->  /a./      # a로 시작하고 “a ”이 아닌 임의의 두문자와 일치

②       패턴일치 문자 클래스는 한쌍의 각괄호([])와 그 사이에 존재하는 문자의 리스트로 표현된다

->  /[abcde]/       # a~e 사이의 소문자 중 하나라도 포함하는 문자열과 일치

/[aeiouAEIOU]  # 소문자 또는 대문자 모음을 포함하는 문자열과 일치

③       대쉬 “ “ : 범위의 양 끝을 구분하여 표기한다. 마이너스”-“를 리스트 내에 삽입하려면 백슬래쉬를 사용한다

->  [0123456789]   # 임의의 한 숫자와 일치

[0-9]           # 위와 동일

[0-9-]        # 0-9, 또는 마이너스와 일치

[a-zA-Z0-9_]   # 임의의 한 문자와 일치

④       캐럿 “ ^ ” : 부정 문자 클래스. 왼쪽 각괄호 바로 뒤에 넣는다

->  [^0-9]      # 숫자가 아닌 임의의 한 문자와 일치

[^^]      # 캐럿(^)이 아닌 임의의 한 문자와 일치

⑤       미리 정의된 문자 클래스 단축

코드 동일한 클래스 부정 코드 동일한 클래스
d(한 숫자)

w(한 문자)

s(공백 문자)

[0-9]

[a-zA-Z0-9_]

[
f]

D(숫자가 아닌것)

W(문자가 아닌것)

S(공백이 아닌것)

[^0-9]

[^a-zA-Z0-9_]

[^ f]

 

⑥       단축 클래스는 다른 문자 클래스의 일부로 사용될 수도 있다

->  [da-fA-F]    # 하나의 16진수와 일치

 

 

그룹화 패턴

①       연속 : abc에서 a 뒤에 b, 그 뒤에 c가 일치

②       별표 “ * ” : 바로 앞에 있는 문자(혹은 문자 클래스)가 0 또는 그 이상임을 의미

③       플러스 “ + ” : 바로 앞에 있는 문자가 하나 혹은 그 이상임을 의미

④       물음표 “ ? ” : 바로 앞에 있는 문자가 0 또는 하나임을 의미

⑤       *, +, ? 의 세 그룹화 패턴에서 패턴은 항상 최대한의 문자를 선택한다

->  $_ = “fred xxxxxxxxxx barney”;

s/x+/boom/;      # 하나 또는 2개의 x가 아니라 모든 연속되는 x를 boom으

# 로 바꾼다 (fred boom barney 가 된다)

⑥       중괄호 “{}” :  * , +, ? 대신 사용할 수 있다

x{a,b} 라고 쓸 경우 a~b개의 x 와 일치하며 b를 생략할경우 a이상, 콤마까지 생략할 경우 정확하게 a만큼, b이하일때는 x{0,b}라고 쓴다

->  /x{5,10}/    # 5~10개의 x

/x{5,}/      # 5개 이상의 x

/x{5}/       # x 5개

/x{0,5}/     # 5개 이하의 x

 

⑦       표현식 내에서 두개가 함께 존재할 경우 왼쪽 것이 우선 순위를 갖고 확장된다

->  $_ = “a xxx c xxxxxxxx c xxx d”;

/a.*c.*d/;           # a.* 의 경우 두번째 c 앞까지의 모든 문자를 일치

->  $_= “a xxx c xxxxxxxx c xxxx d”;

/a.*?c.*d/;          # ?를 사용하여 첫번째 c 앞까지의 문자만 일치

->  $_= “a xxx ce xxxxxxxx ci xxx d”;

/a.*ce.*d/;          # a.*는 두번재 c앞까지를 일치시켰다가 e와 일치하는

# 문자가 없어지므로 첫번째 c앞으로 백트래킹한다

# 이런 현상을 방지하려면 ?를 사용하는 것이 좋다

 

 

 

질문 > 아래의 예제는 UNIX 명령어 어떤 것과 일치하는가?

 

#!/usr/bin/perl

while(<>){

print $_;

}

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다