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