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.

如 果 你 在 一 个 对 象 上 使 用 一 个 未 重 载 的 操 作 符 ,<strong>Perl</strong> 首 先 用 我 们 早 先 描 述 过 的 规 则 , 尝 试从 其 他 重 载 的 操 作 符 里 自 动 生 成 一 个 行 为 。 如 果 这 样 失 败 了 , 那 么 <strong>Perl</strong> 找 一 个 重 载nomethod 得 到 的 行 为 , 如 果 可 行 , 则 用 之 。 这 个 句 柄 之 于 操 作 符 就 好 象 AUTOLOAD 子过 程 之 于 子 过 程 : 它 是 你 走 投 无 路 的 时 候 干 的 事 情 。如 果 用 了 nomethod, 那 么 nomethod 键 字 应 该 后 面 跟 着 一 个 引 用 , 该 引 用 指 向 一 个 接受 四 个 参 数 的 句 柄 。 前 面 三 个 参 数 和 任 何 其 他 句 柄 里 的 没 有 区 别 ; 第 四 个 是 一 个 字 串 , 对 应缺 失 句 柄 的 那 个 操 作 符 。 它 起 的 作 用 和 AUTOLOAD 子 过 程 里 的 $AUTOLOAD 变 量 一样 。如 果 <strong>Perl</strong> 不 得 不 找 一 个 nomethod 句 柄 , 但 是 却 找 不 到 , 则 抛 出 一 个 例 外 。如 果 你 想 避 免 发 生 自 动 生 成 , 或 者 你 想 要 一 个 失 效 的 自 动 生 成 , 这 样 你 就 可 以 得 到 一 个 完 全没 有 重 载 的 结 果 , 那 么 你 可 以 定 义 特 殊 的 fallback 重 载 键 字 。 它 有 三 个 有 用 的 状 态 :• undef :如 果 没 有 设 置 fallback , 或 者 你 把 它 明 确 地 设 为 undef, 那 么 不 会 影 响 重 载 事 件 序列 : 先 找 一 个 句 柄 , 然 后 尝 试 自 动 生 成 , 最 后 调 用 nomethod。 如 果 都 失 败 则 抛 出 例 外 。• false:如 果 把 fallback 设 置 为 一 个 预 定 义 的 , 但 是 为 假 的 值 ( 比 如 0), 那 么 永 远 不 会 进 行自 动 生 成 。 如 果 存 在 nomethod 句 柄 , 那 么 <strong>Perl</strong> 将 调 用 之 , 否 则 则 抛 出 例 外 。• true:和 undef 有 几 乎 一 样 的 性 质 , 但 是 如 果 不 能 通 过 自 动 生 成 合 成 一 个 合 适 的 句 柄 , 那么 也 不 会 抛 出 例 外 。 相 反 ,<strong>Perl</strong> 回 复 到 该 操 作 符 没 有 重 载 的 性 质 , 就 好 象 根 本 没 有 在 那 个类 里 面 使 用 use overload 一 样 。13.6 重 载 常 量你 可 以 用 overload::constant 改 变 <strong>Perl</strong> 解 释 常 量 的 方 法 , 这 个 用 法 放 在 一 个 包 的import 方 法 里 很 有 用 。( 如 果 这 么 做 了 , 你 应 该 在 该 包 的 unimport 方 法 里 正 确 地 调 用overload::remove_constant, 这 样 当 你 需 要 的 时 候 , 包 可 以 自 动 清 理 自 身 。)overload::constant 和 overload::remove_constant 都 需 要 一 个 键 字 / 数 值 对 的 列表 。 这 些 键 字 应 该 是 integer,float,binary,q 和 qr 中 的 任 何 东 西 , 而 且 每 个 数 值 都应 该 是 一 个 子 过 程 的 名 字 , 一 个 匿 名 子 过 程 , 或 者 一 个 将 操 作 这 些 常 量 的 代 码 引 用 。343

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

Saved successfully!

Ooh no, something went wrong!