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.

<strong>Perl</strong> 只 有 在 它 认 为 有 益 的 时 候 才 使 用 UTF-8, 所 以 如 果 你 的 字 串 里 的 所 有 字 符 都 落 在0..255 的 范 围 里 , 那 么 很 有 可 能 这 些 字 符 都 封 装 在 一 个 字 节 里 —— 但 是 如 果 缺 乏 其 他 知识 , 你 也 无 法 确 定 这 一 点 , 因 为 <strong>Perl</strong> 在 内 部 根 据 需 要 在 定 长 的 8 位 字 符 和 变 长 UTF-8 字符 之 间 进 行 转 换 。 关 键 是 你 大 多 数 时 间 不 需 要 关 心 这 些 内 容 , 因 为 这 里 的 字 符 语 意 是 一 种 不考 虑 表 现 的 抽 象 含 义 。不 论 什 么 情 况 下 , 如 果 你 的 字 串 包 含 任 意 大 于 十 进 制 255 的 数 字 , 那 么 该 字 串 肯 定 是 以UTF-8 的 形 式 存 储 的 。 更 准 确 地 说 , 它 是 以 <strong>Perl</strong> 扩 展 了 的 UTF-8 版 本 存 储 的 , 我 们 管它 叫 utf8, 一 方 面 是 尊 重 那 个 名 称 的 用 法 , 另 一 方 面 也 是 为 了 敲 击 简 单 。( 并 且 因 为 “ 真 正 ”的 UTF-8 只 允 许 包 含 Unicode 联 盟 确 认 的 字 符 数 字 。<strong>Perl</strong> 的 utf8 允 许 你 包 含 任 何 你需 要 的 字 符 数 字 。<strong>Perl</strong> 并 不 在 乎 你 的 字 符 数 字 是 官 方 认 可 的 还 是 你 认 可 的 。)我 们 说 过 你 在 大 部 分 时 候 都 不 用 关 心 这 些 , 但 是 人 们 还 是 愿 意 关 心 。 假 设 你 使 用 一 个 v 字串 代 表 一 个 IPv4 地 址 :$locaddr = v127.0.0.1;$oreilly = v204.148.40.9;$badaddr = v2004.148.40.9# 当 然 是 按 照 字 节 存 储# 可 能 以 字 节 或 者 以 utf8 方 式 存 储# 当 然 是 以 utf8 方 式 存 储每 个 人 都 明 白 $badaddr 不 是 一 个 IP 地 址 。 所 以 我 们 很 容 易 认 为 如 果 O'Reilly 的 网 络地 址 被 强 制 表 示 成 UTF-8 方 式 , 那 么 它 就 无 法 运 行 了 。 但 是 在 字 串 里 的 字 符 都 是 抽 象 数 字 ,而 不 是 字 节 。 任 何 使 用 IPv4 地 址 的 东 西 , 比 如 gethostbyaddr 函 数 , 都 自 动 把 抽 象 字符 数 字 转 换 成 一 个 字 节 形 式 ( 并 且 对 $badaddr 会 失 效 )。<strong>Perl</strong> 和 真 实 世 界 之 间 的 接 口 需 要 处 理 表 现 形 式 的 细 节 。 现 有 的 接 口 在 最 大 的 可 能 下 都 可 以不 用 你 告 诉 它 们 如 何 处 理 而 做 出 正 确 的 动 作 。 但 是 的 确 有 偶 尔 的 机 会 需 要 你 给 一 些 接 口 以 某种 指 导 ( 比 如 open 函 数 ), 而 且 如 果 你 写 你 自 己 的 与 现 实 世 界 的 接 口 , 那 么 这 个 接 口 要么 是 聪 明 得 能 够 自 己 分 辨 事 物 , 要 么 至 少 是 能 够 在 非 缺 省 特 性 的 时 候 能 够 遵 循 指 导 。( 注 :在 一 些 系 统 上 可 能 存 在 一 次 性 切 换 你 的 所 有 接 口 的 方 法 。 如 果 使 用 了 -C 命 令 行 开 关 ,( 或者 全 局 的 ${@WIDE_SYSTEM_CALLS} 变 量 设 置 为 1, 那 么 所 有 系 统 调 用 都 会 使 用 对应 的 宽 字 符 API。( 这 个 特 性 目 前 只 在 Microsoft Windows 上 实 现 。) Linux 社 区 目前 的 计 划 是 如 果 $ENV{LC_CTYPE} 设 置 为 “UTF-8”, 那 么 所 有 接 口 都 切 换 到 UTF-8 模式 。 其 他 的 社 区 可 能 采 纳 其 他 方 法 。 我 们 的 进 展 也 可 能 变 化 。)因 为 <strong>Perl</strong> 要 关 心 在 它 自 己 内 部 维 持 透 明 的 字 符 语 意 , 所 以 你 需 要 关 心 字 节 与 字 符 语 意 的 区别 的 唯 一 的 地 方 就 是 你 的 接 口 。 缺 省 时 , 你 所 有 旧 的 连 接 外 部 世 界 的 <strong>Perl</strong> 接 口 都 是 面 向 字节 的 , 因 此 它 们 生 成 和 处 理 面 向 字 节 的 数 据 。 也 就 是 说 , 在 这 个 抽 象 层 , 你 的 所 有 字 串 都 是范 围 0..255 的 数 字 序 列 , 所 以 如 果 在 程 序 里 没 有 什 么 东 西 强 迫 它 们 表 示 成 utf8, 你 的 旧402

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

Saved successfully!

Ooh no, something went wrong!