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.

use Remember;my ($fred, $x);$x = tie $fred, "Remember", "camel.log";$fred = 1;$fred = 4;comment $x "changing...";$fred = 5;untie $fred;system "cat camel.log";现 在 这 个 文 件 会 是 空 的 , 而 这 样 的 结 果 可 能 不 是 你 想 要 的 。 让 我 们 解 释 一 下 为 什 么 。 捆 绑 一个 变 量 实 际 上 是 把 它 和 构 造 器 返 回 的 对 象 关 联 起 来 。 这 个 对 象 通 常 只 有 一 个 引 用 : 那 个 藏 在捆 绑 变 量 身 后 的 。 调 用 “untie” 打 破 了 这 个 关 联 并 且 消 除 了 该 引 用 。 因 为 没 有 余 下 什 么 指 向该 对 象 的 引 用 , 那 么 就 会 出 发 DESTROY 方 法 。不 过 , 在 上 面 的 例 子 中 , 我 们 存 贮 了 第 二 个 指 向 捆 绑 到 $x 上 的 对 象 。 那 就 意 味 着 在 untie之 后 , 我 们 还 有 一 个 有 效 的 指 向 该 对 象 的 引 用 。 因 此 DESTROY 就 不 会 触 发 , 于 是 该 文 件就 得 不 到 输 出 冲 刷 并 且 关 闭 。 这 就 是 没 有 输 出 的 原 因 : 文 件 句 柄 的 缓 冲 区 仍 然 在 内 存 里 。 它在 程 序 退 出 之 前 不 会 存 储 到 磁 盘 上 。要 想 侦 测 到 这 些 东 西 , 你 可 以 用 -w 命 令 行 标 志 , 或 者 在 当 前 的 词 法 范 围 里 包 含 usewarnings "untie" 用 法 。 这 两 种 技 巧 都 等 效 于 在 仍 然 存 在 有 捆 绑 的 对 象 的 一 个 untie 调用 。 如 果 这 么 处 理 ,<strong>Perl</strong> 打 印 下 面 的 警 告 :untie attempted while 1 inner references still exist要 想 让 程 序 能 够 运 行 而 且 看 不 见 这 些 警 告 , 那 么 就 要 在 调 用 untie 之 前 删 除 任 何 多 余 的 指向 捆 绑 对 象 的 引 用 。 你 可 以 用 下 面 的 方 法 明 确 地 处 理 :undef $x;untie $fred;不 过 , 通 常 你 可 以 通 过 让 变 量 在 合 适 的 时 刻 跑 出 范 围 来 解 决 问 题 。398

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

Saved successfully!

Ooh no, something went wrong!