NAME
perlstyle − Perl 风 格 指 南
DESCRIPTION 描 述
每 个 程 序 员 当 然 都 会 有 自 己 的 编 程 风 格 , 但 是 有 一 些 一 般 性 的 原 则 可 以 使 得 我 们 的 程 序 更 易 于 阅 读 , 理 解 , 以 及 维 护 。
最 重 要 的 是 使 用 −w 选 项 . 如 果 必 须 关 闭 该 选 项 , 可 以 用 "no warnings" 或 变 量 $^W 来 在 一 定 的 代 码 段 中 关 闭 它 . 你 还 应 该 使 用 "use strict" 除 非 你 清 楚 不 使 用 它 的 理 由 . "use sigtrap" 和 "use diagnostics" 也 是 非 常 有 用 的 .
关 于 代 码 美 学 , Larry 大 概 只 强 烈 的 关 心 一 件 事 情 : 多 行 块 的 结 束 花 括 号 应 该 与 开 始 的 关 键 字 对 齐 . 除 了 这 个 , 还 有 一 些 不 是 那 么 重 要 的 事 情 :
• |
4−列 缩 进 . | ||
• |
如 果 可 能 的 话 , 开 始 的 花 括 号 与 关 键 词 最 好 放 在 同 一 行 , 否 则 对 齐 . | ||
• |
多 行 的 块 的 开 始 的 花 括 号 之 前 应 当 有 空 格 | ||
• |
单 行 的 块 放 在 一 行 , 包 括 花 括 号 . | ||
• |
分 号 前 不 要 空 格 . | ||
• |
在 短 的 单 行 块 中 省 略 分 号 . | ||
• |
操 作 符 周 围 打 空 格 . | ||
• |
在 “复 合 ”下 标 周 围 打 空 格 (在 括 号 中 ). | ||
• |
在 不 同 功 能 的 块 之 间 打 空 行 . | ||
• |
else另 起 一 行 写 | ||
• |
函 数 与 括 号 间 不 要 空 格 | ||
• |
每 个 逗 号 后 打 空 格 . | ||
• |
长 句 子 在 操 作 符 后 截 断 ( "and" 和 "or" 除 外 ). | ||
• |
关 闭 括 号 后 打 空 格 . | ||
• |
相 关 项 之 间 以 列 对 齐 . | ||
• |
在 不 影 响 清 晰 的 情 况 下 尽 量 减 少 标 点 符 号 . |
Larry 这 样 做 当 然 有 他 的 原 因 , 不 过 他 没 有 要 求 别 人 都 和 他 一 样 .
以 下 意 见 供 您 参 考 :
• |
可 以 那 样 做 并 不 意 味 着 应 该 那 样 做 . Perl 设 计 为 作 每 件 事 都 可 以 用 好 几 种 方 法 , 你 应 该 选 择 最 可 读 的 一 种 . 例 如 |
open(FOO,$foo) ⎪⎪ die "Can’t open $foo: $!";
好 于
die "Can’t open $foo: $!" unless open(FOO,$foo);
因 为 第 二 种 办 法 掩 盖 了 句 子 中 的 主 要 内 容 。 另 一 方 面
print "Starting analysis\n" if $verbose;
好 于
$verbose && print "Starting analysis\n";
因 为 主 要 关 键 不 在 于 是 否 用 户 输 入 了 −v。
类 似 的 , 因 为 一 个 操 作 符 允 许 使 用 默 认 参 数 , 不 意 味 着 你 必 须 使 用 默 认 值 。 默 认 值 是 为 懒 惰 的 系 统 程 序 员 书 写 只 运 行 一 次 的 程 序 准 备 的 。 如 果 你 需 要 你 的 程 序 尽 量 可 读 , 考 虑 给 出 参 数 。
根 据 相 同 的 原 则 , 在 很 多 地 方 即 使 你 可 以 忽 略 括 号 也 不 意 味 着 你 应 当 这 样 做 :
return print reverse sort num values %array; return print(reverse(sort num (values(%array))));
如 果 有 疑 义 , 使 用 括 号 。 至 少 它 使 得 可 怜 的 笨 蛋 能 在 vi 中 使 用 % 键 来 跳 转
甚 至 你 没 有 疑 义 的 时 候 , 为 那 个 将 来 维 护 你 的 代 码 的 家 伙 的 精 神 健 康 考 虑 一 下 吧 , 并 且 他 有 可 能 把 括 号 放 错 地 方 。
• |
在 程 序 中 使 用 last 跳 出 , 而 不 要 在 开 始 和 结 束 时 用 奇 怪 的 跳 转 退 出 循 环 。 把 它 "缩 出 " 几 格 以 利 于 察 看 : |
LINE: for (;;) { statements; last LINE if $foo; next LINE if /^#/; statements; }
• |
别 害 怕 使 用 循 环 标 记 --它 们 用 来 增 强 可 读 性 并 且 允 许 多 层 循 环 中 断 . 参 见 前 例 . | ||
• |
避 免 在 空 上 下 文 中 使 用 grep() (或 map()) 或 ’反 引 号 ’ , 那 样 , 你 就 丢 弃 了 它 们 的 返 回 值 . 使 用 它 们 是 为 了 得 到 返 回 值 , 否 则 , 使 用 foreach() 或 是 system() 好 了 . | ||
• |
考 虑 移 植 的 时 候 , 某 些 特 性 可 能 不 是 在 所 有 的 机 器 上 都 能 够 得 到 支 持 , 这 时 可 以 用 eval来 测 试 . 如 果 你 知 道 提 供 特 定 功 能 的 版 本 或 是 补 丁 , 你 可 以 察 看 $] (也 就 是 "English" 中 的 $PERL_VERSION) 来 确 定 当 前 的 版 本 . "Config" 模 块 也 会 提 供 perl在 安 装 时 Configure 程 序 测 得 的 值 . | ||
• |
使 用 明 确 的 标 识 符 , 你 要 是 想 不 起 来 标 识 符 的 意 思 , 那 就 麻 烦 了 。 | ||
• |
短 标 识 符 如 $gotit 虽 然 没 什 么 不 好 , 但 是 用 下 划 线 来 分 割 单 词 可 以 增 加 可 读 性 . 如 $var_names_like_this 好 于 $VarNamesLikeThis,对 不 以 英 语 为 母 语 的 人 更 是 如 此 .同 样 , 在 使 用 VAR_NAMES_LIKE_THIS 时 也 要 遵 循 这 个 规 则 。 |
包 名 称 有 时 不 遵 守 这 个 约 定 . Perl 为 "pragma" 保 留 小 写 的 包 名 称 , 比 如 integer 和 strict. 其 他 模 块 名 称 应 该 用 大 写 字 母 开 始 , 但 是 一 般 不 用 下 划 线 来 分 隔 , 因 为 当 使 用 模 块 名 来 作 文 件 名 时 , 这 在 某 些 系 统 会 出 现 错 误 .
• |
使 用 大 小 写 可 以 区 分 变 量 的 作 用 域 。 例 如 : |
$ALL_CAPS_HERE 常 量 (小 心 ! 不 要 与 perl 变 量 冲 突 !) $Some_Caps_Here 包 作 用 域 global/static $no_caps_here 函 数 作 用 域 my() 或 local() 变 量
函 数 和 方 法 名 多 用 小 写 . 如 , $obj−>as_string().
用 下 划 线 开 始 的 函 数 名 或 变 量 名 , 表 示 该 函 数 或 变 量 只 能 在 定 义 它 的 包 中 使 用 .
• |
如 果 你 的 正 则 表 达 式 较 复 杂 , 用 "/x" 来 增 加 注 释 行 或 空 行 以 利 于 阅 读 . 当 其 中 有 很 多 斜 杠 或 反 斜 杠 时 , 不 要 用 反 斜 杠 来 作 正 则 表 达 式 的 定 界 符 . | ||
• |
使 用 "and" 和 "or" 操 作 符 以 减 少 使 用 括 号 , 尽 量 少 用 && 和 ⎪⎪. 调 用 子 程 序 时 尽 量 少 用 "&"和 括 号 , 可 以 把 子 程 序 当 做 函 数 或 列 表 操 作 符 来 调 用 . | ||
• |
使 用 here documents 代 替 大 量 的 print() 语 句 . | ||
• |
相 关 语 句 用 列 对 齐 方 式 来 书 写 , 特 别 是 当 一 行 放 不 下 的 时 候 . |
$IDX = $ST_MTIME; $IDX = $ST_ATIME if $opt_u; $IDX = $ST_CTIME if $opt_c; $IDX = $ST_SIZE if $opt_s; mkdir $tmpdir, 0700 or die "can’t mkdir $tmpdir: $!"; chdir($tmpdir) or die "can’t chdir $tmpdir: $!"; mkdir ’tmp’, 0777 or die "can’t mkdir $tmpdir/tmp: $!";
• |
总 是 检 测 返 回 值 . 错 误 信 息 被 送 往 STDERR, 包 括 出 错 的 程 序 、 失 败 的 系 统 调 用 及 参 数 、 并 且 ( 非 常 重 要 的 ) 包 括 标 准 错 误 信 息 . 这 里 是 一 个 简 单 而 完 整 的 例 子 : |
opendir(D, $dir) or die "can’t opendir $dir: $!";
• |
把 翻 译 列 表 以 列 对 齐 方 式 排 列 : |
tr [abc] [xyz];
• |
考 虑 可 重 用 性 . 请 考 虑 使 用 模 块 或 对 象 . 考 虑 使 用 use strict 和 use warnings (或 -w) 使 代 码 清 晰 明 确 . 考 虑 改 变 世 界 观 。 | ||
• |
要 一 致 , 要 兼 容 。 | ||
• |
要 漂 亮 , 要 美 观 。 |
译 者
redcandle <redcandle51 [AT] chinaren.com> 20010530