13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1。 首 先 ,<strong>Perl</strong> 预 先 在 最 先 结 束 的 块 里 面 查 找 , 看 看 该 变 量 是 否 有 用 my( 或 则 our) 定义 在 该 代 码 块 里 ( 参 考 那 些 第 二 十 九 章 的 内 容 和 第 四 章 , 语 句 和 声 明 和 , 里 面 的 “ 范 围 声 明 ”节 )。 如 果 存 在 my 定 义 , 那 么 该 变 量 是 词 法 范 围 内 的 而 不 存 在 于 任 何 包 里 —— 它 只 存 在于 那 个 词 法 范 围 ( 也 就 是 在 该 代 码 块 的 暂 时 缓 存 器 里 )。 因 为 词 法 范 围 是 非 命 名 的 , 在 那 块程 序 之 外 的 任 何 人 甚 至 都 看 不 到 你 的 变 量 。( 注 : 如 果 你 用 的 是 our 定 义 而 非 my, 这 样只 是 给 一 个 包 变 量 定 义 了 一 个 词 法 范 围 的 别 名 ( 外 号 ), 而 不 象 my 定 义 里 面 真 正 地 定 义了 一 个 词 法 范 围 变 量 。 代 码 外 部 仍 然 可 以 通 过 变 量 的 包 获 取 其 值 , 但 除 此 以 外 ,our 定 义和 my 定 义 的 特 点 是 一 样 的 。 如 果 你 想 在 和 use strict 一 起 使 用 ( 参 阅 第 三 十 一 章 里 的strict progma ), 限 制 自 己 的 全 局 变 量 的 使 用 时 很 有 用 。 不 过 如 果 你 不 需 要 全 局 变 量 时你 应 该 优 先 使 用 my。)2。 如 果 上 面 过 程 失 败 ,<strong>Perl</strong> 尝 试 在 包 围 该 代 码 段 的 块 里 查 找 , 仍 然 是 在 这 个 更 大 的 代 码 块里 查 找 词 法 范 围 的 变 量 。 同 样 , 如 果 <strong>Perl</strong> 找 到 一 个 , 那 么 就 象 我 们 刚 刚 在 第 一 步 里 说 到 的变 量 一 样 , 该 变 量 只 属 于 从 其 定 义 开 始 到 其 定 义 块 结 束 为 止 的 词 法 范 围 —— 包 括 任 何 嵌 套 的代 码 块 。 如 果 <strong>Perl</strong> 没 有 发 现 定 义 , 那 么 它 将 重 复 第 二 步 直 到 用 光 所 有 上 层 闭 合 块 。3。 当 <strong>Perl</strong> 用 光 上 层 闭 合 块 后 , 它 检 查 整 个 编 辑 单 元 , 把 它 当 作 代 码 块 寻 找 声 明 ( 一 个 编辑 单 元 就 是 整 个 当 前 文 件 , 或 者 一 个 被 eval STRING 操 作 符 编 译 过 的 当 前 字 串 。) 如 果编 辑 单 元 是 一 个 文 件 , 那 就 是 最 大 的 词 法 范 围 , 这 样 <strong>Perl</strong> 将 不 再 查 找 词 法 范 围 变 量 , 于 是进 入 第 四 步 。 不 过 , 如 果 编 辑 单 元 是 一 个 字 串 , 那 事 情 就 有 趣 了 。 一 个 当 作 运 行 时 的 <strong>Perl</strong> 代码 编 译 的 字 串 会 假 装 它 是 在 一 个 eval STRING 运 行 着 的 词 法 范 围 里 面 的 一 个 块 , 即 使 其实 际 词 法 范 围 只 是 包 含 代 码 的 字 串 而 并 非 任 何 真 实 的 花 括 弧 也 如 此 。 所 以 如 果 <strong>Perl</strong> 没 有 在字 串 的 词 法 范 围 找 到 变 量 , 那 么 我 们 假 装 eval STRING 是 一 个 块 并 且 回 到 第 2 步 , 这 回我 们 才 检 查 eval STRING 的 词 法 范 围 而 不 是 其 内 部 字 串 的 词 法 范 围 。4。 如 果 我 们 走 到 这 一 步 , 说 明 <strong>Perl</strong> 没 有 找 到 你 的 变 量 的 任 何 声 明 (my 或 our)。<strong>Perl</strong>现 在 放 弃 词 法 范 围 并 假 设 你 的 变 量 是 一 个 包 变 量 。 如 果 strict pragma 用 法 有 效 , 你 现 在会 收 到 一 个 错 误 , 除 非 该 变 量 是 一 个 <strong>Perl</strong> 预 定 义 的 变 量 或 者 已 经 输 入 到 当 前 包 里 面 。 这 是因 为 strict 用 法 不 允 许 使 用 非 全 称 的 全 局 名 字 。 不 过 , 我 们 还 是 没 有 完 成 词 法 范 围 的 处 理 。<strong>Perl</strong> 再 次 搜 索 词 法 范 围 , 就 象 在 第 1 步 到 第 3 步 里 一 样 , 不 过 这 次 它 找 的 是 package( 包 ) 声 明 而 不 是 变 量 声 明 。 如 果 它 找 到 这 样 的 包 声 明 , 那 它 就 知 道 找 到 的 这 些 代 码 是 为 有问 题 的 包 编 译 的 于 是 就 在 变 量 前 面 追 加 这 个 声 明 包 的 名 字 。5。 如 果 在 任 何 词 法 范 围 内 都 没 有 包 声 明 ,<strong>Perl</strong> 就 在 未 命 名 的 顶 层 包 里 面 查 找 , 这 个 包 正 好就 是 main—— 只 要 它 没 有 不 带 名 字 到 处 乱 跑 。 因 此 相 对 于 任 何 缺 失 的 声 明 ,$bert 和$::bert 的 含 义 相 同 , 也 和 $main:bert 相 同 。( 不 过 , 因 为 main 只 是 在 顶 层 未 命 名包 中 的 另 一 个 包 , 该 变 量 也 是 $::main::bert, 和 $main::main::bert,$::main::main::bert 等 等 。 这 些 可 以 看 作 没 用 的 特 性 。 参 考 第 10 章 里 的 “ 符 号 表 ”。)56

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

Saved successfully!

Ooh no, something went wrong!