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

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh