Manpages

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 但 是 要 記 住 將 所 有 數 組 的 下 標 ANDsubstr() 還 有 index() 函 數 都 進 行 更 改 , 保 証 正 確 。

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

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

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

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

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

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

環 境 (ENVIRONMENT)

a2p不 使 用 環 境 變 量

作 者 (AUTHORS)

Larry Wall <larry [AT] wall.org>

檔 案 (FILE)

另 見 (SEE ALSO)

perl perl 編 譯 器 和 解 釋 器

s2p sed 到 perl的 翻 譯 工 具

診 斷 (DIAGNOSTICS)

BUGS

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

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

[中 文 版 維 護 人 ]

袁 乙 鈞 <bbbush [AT] 163.com>

[中 文 版 最 新 更 新 ]

2003/10/25

《 中 國 Linux論 壇 man手 冊 頁 翻 譯 計 劃 》

http://cmpp.linuxforum.net