NAME
perlstyle − Perl 風 格 指 南
DESCRIPTION 描 述
每 個 程 式 員 當 然 都 會 有 自 己 的 編 程 風 格 , 但 是 有 一 些 一 般 性 的 原 則 可 以 使 得 我 們 的 程 式 更 易 於 閱 \[u8B80], 理 解 , 以 及 維 護 。
最 重 要 的 是 使 用 −w 選 項 . 如 果 必 須 關 閉 該 選 項 , 可 以 用 "no warnings" 或 變 量 $^W 來 在 一 定 的 代 碼 段 中 關 閉 它 . 你 還 應 該 使 用 "use strict" 除 非 你 清 楚 不 使 用 它 的 理 由 . "use sigtrap" 和 "use diagnostics" 也 是 非 常 有 用 的 .
關 於 代 碼 美 學 , Larry 大 概 只 強 烈 的 關 心 一 件 事 情 : 多 行 塊 的 結 束 花 括 號 應 該 與 開 始 的 關 鍵 字 對 齊 . 除 了 這 個 , 還 有 一 些 不 是 那 麼 重 要 的 事 情 :
• |
4−列 縮 進 . | ||
• |
如 果 可 能 的 話 , 開 始 的 花 括 號 與 關 鍵 詞 最 好 放 在 同 一 行 , 否 則 對 齊 . | ||
• |
多 行 的 塊 的 開 始 的 花 括 號 之 前 應 當 有 空 格 | ||
• |
單 行 的 塊 放 在 一 行 , 包 括 花 括 號 . | ||
• |
分 號 前 不 要 空 格 . | ||
• |
在 短 的 單 行 塊 中 省 略 分 號 . | ||
• |
操 作 符 周 圍 打 空 格 . | ||
• |
在 「 復 合 」 下 標 周 圍 打 空 格 (在 括 號 中 ). | ||
• |
在 不 同 功 \[u80FD]的 塊 之 間 打 空 行 . | ||
• |
else另 起 一 行 寫 | ||
• |
函 數 與 括 號 間 不 要 空 格 | ||
• |
每 個 逗 號 後 打 空 格 . | ||
• |
長 句 子 在 操 作 符 後 截 斷 ( "and" 和 "or" 除 外 ). | ||
• |
關 閉 括 號 後 打 空 格 . | ||
• |
相 關 項 之 間 以 列 對 齊 . | ||
• |
在 不 影 響 清 晰 的 情 況 下 盡 量 減 少 標 點 符 號 . |
Larry 這 樣 做 當 然 有 他 的 原 因 , 不 過 他 沒 有 要 求 別 人 都 和 他 一 樣 .
以 下 意 見 供 您 參 考 :
• |
可 以 那 樣 做 並 不 意 味 著 應 該 那 樣 做 . Perl 設 計 為 作 每 件 事 都 可 以 用 好 幾 種 方 法 , 你 應 該 選 擇 最 可 讀 的 一 種 . 例 如 |
open(FOO,$foo) ⎪⎪ die "Can’t open $foo: $!";
好 於
die "Can’t open $foo: $!" unless open(FOO,$foo);
因 為 第 二 種 辦 法 掩 蓋 \[u4E86]句 子 中 的 主 要 內 容 。 另 一 方 面
print "Starting analysis\n" if $verbose;
好 於
$verbose && print "Starting analysis\n";
因 為 主 要 關 鍵 不 在 於 是 否 使 用 者 輸 入 了 −v。
類 似 的 , 因 為 一 個 操 作 符 允 許 \[u4F7F]用 預 設 參 數 , 不 意 味 著 你 必 須 使 用 預 設 值 。 預 設 值 是 為 懶 惰 的 系 統 程 式 員 書 寫 只 運 行 一 次 的 程 式 準 備 的 。 如 果 你 需 要 你 的 程 式 盡 量 可 讀 , 考 慮 給 出 參 數 。
根 據 相 同 的 原 則 , 在 很 多 地 方 即 使 你 可 以 忽 略 括 號 也 不 意 味 著 你 應 當 這 樣 做 :
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; }
• |
別 害 怕 使 用 循 環 標 記 --它 們 用 來 增 強 可 讀 性 並 且 允 許 \[u591A]層 循 環 中 斷 . 參 見 前 例 . | ||
• |
避 免 在 空 上 下 文 中 使 用 grep() (或 map()) 或 ’反 引 號 ’ , 那 樣 , 你 就 丟 棄 了 它 們 的 返 回 值 . 使 用 它 們 是 為 了 得 到 返 回 值 , 否 則 , 使 用 foreach() 或 是 system() 好 了 . | ||
• |
考 慮 移 植 的 時 候 , 某 些 特 性 可 能 不 是 在 所 有 的 機 器 上 都 能 夠 得 到 支 持 , 這 時 可 以 用 eval來 測 試 . 如 果 你 知 道 提 供 特 定 功 \[u80FD]的 版 本 或 是 補 丁 , 你 可 以 察 看 $] (也 就 是 "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" 來 增 加 注 釋 行 或 空 行 以 利 於 閱 \[u8B80]. 當 其 中 有 很 多 斜 槓 或 反 斜 槓 時 , 不 要 用 反 斜 槓 來 作 正 則 表 達 式 的 定 界 符 . | ||
• |
使 用 "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