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.

{my $critter = "camel";$critterref = \$critter;}$$critterref 的 数 值 仍 将 是 “camel”, 即 使 在 离 开 闭 合 的 花 括 弧 之 后 $critter 消 失 了 也 如此 。 但 是 $critterref 也 可 以 指 向 一 个 指 向 了 $critter 的 子 过 程 :{my $critter = "camel";$critterref = sub { return $critter };}这 是 一 个 闭 合 ( 闭 包 ), 这 个 词 是 来 自 LISP 和 Scheme 那 些 机 能 性 (functional) 编程 世 界 的 。( 注 : 在 这 样 的 语 言 环 境 里 ,“functional”( 机 能 性 ) 应 该 看 作 是 “dysfunctional”( 机 能 紊 乱 ) 的 反 义 词 )。 这 就 意 味 着 如 果 你 某 一 时 刻 在 特 定 的 词 法 范 围 定 义 了 一 个 匿 名 函数 , 那 么 它 就 假 装 自 己 是 在 那 个 范 围 里 运 行 的 , 即 使 后 面 它 又 从 该 范 围 之 外 调 用 。( 一 个 力求 正 统 的 人 会 说 你 用 不 着 使 用 “ 假 装 ” 这 个 词 —— 它 实 际 上 就 是 运 行 在 该 范 围 里 。)换 句 话 说 ,<strong>Perl</strong> 保 证 你 每 次 都 获 得 同 一 套 词 法 范 围 变 量 的 拷 贝 , 即 使 该 词 法 变 量 的 其 他 实例 在 该 闭 合 的 实 例 之 前 或 者 自 该 闭 合 存 在 开 始 又 创 建 其 他 实 例 也 如 此 。 这 样 就 给 你 一 个 方 法让 你 可 以 在 定 义 子 过 程 的 时 候 设 置 子 过 程 里 的 数 值 , 而 不 仅 仅 是 在 调 用 它 们 的 时 候 。你 还 可 以 把 闭 合 看 作 是 一 个 不 用 eval 书 写 子 过 程 模 板 的 方 法 。 这 时 候 词 法 变 量 用 做 填 充模 板 的 参 数 , 作 用 主 要 是 设 置 很 少 的 一 些 代 码 用 于 稍 后 运 行 。 在 基 于 事 件 的 编 程 里 面 , 这 种做 法 常 常 叫 做 回 调 (callback), 比 如 你 把 一 些 代 码 和 一 次 键 盘 敲 击 , 鼠 标 点 击 , 窗 口 露 出等 等 关 联 起 来 。 如 果 当 作 回 调 使 用 , 闭 合 做 的 就 是 你 所 预 期 的 , 即 使 你 不 知 道 机 能 性 编 程 的第 一 件 事 情 也 无 妨 。( 请 注 意 这 些 与 闭 合 相 关 的 事 情 只 适 用 于 my 变 量 。 全 局 量 还 是 和 往常 一 样 运 转 , 因 为 它 们 不 是 按 照 词 法 变 量 的 方 式 创 建 和 删 除 的 。)闭 合 的 另 外 一 个 用 途 就 是 函 数 生 成 器 , 也 就 是 说 , 创 建 和 返 回 全 新 函 数 的 函 数 。 下 面 是 一 个用 闭 合 实 现 的 函 数 生 成 器 的 例 子 :sub make_saying {my $salute = shift;227

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

Saved successfully!

Ooh no, something went wrong!