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.

s 和 /m 修 饰 词 并 不 涉 及 任 何 古 怪 的 东 西 。 它 们 只 是 影 响 <strong>Perl</strong> 对 待 那 些 包 含 换 行 符 的 匹配 的 态 度 。 不 过 它 们 和 你 的 字 串 是 否 包 含 换 行 符 无 关 ; 它 们 关 心 的 是 <strong>Perl</strong> 是 否 应 该 假 设 你的 字 串 包 含 单 个 行 (/s) 还 是 多 个 行 (/m), 因 为 有 些 元 字 符 根 据 你 是 否 需 要 让 它 们 工 作于 面 向 行 的 模 式 而 有 不 同 的 行 为 。通 常 , 元 字 符 "." 匹 配 除 了 换 行 符 以 外 的 任 何 单 个 字 符 , 因 为 它 的 传 统 含 义 是 匹 配 一 行 内的 某 个 字 符 。 不 过 , 带 有 /s 时 ,"." 元 字 符 也 可 以 匹 配 一 个 换 行 符 , 因 为 你 已 经 告 诉 <strong>Perl</strong>忽 略 该 字 串 可 能 包 含 多 个 换 行 符 的 情 况 。 (/s 修 饰 词 同 样 还 令 <strong>Perl</strong> 忽 略 我 们 已 经 不 鼓 励使 用 的 $* 变 量 , 我 们 也 希 望 你 也 忽 略 。) 另 一 方 面 ,/m 修 饰 词 还 修 改 元 字 符 ^ 和 $ 的解 释 —— 通 过 令 它 们 匹 配 字 串 里 的 换 行 符 后 面 的 东 西 , 而 不 仅 仅 是 字 串 的 结 尾 。 参 阅 本 章的 ” 位 置 “ 节 的 例 子 。/o 操 作 符 控 制 模 式 的 重 新 编 译 。 除 非 你 选 用 的 分 隔 符 是 单 引 号 (m'PATTERN',s'PATTERN'REPLACEMENT', 或 者 qr'PATTERN'), 否 则 每 次 计 算 模 式 操 作 符 的 时 候 ,任 何 模 式 里 的 变 量 都 会 被 代 换 ( 并 且 可 能 会 导 致 模 式 的 重 新 编 译 )。 如 果 你 希 望 这 样 的 模 式被 且 只 被 编 译 一 次 ; 那 么 就 该 使 用 /o 修 饰 词 。 这 么 做 可 以 避 免 开 销 巨 大 的 运 行 时 重 新 编译 ; 这 么 做 非 常 有 用 , 尤 其 是 你 在 转 换 的 值 在 执 行 中 不 会 改 变 的 情 况 下 。 不 过 ,/o 实 际 上是 让 你 做 出 了 不 会 改 变 模 式 中 的 变 量 的 承 诺 。 如 果 你 改 变 了 这 些 变 量 ,<strong>Perl</strong> 设 置 都 不 会 注意 到 。 为 了 更 好 地 控 制 重 编 译 , 你 可 以 使 用 qr// 正 则 表 达 式 引 起 操 作 符 。 详 情 请 参 阅 本 章后 面 的 “ 变 量 代 换 ” 节 。/x 是 表 达 修 饰 词 : 它 允 许 你 利 用 空 白 和 解 释 性 注 释 扩 展 你 的 模 式 的 易 读 性 , 你 甚 至 还 可 以把 模 式 扩 展 得 超 过 一 行 的 范 围 。也 就 是 说 ,/x 修 改 空 白 字 符 ( 还 有 # 字 符 ) 的 含 义 : 它 们 不 再 是 普 通 字 符 那 样 的 自 匹 配字 符 , 而 是 转 换 成 元 字 符 , 这 些 元 字 符 的 特 征 类 似 空 白 ( 和 注 释 字 符 )。 因 此 ,/x 允 许 ( 在模 式 里 面 ) 将 空 白 , 水 平 制 表 符 和 换 行 符 用 于 格 式 化 , 就 象 普 通 <strong>Perl</strong> 代 码 一 样 。 它 还 允 许用 通 常 在 模 式 里 没 有 特 殊 含 义 的 # 字 符 引 入 延 伸 到 当 前 模 式 行 行 尾 的 注 释 。( 注 : 请 注 意不 要 在 注 释 里 包 含 模 式 分 隔 符 —— 因 为 “ 先 找 结 尾 ” 的 规 则 ,<strong>Perl</strong> 没 办 法 知 道 你 在 该 点 上 并不 想 结 束 。) 如 果 你 想 匹 配 一 个 真 正 的 空 白 字 符 ( 或 者 # 字 符 ), 那 你 就 要 把 它 们 放 到 字符 表 里 , 或 者 用 反 斜 杠 逃 逸 , 或 者 用 八 进 制 或 者 十 六 进 制 逃 逸 的 编 码 。( 但 是 空 白 通 常 用 一个 \s* 或 \s+ 序 列 匹 配 , 因 此 实 际 中 这 种 情 况 出 现 得 并 不 多 。)总 结 而 言 , 这 些 特 性 朝 着 把 传 统 的 正 则 表 达 式 变 成 更 可 读 的 语 言 迈 进 了 一 大 步 。 从 " 回 字 有四 种 写 法 " 精 神 出 发 , 现 在 写 一 个 正 则 表 达 式 的 方 法 是 不 止 一 种 了 。 实 际 上 , 我 们 有 不 止 两种 的 方 法 :( 译 注 :TMTOWTDI:"There's More Then One Way To Do It", " 做 事 的方 法 不 止 一 种 ". <strong>Perl</strong> 文 化 口 号 , 见 本 书 尾 部 的 词 汇 表 .)m/\w+:(\s+\w+)\s*\d+/; # 一 个 词 , 冒 号 , 空 白 , 词 , 空 白 , 数 字 。153

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

Saved successfully!

Ooh no, something went wrong!