[Digest] 펄 스크립트로 상호 작용하는 Ack 쉘 만들기

주의: [[Digest] 펄 스크립트로 상호 작용하는 Ack 쉘 만들기]의 가장 최근 판은 이곳에서 확인할 수 있습니다.

CPAN의 Andy Lester가 제작한 App::Ack 모듈은
펄로 만든 강력한 문자열 검색 도구 입니다.
한 번 사용하면 즐겨 사용하던 GNU grep을 버려버릴 수 있을 정도로
grep을 사용하면서 한 번쯤은 느낄 아쉬운 부분들을 보완하는
다양한 기능과 옵션을 가지고 있습니다.
App::Ack 모듈을 설치하면 명령줄 실행 프로그램인 ack를 같이 설치하므로
특별히 App::Ack 모듈을 이용한 프로그램을 작성할 것이 아니라면
기본으로 제공하는 ack 프로그램만으로도 사용하는데는 지장이 없습니다.

ack는 기본으로 버전 관리 프로그램에서 사용하는 내부 디렉터리를
검색 대상에서 제외하기 때문에 프로그램 작성 중 CVS 또는 서브버전 저장소 안에서
검색시 grep에 비해 아주 쾌적하게 사용할 수 있습니다.
또한 펄 프로그래머라면 당연히 익숙할 펄의 정규표현식
동일하게 지원하기 때문에 별도로 정규표현식 문법을
익힐 필요가 없다는 것도 큰 장점입니다.
ack의 자세한 기능과 다양한 옵션에 대해서는 ack --help를 참조하세요.

프로그램을 작성할 때 기존 코드를 검색해서 구조를 파악하거나
호출 상관 관계를 살펴볼 때 grep과 같은 문자열 검색 프로그램은 매우 유용합니다.
ack를 사용하면 효율을 더욱 높일 수 있는데 한 가지 아쉬운 점은
매번 검색시 마다 ack와 원하는 옵션을 입력해야 한다는 것입니다.
이것은 매번 사용자의 검색 질의어 입력을 받아서 ack를 호출하는
간단한 펄 스크립트를 작성하면 쉽게 해결할 수 있습니다:

  #!/usr/bin/perl

  use strict;
  use warnings;

  input();

  while (<>) {
      chomp;
      last if /^gg$/;
      next if !$_;

      print <<"END_MSG";

  ------------------------------------------------------------------------
  Search Keyword: [$_]
  ------------------------------------------------------------------------
  END_MSG

      if ( m{^/(.*)/$} ) {
          system 'ack', '--pager=more', '--match', $1, '.';
      }
      elsif ( m{^/(.*)/i$} ) {
          system 'ack', '--pager=more', '--ignore-case', '--match', $1, '.';
      }
      else {
          system 'ack', '--pager=more', '--literal', $_, '.';
      }

  } continue {
      input();
  }

  sub input {
      print <<"END_INPUT";

  * This is a Simple Ack shell.
  * /PATTERN/  : PATTERN will be interpreted as Perl's regular expression.
  * /PATTERN/i : PATTERN will be interpreted as Perl's regular expression
                 with ignore case option
  * PATTERN    : PATTERN will be interpreted as literal characters.
  * gg         : quit the program.

  END_INPUT

      print "Search Keyword: ";
  }

위의 펄 스크립트는 매우 간단한 구조를 가지고 있습니다.
사용자의 입력을 받아들인 후 사용자의 입력을 이용해서
정규표현식 검색을 할 것인지 또는
대소문자 구분없는 정규표현식 검색을 할 것인지,
단순 문자열 검색을 할 것인지, 프로그램을 종료할 것인지를 판단합니다.
그 후 실제 검색은 ack 프로그램을 외부 호출을 통해 수행하고
결과 역시 ack가 만들어내는 화면을 그대로 표준 출력에 보여줍니다.

규모가 있는 프로그램을 작성할 때 ctagscgvg
그리고 간단하게 ack와 상호작용하는 펄 스크립트를 이용해서
코드를 검색하는데 작업 능률면에서 매우 만족하고 있습니다. :)

Creative Commons License
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 2.0 Korea License.
This entry was posted in Development and tagged , , , , , . Bookmark the permalink.

Comments are closed.