perl로 여러 줄 grep하는 방법에 대한 질문
글쓴이: esrevinu / 작성시간: 수, 2007/02/07 - 2:37오후
KLDPWiki:PerlCommandLineCookBook 의 여러 줄의 데이터를 grep하기 ( http://wiki.kldp.org/wiki.php/PerlCommandLineCookBook#toc )에서 두번째 예가 이해가 안 되네요. -ne 옵션은 뭔지 아는데 match(맞죠?)의 리스트(/START_FLAG/ ... /END_FLAG/)가 어떻게 작동해서 START_FLAG가 나오면 출력을 시작하고 END_FLAG가 나오면 출력을 끝내는지 모르겠습니다.
Forums:
-n 옵션은 뒤의
-n 옵션은 뒤의 파일이나 Standard in을 while루프로 처리하라는 뜻이고
-e 옵션은 뒤에 perl 구문이 온다는 뜻이죠.
...은 먼저 ..을 이해하여야 하는데 ..은 구문에 따라 몇가지 기능이 있습니다.
..연산자는 scalar를 반환하는 구문과 list를 반환하는 구문 두가지로 나뉘는데 지금 사용된 경우는 scalar를 반환하는 구문입니다.
이경우에는 /A/../B/ 라고 했을때 루프 안에서 false를 반환하다가 A가 매치되는 순간 true를 반환해서 계속 true를 반환하다가 /B/가 매치되는 순간 false를 다시 반환하기 시작합니다.
n .. m 이라고 하면 n줄부터 m줄까지 true를 반환합니다.
마찬가지로 n .. /A/ 형태로도 사용할 수 있습니다.
문제는 /A/ .. /B/라고 했을때 A, B가 둘다 한줄에서 매치가 되면 그줄에서만 True를 나타내기 때문에
/A/ .. /A/ 형태로는 사용할 수가 없습니다. 이경우 ...연산자를 쓰면 무조껀 다른 라인에서 있다고 가정하게됩니다.
실제로 perl코딩을 할때 리스트를 반환하는 경우에 오히려 더 많이 쓰게 되는데
(1..5) 는 (1,2,3,4,5) 를 의미하게 됩니다.
예를 들어 for($i=0;i<=100;i++){} 의 경우 간단히 for $i (1..100){} 로 쓰면 됩니다.
위키에 있는 것 중에 $a{@ARGV}=(A..Z) 같은 구문 도있는데 이경우 (A..Z)는 (A,B,C,...,Z를 의미하게 됩니다.
아래가 좀 짤린 것
아래가 좀 짤린 것 같네요. 하지만 도움이 많이 되었습니다.
n .. /A/ 는 $. == n .. $_ =~ /A/ 의 줄임말인 거죠? .. 연산자의 새로운 의미를 알았네요.
Beginning Perl 책을 조금 봤는데 책에 이런 말은 없던데...
감사합니다.
--
foldl (flip (:)) [] "universe"
네 사실 엄밀히
네 사실 엄밀히 생각하면 $.==n 이 되는건 약간 억지 같기도 하지만 sed에서 지원되는 기능이고
또 펄의 철학이 워낙 오픈되어이다보니까 그렇게 생각하면 또 그럴 듯하다는 생각이 듭니다.
댓글 달기