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.

全 局 声 明 可 以 放 在 任 何 可 以 出 现 语 句 的 地 方 , 不 过 它 们 对 语 句 的 主 要 执 行 顺 序 没 有 影 响 --声 明 只 在 编 译 时 起 作 用 。这 意 味 着 你 不 能 做 条 件 的 子 过 程 和 / 或 格 式 声 明 。 你 可 能 会 想 用 一 个 运 行 时 的 if 来 屏 蔽 你的 声 明 , 使 之 不 为 编 译 器 所 见 , 但 这 是 不 可 能 的 , 因 为 只 有 解 释 器 关 心 那 些 条 件 。 不 管 出 现在 什 么 地 方 , 子 过 程 和 格 式 声 明 ( 还 有 use 和 no 声 明 ) 都 只 有 编 译 器 能 够 看 到 。全 局 声 明 通 常 出 现 在 你 的 程 序 的 开 头 或 者 结 尾 , 或 者 是 放 在 其 它 的 文 件 里 。 不 过 , 如 果 你 声明 的 是 词 法 范 围 的 变 量 ( 见 下 节 ), 而 且 你 还 希 望 你 的 格 式 或 者 子 过 程 能 够 访 问 某 些 私 有 变量 , 那 你 就 得 保 证 你 的 声 明 落 在 这 些 变 量 声 明 的 范 围 之 内 。请 注 意 我 们 偷 偷 地 从 讲 声 明 转 移 到 了 讲 定 义 。 有 时 候 , 把 子 过 程 的 声 明 和 定 义 分 开 能 帮 我 们忙 。 这 两 个 概 念 语 义 上 的 唯 一 的 区 别 是 定 义 包 含 一 个 要 执 行 的 代 码 块 BLOCK, 而 声 明 没 有 。( 如 果 一 个 子 过 程 没 有 声 明 部 分 , 那 么 它 的 定 义 就 是 它 的 声 明 。) 把 定 义 从 声 明 里 面 剥 离 ,就 允 许 你 把 子 过 程 的 声 明 放 在 开 头 而 把 其 定 义 放 在 后 面 ( 而 你 的 词 法 范 围 的 变 量 声 明 放 在 中间 ):sub count (@);my $x;# 现 在 编 译 器 知 道 如 何 调 用 count()。# 现 在 编 译 器 知 道 词 法 变 量$x = count(3,2,1); # 编 译 器 可 以 核 实 函 数 调 用sub count (@) { @_ }# 现 在 编 译 器 知 道 count() 是 什 么 意 思 了正 如 上 面 例 子 显 示 的 那 样 , 子 过 程 在 调 用 它 们 之 前 不 用 定 义 也 能 编 译 ,( 实 际 上 , 如 果 你 使用 自 动 装 载 技 术 , 定 义 甚 至 可 以 推 迟 到 首 次 调 用 ), 但 是 声 明 子 过 程 可 以 以 各 种 方 式 协 助 编译 器 , 并 且 给 你 更 多 调 用 它 们 的 选 择 。声 明 一 个 子 过 程 后 允 许 你 不 带 圆 括 弧 使 用 它 , 好 象 它 是 一 个 内 建 的 操 作 符 一 样 。( 我 们 在 上面 的 例 子 里 用 了 圆 括 弧 , 实 际 上 我 们 可 以 不 用 。) 你 可 以 只 声 明 而 不 定 义 子 过 程 , 只 需 :sub myname;$me = myname $0or die "can't get myname";这 样 的 空 定 义 把 函 数 定 义 成 一 个 列 表 操 作 符 , 但 不 是 单 目 操 作 符 , 所 以 上 面 用 了 or 而 不 是。 操 作 符和 列 表 操 作 符 之 间 的 联 系 太 紧 密 了 , 以 至 于 基 本 上 只 能 用 于 列 表 操 作 符 后 面 , 当 然 , 你 还 是可 以 在 列 表 操 作 符 参 数 周 围 放 上 圆 括 弧 , 让 列 表 操 作 符 表 现 得 更 象 函 数 调 用 来 解 决 这 个 问题 。 另 外 , 你 可 以 用 原 型 ($) 把 子 过 程 转 化 成 单 目 操 作 符 :133

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

Saved successfully!

Ooh no, something went wrong!