.TH A2P 1 "perl 5.005, patch 03" "29/Jul/1998" "Perl Programmers Reference Guide" .UC .if n .hy 0 .if n .na .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .de CQ \" put $1 in typewriter font .ft CW 'if n "\c 'if t \\&\\$1\c 'if n \\&\\$1\c 'if n \&" \\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 '.ft R .. .\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 . \" AM - accent mark definitions .bd B 3 . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds ? ? . ds ! ! . ds / . ds q .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' . ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' . ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] .ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' .ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' .ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E .ds oe o\h'-(\w'o'u*4/10)'e .ds Oe O\h'-(\w'O'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds v \h'-1'\o'\(aa\(ga' . ds _ \h'-1'^ . ds . \h'-1'. . ds 3 3 . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE . ds oe oe . ds Oe OE .\} .rm #[ #] #H #V #F C .SH NAME a2p \- Awk 到 Perl 翻譯器 .SH "總覽 (SYNOPSIS)" \fBa2p [options] filename\fR .SH "描述 (DESCRIPTION)" \fIA2p\fR 從命令行或標準輸入取得一個awk稿本檔案, 並且向標準輸出產生一個相同功能的 \fIperl\fR 稿本檔案。 .SH "選項 (OPTIONS)" 可選選項有: .IP "\fB\-D\fR" 5 設置調試標記。 .IP "\fB\-F\fR" 5 告訴a2p,awk稿本總是帶 \fB\-F\fR 選項執行。 .IP "\fB\-n\fR" 5 如果輸入不分解為一個數組,你需要指定輸入的各字段的名稱。 假如要翻譯一個用於處理密碼檔案的awk稿本,你應當這樣: a2p -7 -nlogin.password.uid.gid.gcos.shell.home 任何定界符都可以用來分隔字段名。 .IP "\fB\-\fR" 5 使得a2p總是假設輸入包含那麼多字段。 .IP "\fB\-o\fR" 5 告訴a2p使用舊的awk行為。當前,唯一的區別是舊的awk總是有一個 每行的循環,即使沒有對每行的操作;新的awk不是這樣。 .SS "Considerations" a2p 不能翻譯得像人一樣好,但是通常都做得很好。 在生成的perl稿本中,你應當檢查和修改一些東西。這裏是 其中的一些,沒有順序。 .PP awk 中有一個習慣,就是將一個字符串表達式放在 \fIint()\fR 函數中 來使它強制解釋為數字,即使參數已經是一個數字。 這在perl 中是不必要的,但是a2p不知道參數是不是一個數字,所以它 將它直譯了。你也許想刪掉它。 .PP perl 中數字比較和字符比較是不一樣的。對這兩種情況,awk只有一個操作符, 但是會在運行時判斷是哪一種。在這一點上a2p不對awk進行徹底的模擬。 它會猜測哪一種是你想要的。大多數時候它是對的,但是不能保証。 這樣的猜測都以 ""#???"" 注釋來標記。你應當 仔細檢查它們,至少用perl的 \fB\-w\fR 選項來運行它們一次,這樣 perl會警告你在應當使用eq 的地方使用了==。 .PP perl 不會像awk一樣將不存在的數組元素創建為引用。如果你想用這種辦法 來在一個for...in 循環中創建空元素,在perl中將不可能實現。 .PP 如果a2p產生了一個分段的行,用來將一列變量賦值,看上去就 像這樣 (Fld1, Fld2, Fld3...) ,你應當重新用上面提到的 \fB\-n\fR 選項 運行a2p。這樣可以讓你命名字段。 如果它又將行分解為一個數組,那麼這個稿本中其他地方可能引用了字段的數量。 .PP awk中的exit語句不會退出。如果有 \s-1END\s0 段,它會轉到那裏。 在 \s-1END\s0 段中執行跳過其他程式,轉向退出的awk稿本段落在perl 中沒有必要。你只要刪掉 \s-1END\s0 塊中的條件變量,直接退出就可以了。 .PP perl 中有兩種數組,數字下標的和關聯數組。perl中的關聯數組叫做 散列 "hashes"。awk中的數組總是翻譯為散列,但是如果你知道 索引總是數字,你就可以將 {...} 轉為 [...]。對散列的遍歷用到了 \fIkeys()\fR 函數,但是對數組的散列不會。你需要修改對這樣的數組進行遍歷 的循環。 .PP awk 預設 \s-1OFMT\s0 的值是 %.6g,perl預設作用相同的成分 $# 的值是 %.20g。如果你想使用 \s-1OFMT\s0 的預設值,你需要 顯式地定義$#。 .PP 在循環頂部總是會出現分支操作,這是awk稿本中暗含的。很多時候 你可以將對整個記錄的判斷移到循環下面,這樣可以減少很多分支判斷。 .PP 出於美學原因,你也許想將數組的起始值 $[ 從1轉為perl預設的0 但是要記住將所有數組的下標 \s-1AND\s0 和 \fIsubstr()\fR 還有 \fIindex()\fR 函數都進行更改,保証正確。 .PP a2p會聰明地在在未處理的稿本中添加注釋 "# Here is a workaround because awk is dumb" .PP awk稿本經常使用在shell稿本中,通過管道接受和輸出文本。 大部分時候這種shell稿本"wrapper"可以和perl合並, 因為perl可以建立輸入輸出管道,做其他awk不能做的事情。 .PP 對\s-1RSTART\s0 和 \s-1RLENGTH\s0 變量進行引用的稿本可以簡單地 修改為對變量$\`, $& 和 $\' 的引用,只要他們是在模式匹配的范圍之內。 .PP 產生的perl稿本可能含有子程式來處理awk的getline和print函數。由於 a2p通常將正確性放在首位而不是效率,一般可以將子程式重寫得更有效率。 .PP 為了提高效率,你可以將子程式中的return去掉,只要返回值是子程式中的 最後一個語句。a2p可以處理最簡單的情況,但是不能分析嵌入程式塊的情況。 .PP \s-1ARGV\s0[0] 翻譯為 \f(CW$ARGV0\fR, 但是 \s-1ARGV\s0[n] 會翻譯為 \f(CW$ARGV\fR[$n]。 遍歷 \s-1ARGV\s0[0] 的循環將找不到它。 .SH "環境 (ENVIRONMENT)" a2p不使用環境變量 .SH "作者 (AUTHORS)" Larry Wall <\fIlarry@wall.org\fR> .SH "檔案 (FILE)" .SH "另見 (SEE ALSO)" .PP perl perl 編譯器和解釋器 s2p sed 到 perl的翻譯工具 .SH "診斷 (DIAGNOSTICS)" .SH "BUGS" 可以在運行時根據操作數來選擇字符還是數字操作,從而模擬awk。 但是這樣非常粗野並且無效率。另外,a2p通常都能猜對。 .PP 當前,awk語法樹是靜態存儲的,空間可能會耗盡。 .SH "[中文版維護人]" 袁乙鈞 .SH "[中文版最新更新]" .BR 2003/10/25 .SH "《中國Linux論壇man手冊頁翻譯計劃》" http://cmpp.linuxforum.net