Manpages

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

中 文 手 册 页 翻 译 计 划

http://cmpp.linuxforum.net