A2P(1)

명칭
a2p - Awk 로부터 Perl 에의 트랜스레이터

서식
a2p [options] filename

해설
a2p (은)는 명령행으로 지정된 (혹은 표준 입력으로부터의) awk 스크립트를 취해, 동등의 기능을 한다 perl 스크립트를 표준 출력에 출력합니다.

  옵션
옵션에는 이하의 것이 있습니다:

-D<number>
    디버그 플래그를 세트 합니다.

-F<character>
    awk 스크립트가 항상 이 -F 스윗치 첨부로 실행되는 것을 지정합니다.

-n<fieldlist>
    입력을 분할해 배열에 격납할 필요가 없는 경우, 입력 필드의 이름을 지정합니다. 예를 들면, 패스워드 파일을 처리하는 awk 스크립트를 변환하는 경우, 이와 같이 지정합니다:

        a2p -7 -nlogin.password.uid.gid.gcos.shell.home

    필드명의 단락에는 임의의 딜리미터를 사용할 수 있습니다.

-<number>
    a2p 는, 입력이 항상 지정한 수의 필드로부터 완성되어 있는 것을 가정합니다.

  고찰
a2p 는 인간과 같은 정도 능숙한 변환은 할 수 없습니다만, 대체로의 경우는 적당히 잘 처리합니다. 경우에 따라서는, 생성된 perl 스크립트를 음미해, 조금 손보고 싶다고 생각하는 일도 있겠지요. 이하에 몇개의 경우를, 무순서로 설명합니다.

캐릭터 라인을 나타내는 식의 주위에 int()를 붙여 수치로서 해석되도록(듯이) 하는 awk 관용어가 있습니다 (그 인수는 항상 정수형입니다만). 이것은 일반적으로 perl 에서는 불필요합니다만, a2p 는 인수가 항상 정수가 되는지 어떤지 판단할 수 없기 때문에, 이 관용어는 그대로 남깁니다. 유저는 이것을 없앨 수가 있습니다.

perl 에서는 수치 비교와 캐릭터 라인 비교는 구별되고 있습니다. awk 에서는 어느 쪽에도 같은 연산자가 이용되어 실행시에 어느 쪽의 비교를 실시할지가 결정됩니다. 이 점으로 a2p 는 awk 에뮬레이션을 완전하게는 실시하려고 하지 않습니다. 그 대신해, a2p 는 어느 쪽의 종류의 비교를 실시하려 하고 있는지 추측합니다. 이것은 대부분의 경우 올바른 것입니다만, 속는 일도 있습니다. 추측을 실시한 부분에는 "#???" 라고 하는 코멘트가 부여되기 때문에, 그러한 부분을 조사해 내용을 체크해야 합니다. 유저는, 적어도 한 번은 -w 스윗치 첨부로 perl 를 달리게 하면(자) 좋을 것입니다. 이렇게 하면(자), eq 를 사용해야 할 것을로 == 를 사용하고 있는 경우에 경고를 받습니다.

존재하지 않는 배열 요소에서도, 단지 그것을 참조한 것만으로 존재하게 되는지, 그렇다고 하는 점으로, perl 는 awk 의 동작을 에뮤레이트 하려고 하지 않습니다. 어떠한 이유로, 이 메카니즘에 의존해 후속의 for...in 를 위해서(때문에) 누르엔트리를 작성하려고 하는 경우, perl 에서는 누르엔트리는 작성되지 않습니다.

a2p 가, (Fld1, Fld2, Fld3...)(와)과 같은, 변수의 리스트에의 대입을 실시하는 행을 분할하는 경우, 위에 말한 -n 옵션을 이용해 재차 a2p 를 달리게 하는 것이 좋을지도 모릅니다. 이것에 의해, 스크립트내의 필드에 이름을 붙입니다. 그렇지 않고, 분할해 배열에 격납하는 경우, 그 만큼비율은 아마 어디선가 필드수를 참조하고 있겠지요.

awk 의 exit 스테이트먼트는 반드시 exit 하지 않고, END 블록이 있으면 거기에 처리가 옮깁니다. 어느 조건하에서 END 블록을 우회도로 하는 것 같은 세공을 END 블록에 걸어 있는 awk 스크립트는, END 블록내의 조건문을 없애, perl 스크립트로부터 직접 exit 하도록(듯이) 수정하는 것으로 간단화할 수 있습니다.

perl 에는 2 종류의 배열, 즉 수치로 인덱스 되는 배열과 연상 배열이 있습니다. 통상, awk 의 배열은 연상 배열에 변환됩니다만, 만약 그 인덱스가 항상 수치이다고 알면(자), 배열 첨자의 {...} (을)를 [...] (으)로 변경할 수 있습니다. 연상 배열에 대한 반복 처리는 함수 keys()를 이용해 행해집니다만, 수치 배열에 대해서는 그렇지는 않습니다. 문제가 되고 있는 배열의 반복 조작을 실시하는 모든 루프 구조를 수정할 필요가 있을지도 모릅니다.

awk 는 기동시, OFMT 의 값이 %. 6g 이라고 가정하고 있습니다. perl 로 이것에 상당하는 변수 $# 는, 초기치로서 %. 20g 를 가지고 있습니다. OFMT 의 기본값을 이용하는 경우는 $# 을 명시적으로 설정해 주세요.

awk 스크립트에서는, 행의 선두 부근에서 행 분할 (split) 조작이 암묵적으로 반복해집니다. 경우에 따라서는, 전체 레코드를 테스트하는 어떠한 조건문보다 아래에 이것을 이동시킬 수가 있습니다. 그렇게 하는 것으로 소용없는 행 분할 처리를 피할 수가 있습니다.

미적 이유로부터 배열의 기저 $[ 를 원래의 1 으로부터 perl 에서의 디폴트인 0 에 변경하고 싶은 것도 있겠지요. 그러나, 모든 배열 첨자식 뿐만이 아니라, 모든 substr() 및 index() 함수도 적합하도록(듯이) 수정해야 하는 것을 잊지 말아 주세요.

"# awk 는 바보같기 때문에 이렇게 궁리해 있습니다" 라고 한 멋이 있는 코멘트는, 그대로 수정되지 않고에게 건네집니다.

awk 스크립트는 자주 셸 스크립트에 파묻혀 awk 의 입출력이 파이프로 접속됩니다. 이러한 셸 스크립트의 나팔도 perl 스크립트에 수중에 넣을 수 있는 경우가 꽤 있습니다. perl 라면 입출력 파이프를 개시할 수 있어 awk 가 스스로는 할 수 없었다 다른 처리도 실시할 수가 있기 때문입니다.

특수 변수 RSTART 및 RLENGTH 를 참조하는 스크립트는, 이러한 변수를 정의하는 패턴 조합의 스코프 중(안)에서 참조되고 있는 한, 변수 $`, $&, $'를 참조하는 것으로 간단화할 수 있는 경우가 꽤 있습니다.

생성된 perl 스크립트에는, getline 및 print 에 관한 awk 의 의미 규칙에 대처하기 위한 써브루틴이 정의되고 있는 경우가 있습니다. a2p 는 통상, 효율보다 정확함을 선택하기 때문입니다. 대부분의 경우, 정중하게 의미 규칙에 대처해 주는 써브루틴을 버려, 좀 더 효율적인 코드에 고쳐 쓸 수가 있습니다.

효율을 올리기 위해서(때문에), 써브루틴으로 마지막에 실행되는 return 스테이트먼트로부터 키워드 return 를 없앨 수가 있는 경우가 있습니다. a2p 는 가장 일반적인 경우는 찾아냅니다만, 드물게 있는 파묻힌 블록을 해석하거나 하지 않습니다.

ARGV[0] 은 $ARGV0 에 변환됩니다만, ARGV[n] 는 $ARGV[$n] 에 변환됩니다. ARGV[0] 을 포함해 반복 처리를 실시하려고 하는 루프는, 잘되지 않습니다.

환경 변수
a2p 는 환경 변수를 참조하지 않습니다.

저자
Larry Wall <lwall@jpl-devvax.Jpl.Nasa.Gov>

관련 파일

관련 항목
perl    perl 컴파일러/인터프리터
s2p    sed 로부터 perl 에의 트랜스레이터

진단

버그
실행시에 오퍼랜드를 조사하는 것으로, 캐릭터 라인 연산이나 수치 연산인가의 선택으로 awk 의 에뮬레이션을 실시하는 것은 가능하겠지만, 프로그램은 비대해, 비효율적이 되겠지요. 덧붙여 a2p 의 추측은 거의 항상 올바르게 행해집니다.

awk 문법 트리용의 area는 현재로서는 정적으로 확보하고 있어, 부족할 가능성이 있습니다.