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