a2p(1) FreeBSD 一般コマンドマニュアル

a2p

前のページ 上に戻る 次のページ

a2p



書式

       a2p [options] filename


解説

       a2p  はコマンドラインで指定された (あるいは標準入力からの)
       awk スクリプトをとり、同等の働きをする perl スクリプトを標
       準出力に出力します。

       B>オB>プB>シB>ョB>ン

       オプションには以下のものがあります:

       -D<number>
            デバッグフラグをセットします。

       -F<character>
            awk  スクリプトが常にこの -F スイッチ付きで実行される
            ことを指定します。

       -n<fieldlist>
            入力を分割して配列に格納する必要がない場合、入力 フィ
            ー ルドの名前を指定します。例えば、パスワードファイル
            を処理する awk スクリプトを変換する場合、このように指
            定します:

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

            フィ ー ル ド名の区切りには任意のデリミタが使用できま
            す。

       -<number>
            a2p は、入力が常に指定した数のフィールドから成って い
            ることを仮定します。

       B>考B>察

       a2p は人間と同じぐらいうまい変換はできませんが、大抵の場合
       はそこそこうまく処理します。場合によっては、生 成 さ れ た
       perl  スクリプトを吟味し、少し手を加えたいと思うこともある
       でしょう。以下にいくつかの場合を、順不同で説明します。

       文字列を表す式のまわりに int() を付け、数値として解釈さ れ
       る ようにする awk イディオムがあります (その引数は常に整数
       型なのですが)。これは一般に perl では不要ですが、 a2p は引
       数が常に整数となるかどうか判断できないので、このイディオム
       はそのまま残します。ユーザはこれを取り除くことができます。

       perl では数値比較と文字列比較は区別されています。 awk では
       どちらにも同じ演算子が用いられ、実行時にどちらの比較を行う
       かが決定されます。この点で a2p は awk エミュレーションを完
       全には行おうとしません。その代わり、a2p はどちらの種類の比
       較を行おうとしているのか推測します。これはほとんどの場合正
       入を行う行を分割する場合、上に述べた -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 を参照するスクリプトは、こ
       れらの変数を定義するパターン照合のスコープの中で参照されて
       いる限り、変数 $`, $&, $' を参照することで簡単化できる場合
       がかなりあります。

       るループは、うまくいきません。


環境変数

       a2p は環境変数を参照しません。


作者

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


関連ファイル


関連項目

       perl perl コンパイラ/インタプリタ
       s2p  sed から perl へのトランスレータ


診断


バグ

       実行時にオペランドを調べることで、文字列演算か数値演算かの
       選 択で awk のエミュレーションを行うことは可能でしょうが、
       プログラムは肥大し、非効率的になるでしょう。なお、a2p の推
       測はほとんど常に正しく行われます。

       awk 文法ツリー用の領域は現在のところ静的に確保しており、不
       足する可能性があります。



                              LOCAL                        A2P(1)

ABELNET VPSサービス