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