A2P(1)

NAME
a2p - Awk 到 Perl 翻譯器

總覽 (SYNOPSIS)
a2p [options] filename

描述 (DESCRIPTION)
A2p 從命令行或標準輸入取得一個awk稿本檔案， 並且向標準輸出產生一個相同功能的 perl 稿本檔案。

選項 (OPTIONS)
可選選項有:

-D<number>
    設置調試標記。

-F<character>
    告訴a2p，awk稿本總是帶 -F 選項執行。

-n<fieldlist>
    如果輸入不分解為一個數組，你需要指定輸入的各字段的名稱。 假如要翻譯一個用於處理密碼檔案的awk稿本，你應當這樣: a2p -7 -nlogin.password.uid.gid.gcos.shell.home 任何定界符都可以用來分隔字段名。

-<number>
    使得a2p總是假設輸入包含那麼多字段。

-o  告訴a2p使用舊的awk行為。當前，唯一的區別是舊的awk總是有一個 每行的循環，即使沒有對每行的操作；新的awk不是這樣。

  Considerations
a2p 不能翻譯得像人一樣好，但是通常都做得很好。 在生成的perl稿本中，你應當檢查和修改一些東西。這裏是 其中的一些，沒有順序。

awk 中有一個習慣，就是將一個字符串表達式放在 int() 函數中 來使它強制解釋為數字，即使參數已經是一個數字。 這在perl 中是不必要的，但是a2p不知道參數是不是一個數字，所以它 將它直譯了。你也許想刪掉它。

perl 中數字比較和字符比較是不一樣的。對這兩種情況，awk只有一個操作符， 但是會在運行時判斷是哪一種。在這一點上a2p不對awk進行徹底的模擬。 它會猜測哪一種是你想要的。大多數時候它是對的，但是不能保証。 這樣的猜測都以 ""#???"" 注釋來標記。你應當 仔細檢查它們，至少用perl的 -w 選項來運行它們一次，這樣 perl會警告你在應當使用eq 的地方使用了＝＝。

perl 不會像awk一樣將不存在的數組元素創建為引用。如果你想用這種辦法 來在一個for...in 循環中創建空元素，在perl中將不可能實現。

如果a2p產生了一個分段的行，用來將一列變量賦值，看上去就 像這樣 (Fld1, Fld2, Fld3...) ，你應當重新用上面提到的 -n 選項 運行a2p。這樣可以讓你命名字段。 如果它又將行分解為一個數組，那麼這個稿本中其他地方可能引用了字段的數量。

awk中的exit語句不會退出。如果有 END 段，它會轉到那裏。 在 END 段中執行跳過其他程式，轉向退出的awk稿本段落在perl 中沒有必要。你只要刪掉 END 塊中的條件變量，直接退出就可以了。

perl 中有兩種數組，數字下標的和關聯數組。perl中的關聯數組叫做 散列 "hashes"。awk中的數組總是翻譯為散列，但是如果你知道 索引總是數字，你就可以將 {...} 轉為 [...]。對散列的遍歷用到了 keys() 函數，但是對數組的散列不會。你需要修改對這樣的數組進行遍歷 的循環。

awk 預設 OFMT 的值是 %.6g，perl預設作用相同的成分 $# 的值是 %.20g。如果你想使用 OFMT 的預設值，你需要 顯式地定義$#。

在循環頂部總是會出現分支操作，這是awk稿本中暗含的。很多時候 你可以將對整個記錄的判斷移到循環下面，這樣可以減少很多分支判斷。

出於美學原因，你也許想將數組的起始值 $[ 從1轉為perl預設的0 但是要記住將所有數組的下標 AND 和 substr() 還有 index() 函數都進行更改，保証正確。

a2p會聰明地在在未處理的稿本中添加注釋 "# Here is a workaround because awk is dumb"

awk稿本經常使用在shell稿本中，通過管道接受和輸出文本。 大部分時候這種shell稿本"wrapper"可以和perl合並， 因為perl可以建立輸入輸出管道，做其他awk不能做的事情。

對RSTART 和 RLENGTH 變量進行引用的稿本可以簡單地 修改為對變量$`, $& 和 $' 的引用，只要他們是在模式匹配的范圍之內。

產生的perl稿本可能含有子程式來處理awk的getline和print函數。由於 a2p通常將正確性放在首位而不是效率，一般可以將子程式重寫得更有效率。

為了提高效率，你可以將子程式中的return去掉，只要返回值是子程式中的 最後一個語句。a2p可以處理最簡單的情況，但是不能分析嵌入程式塊的情況。

ARGV[0] 翻譯為 $ARGV0， 但是 ARGV[n] 會翻譯為 $ARGV[$n]。 遍歷 ARGV[0] 的循環將找不到它。

環境 (ENVIRONMENT)
a2p不使用環境變量

作者 (AUTHORS)
Larry Wall <larry@wall.org>

檔案 (FILE)

另見 (SEE ALSO)

perl perl 編譯器和解釋器

s2p sed 到 perl的翻譯工具

診斷 (DIAGNOSTICS)

BUGS
可以在運行時根據操作數來選擇字符還是數字操作，從而模擬awk。 但是這樣非常粗野並且無效率。另外，a2p通常都能猜對。

當前，awk語法樹是靜態存儲的，空間可能會耗盡。

[中文版維護人]
袁乙鈞 <bbbush@163.com>

[中文版最新更新]
2003/10/25

《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net