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.

$hash{ shift @_ }8.5.1 引 用 不 能 当 作 散 列 键 字 用散 列 键 字 在 内 部 都 存 储 成 字 串 。( 注 : 它 们 在 外 部 也 存 储 成 字 串 , 比 如 在 你 把 它 们 放 到 DBM文 件 中 的 时 候 。 实 际 上 ,DBM 文 件 要 求 它 们 的 键 字 ( 和 数 值 ) 是 字 串 。) 如 果 你 试 图 把 一个 引 用 当 作 一 个 散 列 的 键 字 存 储 , 那 么 该 键 字 值 将 被 转 换 成 一 个 字 串 :$x{ \$a } = $a;($key, $value) = each %x;print $$key;# 错 误我 们 前 面 已 经 说 过 你 不 能 把 一 个 字 串 转 换 回 硬 引 用 。 因 此 如 果 你 试 图 解 引 用 $key,( 它 里面 只 保 存 着 一 个 字 串 ), 那 么 它 不 会 返 回 一 个 硬 引 用 , 而 是 一 个 符 号 引 用 —— 并 且 因 为 你 可能 没 有 叫 SCALAR(0x1fc0e) 的 变 量 , 所 以 你 就 无 法 实 现 你 的 目 的 。 你 可 能 要 做 一 些 更 象 :$r = \@a;$x{ $r } = $r;这 样 的 东 西 。 这 样 你 至 少 能 使 用 散 列 值 , 这 个 值 是 一 个 硬 引 用 , 但 你 不 能 用 键 字 , 它 不 是 硬引 用 。尽 管 你 无 法 把 一 个 引 用 存 储 为 键 字 , 但 是 如 果 你 拿 一 个 硬 引 用 在 一 个 字 串 的 环 境 中 使 用 ,( 象我 们 前 面 的 例 子 ) 那 么 <strong>Perl</strong> 保 证 它 生 成 一 个 唯 一 的 字 串 , 因 为 该 引 用 的 地 址 被 当 作 字 串 的一 部 分 包 含 。 这 样 你 实 际 上 就 可 以 把 引 用 当 作 一 个 唯 一 的 键 字 使 用 。 只 是 你 后 面 就 没 有 办 法对 它 解 引 用 了 。有 一 种 特 殊 类 型 的 散 列 , 在 这 种 散 列 里 , 你 可 以 拿 引 用 当 作 键 字 。 通 过 与 <strong>Perl</strong> 捆 绑 在 一 起的 Tie::RefHasn 模 块 的 神 奇 ( 这 个 词 是 技 术 术 语 , 如 果 你 翻 翻 <strong>Perl</strong> 源 程 序 目 录 里 的mg.c 文 件 就 会 明 白 。), 你 就 可 以 做 我 们 刚 才 还 说 不 能 做 的 事 情 :use Tie::RefHandle;tie my %h, 'Tie::RefHash';%h = (["this", "here"]["that", "there"]=> "at home",=> "elsewhere",234

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

Saved successfully!

Ooh no, something went wrong!