13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

用 的 话 , 这 样 的 反 序 允 许 相 关 的 BEGIN 和 END 块 按 照 你 预 期 的 方 法 嵌 套 , 比 如 , 如 果如 果 主 程 序 和 它 装 载 的 模 块 都 有 自 己 的 成 对 的 BEGIN 和 END 子 过 程 , 象 下 面 这 样 :BEGIN { parint "main begun" }END { print "main ended" }use Module;并 且 在 那 个 模 块 里 , 定 义 了 下 面 的 声 明 :BEGIN { print "module begun" }END { print "module ended" }那 么 主 程 序 就 知 道 它 的 BEGIN 总 是 首 先 发 生 , 而 它 的 END 总 是 最 后 使 用 。( 不 错 ,BEGIN 实 际 上 是 一 个 编 译 时 的 块 , 但 类 似 的 现 象 对 运 行 时 的 INIT 和 END 对 身 上 也 会发 生 。) 如 果 一 个 文 件 包 含 另 外 一 个 文 件 , 而 且 它 们 都 有 类 似 这 样 的 声 明 的 时 候 , 这 个 原 则是 递 归 地 正 确 的 。 这 样 的 嵌 套 属 性 令 这 些 块 可 以 很 好 地 当 作 包 构 造 器 和 析 构 器 来 使 用 。 每 个模 块 都 可 以 有 它 们 自 己 的 安 装 和 删 除 函 数 , 而 <strong>Perl</strong> 可 以 自 动 地 调 用 它 们 。 这 样 , 程 序 员 就不 用 总 是 记 住 是 否 用 了 某 个 库 , 是 否 在 某 时 需 要 调 用 特 殊 的 初 始 化 或 者 清 理 代 码 。 这 些 事 件都 由 模 块 的 声 明 来 保 证 。如 果 你 把 eval STRING 当 作 一 个 从 解 释 器 到 编 译 器 的 回 调 函 数 , 那 么 你 可 以 把 BEGIN看 作 从 编 译 器 到 解 释 器 的 前 进 函 数 。 它 们 两 个 都 是 暂 时 把 当 前 正 在 处 理 的 事 情 挂 起 来 然 后 切换 操 作 的 模 式 。 如 果 我 们 说 一 个 BEGIN 块 是 尽 可 能 早 地 执 行 , 我 们 的 意 思 就 是 说 它 在 完成 定 义 以 后 马 上 就 执 行 , 甚 至 是 在 包 含 它 的 文 件 的 其 他 部 分 分 析 之 前 。 因 此 BEGIN 块 是在 编 译 时 执 行 的 , 而 不 是 在 运 行 时 。 一 旦 一 个 BEGIN 块 开 始 运 行 , 那 么 它 马 上 就 取 消 定义 并 且 它 使 用 的 任 何 代 码 都 返 回 到 <strong>Perl</strong> 的 内 存 池 中 。 你 不 能 把 BEGIN 当 作 一 个 子 过 程调 用 ,( 你 试 了 也 没 有 用 。) 因 为 当 它 存 在 那 里 的 时 候 , 它 就 已 经 运 行 ( 消 失 ) 了 。和 BEGIN 块 类 似 ,INIT 块 都 是 在 <strong>Perl</strong> 运 行 时 开 始 执 行 之 前 运 行 的 , 顺 序 是 “ 先 进 先 出 ”(FIFO)。 比 如 , 在 perlcc 里 讲 到 的 代 码 生 成 器 使 用 INIT 块 初 始 化 并 解 析 指 向 XSUB的 指 针 。 INIT 块 实 际 上 和 BEGIN 块 一 样 , 只 不 过 是 它 们 让 程 序 员 分 开 了 必 须 在 编 译 阶段 发 生 的 构 造 和 必 须 在 运 行 阶 段 发 生 的 构 造 。 如 果 你 直 接 运 行 一 个 脚 本 , 这 两 者 没 什 么 大 区别 , 因 为 每 次 运 行 编 译 器 都 要 运 行 ; 但 是 如 果 编 译 和 执 行 是 分 开 的 , 那 么 这 样 的 区 别 就 可 能是 关 键 的 。 编 译 器 可 能 只 调 用 一 次 , 而 生 成 的 可 执 行 文 件 可 以 运 行 多 次 。和 END 块 类 似 ,CHECK 块 在 <strong>Perl</strong> 编 译 阶 段 完 成 之 后 而 在 开 始 运 行 阶 段 之 前 运 行 。 顺 序是 LIFO。CHECK 块 可 以 用 于 “ 退 出 ” 编 译 器 , 就 好 象 END 块 可 以 用 于 退 出 你 的 程 序 一 样 。特 别 是 后 端 都 把 CHECK 块 当 作 挂 钩 使 用 , 这 样 它 们 可 以 调 用 相 应 的 代 码 生 成 器 。 它 们 需490

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!