Manpages

NAME

perlfaq1 − 有 关 Perl 的 一 般 问 题 (2003/11/23 08:02:29)

DESCRIPTION 描 述

有 关 Perl 的 一 般 的 , 非 技 术 层 次 的 问 题

What is Perl? 什 么 是 Perl

Perl是 一 个 高 阶 程 式 语 言 , 由 Larry Wall和 其 他 许 多 人 所 写 , 融 合 了 许 多 语 言 的 特 性 。 它 主 要 是 由 无 所 不 在 的 C语 言 , 其 次 由 sed、 awk, UNIX shell 和 至 少 十 数 种 其 他 的 工 具 和 语 言 所 演 化 而 来 。 Perl对 process、 档 案 , 和 文 字 有 很 强 的 处 理 、 变 换 能 力 , 因 此 举 凡 有 关 快 速 原 型 设 计 、 系 统 工 具 、 软 体 工 具 、 系 统 管 理 、 资 料 库 连 结 、 图 像 程 式 设 计 、 网 路 连 结 , 和 WWW程 式 设 计 等 之 类 的 任 务 , 都 特 别 适 合 用 Perl来 做 。 这 些 特 长 不 但 使 Perl成 为 系 统 维 护 管 理 者 和 CGI作 者 的 宠 儿 , 就 连 数 学 家 、 遗 传 学 家 、 新 闻 从 业 者 , 甚 至 企 业 管 理 者 也 都 用 Perl, 所 以 或 许 您 也 该 用 。

谁 对 Perl 提 供 支 持 ? 谁 开 发 了 它 ? 为 什 么 它 是 自 由 的 ?

Perl自 由 开 放 的 发 行 方 式 要 归 功 於 发 烧 前 的 Internet的 传 统 文 化 及 其 作 者 Larry Wall。 Perl是 由 使 用 者 提 供 支 援 。 现 在 Perl的 核 心 、 标 准 程 式 库 、 选 择 性 安 装 的 模 组 , 以 及 您 现 在 正 在 阅 读 的 使 用 说 明 都 出 自 於 义 务 者 之 手 。 详 情 请 见 perl原 始 码 发 行 版 中 所 附 的 README档 案 底 部 的 私 人 注 记 。

值 得 一 提 的 是 , 核 心 发 展 小 组 ( 称 为 Perl Porters) 的 成 员 是 一 群 高 度 热 情 奉 献 的 人 仕 , 全 心 投 入 发 展 出 比 您 所 能 想 像 、 用 钱 能 买 得 到 还 要 更 好 的 免 费 软 体 。 您 可 经 由 http://www.xray.mpe.mpg.de/mailing−lists/perl5−porters/http://archive.develooper.com/perl5−porters [AT] perl.org/ 或 者 新 闻 服 务 器 nntp://nntp.perl.org/perl.perl5.porters 或 它 的 web 界 面 http://nntp.perl.org/group/perl.perl5.porters , 也 可 以 订 阅 邮 件 列 表 perl5−porters−request [AT] perl.org (没 有 主 题 的 空 消 息 也 是 可 以 的 ) 取 得 关 於 新 近 发 展 计 画 的 信 息 。

尽 管 GNU计 画 将 Perl囊 括 在 它 的 发 行 中 , 但 是 没 有 叫 「 GNU Perl」 这 样 的 东 西 。 Perl既 非 自 由 软 体 基 金 会 所 创 , 亦 非 由 其 负 责 维 护 。 Perl的 发 行 条 款 同 时 也 较 GNU软 体 更 来 得 开 放 。

如 果 您 愿 意 , 您 可 以 购 买 商 业 性 的 Perl支 援 。 但 对 大 多 数 使 用 者 来 说 , 非 正 式 性 的 支 援 通 常 已 相 当 足 够 。 详 情 请 见 「 到 哪 里 可 买 到 商 业 性 的 Perl支 援 」 一 问 的 回 答 。

Which version of Perl should I use? 我 该 用 哪 一 个 版 本 的 Perl?

您 绝 对 该 用 第 五 版 。 第 四 版 不 但 老 旧 、 功 能 较 局 限 , 而 且 已 经 不 再 维 护 了 。 它 最 後 一 次 的 修 正 (4.036)是 在 1992年 。 Perl最 新 的 量 产 发 行 版 本 是 5.8.2 (但 是 5.005_03 和 5.6.2 也 被 支 持 )。 等 到 您 读 这 篇 文 章 时 , 我 们 可 能 已 经 又 发 行 了 几 个 正 式 的 除 错 版 本 , 同 时 大 概 又 会 有 些 替 下 一 版 路 的 实 验 版 出 来 。 本 文 由 此 开 始 凡 提 及 Perl语 言 , 皆 以 目 前 的 量 产 发 行 为 准 , 除 非 另 外 特 别 注 明 。 所 有 5.004 之 前 的 版 本 都 有 buffer 溢 出 漏 洞 , 是 非 常 严 重 的 问 题 。

perl4 和 perl5 各 代 表 什 麽 ?

perl4 和 perl5 是 对 Perl程 式 语 言 的 两 个 不 同 版 本 的 非 正 式 称 呼 , 因 为 说 「 perl5」 要 比 说 「 第 5(.004)版 的 Perl」 要 来 得 简 单 。 但 是 有 些 人 误 将 其 会 意 为 : perl5是 一 个 单 独 的 语 言 ; 这 是 不 正 确 的 。 perl5只 不 过 是 对 第 五 个 主 要 发 行 版 本 ( 1994年 10 月 ) 常 用 的 称 呼 罢 了 。 就 像 perl4是 指 第 四 个 主 要 发 行 ( 1991年 3 月 ) , 还 有 perl1( 1988年 1月 ) 、 perl2( 1988年 6 月 ) , 以 及 perl3( 1989年 10 月 ) 。

5.0的 发 行 基 本 上 是 从 零 开 始 , 所 有 程 式 码 完 全 重 新 写 过 的 版 本 。 它 已 经 被 模 组 化 、 物 件 导 向 化 、 微 调 、 精 简 化 , 及 效 率 化 , 以 致 程 式 码 几 乎 已 变 得 和 原 来 的 不 相 同 了 。 尽 管 如 此 , 使 用 介 面 大 致 上 仍 然 相 同 , 而 且 和 先 前 的 版 本 之 间 保 持 了 很 高 的 一 致 性 。 参 见 perltrap 中 的 "Perl4 to Perl5 Traps" .

为 了 避 免 「 perl5是 什 麽 语 言 ? 」 这 类 的 混 淆 , 有 些 人 索 性 完 全 避 免 「 perl5」 , 而 单 用 「 perl」 来 指 称 最 近 的 perl版 本 。 其 实 用 不 着 这 麽 累 就 是 了 。

参 见 perlhist 中 Perl 版 本 的 历 史

What is Ponie? 什 么 是 Ponie

At The O’Reilly Open Source Software Convention in 2003, Artur Bergman, Fotango, and The Perl Foundation announced a project to run perl5 on the Parrot virtual machine named Ponie. Ponie stands for Perl On New Internal Engine. The Perl 5.10 language implementation will be used for Ponie, and there will be no language level differences between perl5 and ponie. Ponie is not a complete rewrite of perl5.

For more details, see http://www.poniecode.org/

What is perl6?

At The Second O’Reilly Open Source Software Convention, Larry Wall announced Perl6 development would begin in earnest. Perl6 was an oft used term for Chip Salzenberg’s project to rewrite Perl in C ++ named Topaz. However, Topaz provided valuable insights to the next version of Perl and its implementation, but was ultimately abandoned.

If you want to learn more about Perl6, or have a desire to help in the crusade to make Perl a better place then peruse the Perl6 developers page at http://dev.perl.org/perl6/ and get involved.

Perl6 is not scheduled for release yet, and Perl5 will still be supported for quite awhile after its release. Do not wait for Perl6 to do whatever you need to do.

"We’re really serious about reinventing everything that needs reinventing." −−Larry Wall

Perl的 发 展 已 稳 定 了 吗 ?

融 合 了 除 错 和 新 功 能 的 量 产 发 行 在 推 出 前 皆 经 过 广 泛 的 测 试 。 自 5.000发 行 以 来 , 我 们 平 均 一 年 才 出 版 一 次 量 产 发 行 。

Larry 和 Perl发 展 小 组 有 时 候 会 修 改 语 言 的 核 心 部 分 , 但 总 是 尽 一 切 力 量 让 新 版 和 旧 版 保 持 一 致 。 因 此 , 尽 管 不 是 所 有 的 perl4 scripts都 能 在 perl5 之 下 跑 得 天 衣 无 缝 , 因 升 级 而 导 致 按 照 先 前 版 本 的 perl所 写 的 程 式 无 法 使 用 的 情 形 几 乎 不 曾 发 生 ( 除 非 该 程 式 倚 赖 已 经 被 去 除 的 bugs, 或 使 用 了 极 少 数 新 加 入 的 指 令 来 命 名 ) 。

Perl难 学 吗 ?

Perl不 但 容 易 上 手 , 也 容 易 继 续 学 下 去 。 它 看 起 来 和 大 多 数 您 可 能 已 接 触 过 的 语 言 一 样 。 所 以 如 果 您 只 写 过 C 程 式 、 或 awk script、 shell script, 或 甚 至 只 是 Excel的 macro 宏 , 您 已 经 在 半 路 了 。

大 多 数 的 任 务 只 需 要 Perl语 言 的 一 小 部 分 即 可 完 成 。 发 展 Perl程 式 的 座 右 铭 即 是 「 不 只 一 种 方 法 可 以 达 到 」 ( TMTOWTDI; There’s More Than One Way To Do It, 有 时 读 作 「 time today」 ) 。 因 此 , Perl的 学 习 曲 线 是 既 平 ( 易 学 ) 且 长 的 ( 如 果 您 要 的 话 , 有 一 大 堆 够 您 学 的 )

最 後 , Perl( 通 常 ) 算 是 解 释 执 行 的 语 言 。 也 就 是 说 您 写 了 程 式 後 不 需 经 由 一 道 中 间 的 编 码 过 程 即 可 测 试 ; 这 让 您 可 以 很 快 、 很 容 易 地 测 试 及 除 错 。 这 个 方 便 试 验 的 特 性 又 让 学 习 曲 线 变 得 更 加 平 坦 。

有 助 於 修 习 Perl 的 一 些 事 : UNIX经 验 、 对 几 乎 是 任 何 一 种 程 式 语 言 的 经 验 、 了 解 regular expressions( 正 规 表 示 法 ) , 以 及 看 得 懂 旁 人 写 的 程 式 的 能 力 。 如 果 您 有 什 麽 想 用 Perl来 做 的 事 , 那 麽 可 能 已 经 有 前 人 做 过 了 , 而 且 实 例 通 常 可 免 费 取 得 。 还 有 别 忘 了 新 的 Perl模 组 。 模 组 在 这 份 FAQ 的 第 叁 部 分 有 详 细 的 讨 论 , 还 有 【 别 忘 了 您 的 好 朋 友 】 CPAN, 这 会 在 第 二 部 分 谈 到 。

How does Perl compare with other languages like Java, Python, REXX , Scheme, or Tcl?

Perl在 某 些 地 方 比 较 好 , 某 些 地 方 较 差 。 精 确 地 说 到 底 哪 些 方 面 好 或 坏 通 常 视 个 人 偏 好 而 定 , 所 以 在 新 闻 讨 论 群 中 问 这 种 问 题 很 可 能 会 掀 起 一 场 毫 无 建 设 性 的 圣 战 。

要 比 较 各 语 言 的 异 同 最 好 的 方 法 是 试 着 用 不 同 的 语 言 写 功 能 相 同 的 程 式 。 各 程 式 语 言 都 各 有 属 於 它 们 各 自 的 新 闻 讨 论 群 , 您 可 从 中 学 习 ( 但 希 望 您 不 是 去 和 人 辨 论 吵 架 的 ) 。

如 果 还 是 不 听 劝 告 的 话 , 可 以 去 看 http://language.perl.com/versus/ 的 语 言 比 较

我 可 以 用 Perl来 做 【 某 种 差 事 】 吗 ?

Perl有 足 够 的 弹 性 和 扩 充 性 , 从 只 需 要 写 短 短 一 行 的 档 案 处 理 工 作 到 复 杂 的 系 统 , 几 乎 没 有 什 麽 做 不 到 的 。 对 有 些 人 来 说 , Perl的 是 拿 来 做 写 shell程 式 的 理 想 替 代 品 。 其 他 人 则 用 高 阶 的 Perl来 替 代 处 理 许 多 原 先 需 要 用 C或 C++ 一 类 的 低 阶 语 言 来 达 到 的 程 式 。 哪 些 差 事 决 定 要 用 Perl来 处 理 , 这 一 切 都 得 看 您 ( 或 许 还 有 您 的 经 理 ...) 。

如 果 您 有 一 个 提 供 API的 程 式 库 的 话 , 您 可 用 C或 C++来 写 一 个 Perl 延 伸 , 然 後 便 可 透 过 它 将 程 式 库 中 的 任 何 一 部 分 动 态 载 入 您 的 Perl主 程 式 中 。 您 也 可 以 反 过 来 , 用 C或 C++来 写 主 程 式 , 然 後 以 即 时 动 态 载 入 的 方 式 插 入 一 些 Perl程 式 码 , 产 生 一 个 威 力 强 大 的 应 用 程 式 。 参 见 perlembed.

话 虽 如 此 , 对 解 决 某 些 特 定 的 问 题 , 使 用 小 型 、 专 精 , 专 为 特 殊 用 途 设 计 的 语 言 总 是 比 较 方 便 的 。 Perl的 设 计 是 尽 力 地 满 足 各 种 不 同 人 的 需 要 , 因 而 不 特 别 偏 颇 任 何 人 。 至 於 特 殊 功 能 语 言 的 例 子 , 随 便 举 两 个 , 譬 如 prolog 和 matlab 便 是 。

哪 些 场 合 下 不 适 合 用 Perl?

当 您 的 主 管 禁 止 的 时 候 -- 不 过 请 务 必 考 虑 把 他 们 换 掉 :−)。

说 真 的 , 如 果 您 已 经 有 用 另 一 个 语 言 写 成 的 应 用 程 式 ( 而 且 写 得 很 好 ) 的 时 候 , 或 者 是 已 经 有 替 某 些 特 定 的 工 作 设 计 的 语 言 ( 例 如 : prolog, make) , 这 个 时 候 就 不 需 要 用 Perl。

由 於 种 种 因 素 , Perl大 概 不 太 适 合 拿 来 做 即 时 内 嵌 式 系 统 、 属 於 低 层 级 的 作 业 系 统 发 展 工 作 , 例 如 周 边 设 备 的 drivers或 环 境 转 换 码 、 复 杂 的 多 线 共 用 记 忆 体 应 用 程 式 , 或 非 常 大 的 应 用 程 式 。 您 会 发 现 Perl 本 身 便 不 是 以 Perl写 成 的 。

刚 出 炉 的 Perl纯 码 编 译 器 或 许 可 帮 忙 去 除 一 些 上 述 的 限 制 , 但 您 要 了 解 : Perl在 本 质 上 仍 是 一 活 性 变 数 语 言 (dynamically typed language), 而 非 固 性 变 数 (statically typed)。 只 要 您 不 将 核 电 厂 或 脑 科 手 术 监 视 器 所 用 的 程 式 放 心 地 用 Perl来 写 , 您 自 然 就 不 会 闯 祸 遭 殃 。 这 样 Larry晚 上 也 可 以 睡 得 安 稳 些 了 :−)。

「 perl」 和 「 Perl」 有 什 麽 不 同 ?

二 者 差 一 个 位 元 。 喔 , 您 不 是 说 在 ASCII上 的 差 别 啊 ? :-) Larry现 在 用 「 Perl」 来 代 表 语 言 本 身 , 而 以 「 perl」 来 表 示 该 语 言 的 体 现 , 即 目 前 的 解 译 器 。 因 此 , 作 者 有 句 幽 默 小 语 说 : 「 只 有 perl可 以 解 译 Perl」 。 要 不 要 遵 照 这 个 用 法 是 您 的 自 由 。 举 一 反 叁 的 话 , 我 们 可 依 样 画 葫 芦 地 说 「 awk 和 perl」 还 有 「 Python 和 Perl」 , 但 却 不 可 将 「 awk 和 Perl」 或 是 「 Python 和 perl」 摆 在 一 起 。

Perl程 式 应 算 是 program还 是 script?

都 无 所 谓 。 他 半 开 玩 笑 地 说 , "脚 本 script 是 你 让 演 员 来 演 的 。 程 序 program 是 你 给 观 众 的 。 "

最 初 , 脚 本 是 打 包 的 普 通 的 交 互 的 命 令 序 列 , -- 也 就 是 说 , 一 个 对 话 脚 本 , 类 似 UUCPPPP 对 话 脚 本 或 者 一 个 expect 脚 本 , 可 以 很 好 地 处 理 一 些 小 事 , 类 似 在 应 用 程 序 启 动 之 前 进 行 一 些 俄 设 置 等 等 , 类 似 .cshrc.ircrc。 对 话 脚 本 仅 仅 是 驱 动 已 有 的 程 序 , 并 不 是 独 立 的 程 序 。

计 算 机 专 家 会 解 释 说 , 所 有 程 序 都 是 解 释 执 行 的 , 但 是 问 题 是 从 哪 个 层 次 去 考 虑 。 如 果 你 问 一 个 不 是 计 算 机 专 家 的 人 , 他 们 可 能 告 诉 你 , 一 个 program 是 已 被 编 译 为 机 器 码 , 一 次 编 译 多 次 运 行 的 东 西 , 而 一 个 script 在 每 次 使 用 时 都 必 须 首 先 翻 译 为 program

Perl 程 序 通 常 不 是 严 格 的 编 译 或 解 释 执 行 的 。 它 们 可 以 被 编 译 为 字 节 码 形 式 (可 以 在 Perl 虚 拟 机 中 运 行 ) 或 者 完 全 不 同 的 其 他 语 言 , 例 如 C 或 汇 编 。 你 不 能 仅 仅 从 源 程 序 推 断 它 是 否 应 当 被 一 个 纯 解 释 器 , 一 个 分 析 树 解 释 器 , 一 个 字 节 码 解 释 器 或 者 一 个 本 地 代 码 编 译 器 来 运 行 , 因 此 在 这 里 很 难 给 出 一 个 确 定 的 答 案

现 在 script 和 scripting 已 成 为 被 不 慎 重 的 人 和 无 知 的 商 人 为 了 自 己 恶 毒 的 目 的 而 用 到 的 两 个 词 , 它 们 开 始 拥 有 奇 怪 的 , 贬 义 的 含 义 , 类 似 "不 严 谨 non serious" 或 "不 是 真 正 的 编 程 ". 因 此 , 一 些 Perl 程 序 员 选 择 不 把 它 们 同 时 比 较 。

JAPH 是 什 麽 ?

这 是 过 去 一 些 在 讨 论 群 中 自 称 ’’just another perl hacker’’ 的 人 的 签 名 档 , Randal Schwartz 开 了 这 样 的 先 河 。 约 有 一 百 个 比 较 早 期 的 版 本 , 可 在 http://www.cpan.org/misc/japh 获 得 。

到 哪 儿 可 拿 到 Larry Wall 的 智 慧 讽 语 (witticisms)?

一 百 多 条 Larry的 讽 语 , 源 自 他 【 在 讨 论 群 】 的 posts或 原 始 码 , 可 在 http://www.cpan.org/misc/lwall−quotes.txt.gz 获 得

我 要 如 何 取 信 、 说 服 我 的 系 统 管 理 者 / 上 司 / 属 下 使 用 第 5/5.8.3 版 的 Perl, 而 不 去 用 其 他 的 语 言 ?

如 果 您 的 管 理 阶 层 或 属 下 对 没 有 支 援 的 软 体 , 或 是 未 正 式 包 含 在 所 购 买 的 作 业 系 统 中 的 软 体 存 有 戒 心 的 话 , 您 可 以 试 着 从 有 助 他 们 自 身 利 益 这 方 面 下 手 。 因 为 如 果 程 式 设 计 师 能 由 善 加 利 用 Perl的 结 构 、 功 能 性 、 简 单 性 , 和 威 力 而 获 得 更 大 的 生 产 力 的 话 , 那 麽 典 型 的 管 理 者 / 上 司 / 员 工 或 许 便 可 因 而 加 以 说 服 。 此 外 , 使 用 Perl, 总 的 来 讲 , 和 其 他 语 言 相 较 , 或 许 也 有 助 於 减 少 交 件 的 时 间 。 强 调 这 个 论 点 或 许 对 说 服 他 们 会 有 帮 助 。

如 果 您 的 专 题 碰 到 瓶 颈 , 特 别 是 有 关 转 译 或 测 试 方 面 的 问 题 , 那 麽 Perl可 以 说 绝 对 会 是 一 个 既 可 行 且 快 的 解 决 之 道 。 您 在 当 说 客 的 时 候 , 千 万 别 忘 了 要 提 : Perl已 被 世 界 上 许 多 大 型 的 软 硬 体 公 司 广 泛 、 大 量 地 使 用 , 极 为 可 靠 、 有 效 。 事 实 上 , 现 Perl已 成 为 许 多 Unix业 者 所 售 的 作 业 系 统 的 标 准 配 备 了 。 而 且 如 果 您 无 法 在 详 尽 的 使 用 说 明 , 包 括 这 份 FAQ之 中 为 您 的 问 题 找 到 解 答 的 话 , 送 封 post 到 新 闻 讨 论 群 即 可 。

参 见 http://www.perl.org/advocacy/

如 果 您 面 对 反 对 perl升 级 的 声 音 , 那 麽 告 诉 他 们 Perl发 展 小 组 已 经 完 全 不 再 维 护 或 支 援 第 四 版 的 perl了 。 perl5的 另 一 个 大 卖 点 是 它 有 大 量 的 模 组 和 延 伸 , 可 大 大 减 少 计 画 的 发 展 时 间 。 还 有 , 告 诉 他 们 第 四 和 第 五 版 Perl之 间 的 差 异 就 如 awk 和 C++的 差 别 一 样 ( 嗯 , 或 许 没 有 差 得 那 麽 明 显 , 但 您 知 道 我 的 意 思 就 好 ) 。 如 果 您 想 得 到 支 援 而 且 想 确 保 您 现 在 所 发 展 的 软 体 在 未 来 能 继 续 工 作 的 话 , 那 麽 您 得 跑 有 支 援 的 版 本 。 在 2003 年 12 月 , 这 大 概 也 就 是 说 要 跑 5.8.2 版 的 , 或 者 稍 微 旧 一 些 的 版 本 如 5.6.2 (November 2003 发 布 ; 一 个 修 正 发 行 , 使 得 perl 5.6 在 新 系 统 中 可 以 编 译 , 因 为 5.6.1发 行 早 在 April 2001) 或 5.005_03 (March 1999 发 行 ), 如 果 你 一 定 要 一 个 旧 版 本 来 保 持 兼 容 性 , 使 用 5.004_05 也 不 坏 。 比 5.004_05 更 旧 的 版 本 坚 决 不 能 再 用

Of particular note is the massive bug hunt for buffer overflow problems that went into the 5.004 release. All releases prior to that, including perl4, are considered insecure and should be upgraded as soon as possible.

In August 2000 in all Linux distributions a new security problem was found in the optional ’suidperl’ (not built or installed by default) in all the Perl branches 5.6, 5.005, and 5.004, see http://www.cpan.org/src/5.0/sperl−2000−08−05/ Perl maintenance releases 5.6.1 and 5.8.0 have this security hole closed. Most, if not all, Linux distribution have patches for this vulnerability available, see http://www.linuxsecurity.com/advisories/ , but the most recommendable way is to upgrade to at least Perl 5.6.1.

AUTHOR AND COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen and Nathan Torkington. All rights reserved.

This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.

Irrespective of its distribution, all code examples here are in the public domain. You are permitted and encouraged to use this code and any derivatives thereof in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit to the FAQ would be courteous but is not required.

译 者

萧 百 龄 , 两 只 老 虎 工 作 室