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> 程 序 里 你 会 看 到 象 $main'sail 和$somepack'horse 这 样 的 变 量 。 不 过 , 双 冒 号 是 现 在 的 优 选 的 分 隔 符 , 部 分 原 因 是 因 为它 更 具 有 可 读 性 , 另 一 部 分 原 因 是 它 更 容 易 被 emacs 的 宏 读 取 。 而 且 这 样 表 示 也 令 C++程 序 员 觉 得 明 白 自 己 在 做 什 么 —— 相 比 之 下 , 用 单 引 号 的 时 候 就 能 让 Ada 的 程 序 员 知 道 自己 在 做 什 么 。 因 为 出 于 向 下 兼 容 的 考 虑 ,<strong>Perl</strong> 仍 然 支 持 老 风 格 的 语 法 , 所 以 如 果 你 试 图 使用 象 "This is $owner's house" 这 样 的 字 串 , 那 么 你 实 际 上 就 是 在 访 问 $owner::s; 也就 是 说 , 在 包 owner 里 的 $s 变 量 , 这 可 能 并 不 是 你 想 要 的 。 你 可 以 用 花 括 弧 来 消 除 歧义 , 就 象 "This is ${owner}'s house"。双 冒 号 可 以 用 于 把 包 名 字 里 的 标 识 符 链 接 起 来 :$Red::Blue::Var。 这 就 意 味 着 $var 属于 Red::Blue 包 。Red::Blue 包 和 任 何 可 能 存 在 的 Red 或 者 Blue 包 都 没 有 关 系 。 也就 是 说 , 在 Red::Blue 和 Red 或 者 Blue 之 间 的 关 系 可 能 对 那 些 书 写 或 使 用 这 个 程 序的 人 有 意 义 , 但 是 它 对 <strong>Perl</strong> 来 说 没 有 任 何 意 义 。( 当 然 , 在 当 前 的 实 现 里 , 符 号 表Red::Blue 碰 巧 存 储 在 Red 符 号 表 里 。 但 是 <strong>Perl</strong> 语 言 对 此 没 有 做 任 何 直 接 的 利 用 。)由 于 这 个 原 因 , 每 个 package 声 明 都 必 须 声 明 完 整 的 包 名 字 。 任 何 包 名 字 都 没 有 做 任 何隐 含 的 “ 前 缀 ” 的 假 设 , 甚 至 ( 看 起 来 象 ) 在 一 些 其 他 包 声 明 的 范 围 里 声 明 的 那 样 也 如 此 。只 有 标 识 符 ( 以 字 母 或 者 一 个 下 划 线 开 头 的 名 字 ) 才 存 储 在 包 的 符 号 表 里 。 所 有 其 他 符 号 都保 存 在 main 包 里 , 包 括 所 有 非 字 母 变 量 , 比 如 $!,$?, 和 $_。 另 外 , 在 没 有 加 以 修 饰的 时 候 , 标 识 符 STDIN,STDOUT,STDERR,ARGV,ARGVOUT,ENV,INC, 和 SIG都 强 制 在 包 main 里 , 即 使 你 是 用 做 其 他 目 的 , 而 不 是 用 做 它 们 的 内 建 功 能 也 如 此 。 不 要把 你 的 包 命 名 为 m,s,tr,q,qq,qr,qw, 或 者 qx, 除 非 你 想 自 找 一 大 堆 麻 烦 。 比 如 ,你 不 能 拿 修 饰 过 的 标 识 符 形 式 做 文 件 句 柄 , 因 为 它 将 被 解 释 成 一 个 模 式 匹 配 , 一 个 替 换 , 或者 一 个 转 换 。很 久 以 前 , 用 下 划 线 开 头 的 变 量 被 强 制 到 main 包 里 , 但 是 我 们 发 现 让 包 作 者 使 用 前 导 的下 划 线 作 为 半 私 有 的 标 识 符 标 记 更 有 用 , 这 样 它 们 就 可 以 表 示 为 只 被 该 包 内 部 使 用 。( 真 正私 有 的 变 量 可 以 声 明 为 文 件 范 围 的 词 汇 , 但 是 只 有 在 包 和 模 块 之 间 有 一 对 一 的 关 系 的 时 候 ,这 样 的 做 法 才 比 较 有 效 , 虽 然 这 样 的 一 对 一 比 较 普 遍 , 但 并 不 是 必 须 的 。)%SIG 散 列 ( 用 于 捕 获 信 号 ; 参 阅 第 十 六 章 , 进 程 间 通 讯 ) 也 是 特 殊 的 。 如 果 你 把 一 个 信号 句 柄 定 义 为 字 串 , 那 么 <strong>Perl</strong> 就 假 设 它 引 用 一 个 main 包 里 的 子 过 程 , 除 非 明 确 地 使 用了 其 他 包 名 字 。 如 果 你 想 声 明 一 个 特 定 的 包 , 那 么 你 要 使 用 一 个 信 号 句 柄 的 全 称 , 或 者 完 全避 免 字 串 的 使 用 : 方 法 是 改 为 赋 予 一 个 类 型 团 或 者 函 数 引 用 :$SIG{QUIT} = "Pkg::quit_chatcher";# 句 柄 全 称$SIG{QUIT} = "quit_catcher";# 隐 含 的 "main::quit_catcher"267

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

Saved successfully!

Ooh no, something went wrong!