[ 기본 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_] [ |
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 $_;
}