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 [AT] wall.org>
文 件 (FILE)
另 见 (SEE ALSO)
perl perl 编 译 器 和 解 释 器
s2p sed 到 perl的 翻 译 工 具
诊 断 (DIAGNOSTICS)
BUGS
可 以 在 运 行 时 根 据 操 作 数 来 选 择 字 符 还 是 数 字 操 作 , 从 而 模 拟 awk。 但 是 这 样 非 常 粗 野 并 且 无 效 率 。 另 外 , a2p通 常 都 能 猜 对 。
当 前 , awk语 法 树 是 静 态 存 储 的 , 空 间 可 能 会 耗 尽 。
[中 文 版 维 护 人 ]
袁 乙 钧 <bbbush [AT] 163.com>
[中 文 版 最 新 更 新 ]
2003/10/25