Perl 編碼規範



當然,每個程式設計師在格式方面都會有自己的偏好,但有一些通用的指導原則可以使您的程式更易於閱讀、理解和維護。

最重要的是始終在 `-w` 標誌下執行您的程式。如果您必須這樣做,您可以透過 `no warnings` pragma 或 `$^W` 變數顯式關閉特定程式碼部分的警告。您也應該始終在 `use strict` 下執行,或者知道不這樣做的原因。`use sigtrap` 甚至 `use diagnostics` pragma 也可能證明有用。

關於程式碼佈局的美學方面,Larry 唯一強烈關注的是多行 BLOCK 的閉合大括號應該與啟動該構造的關鍵字對齊。除此之外,他還有其他不太強烈的偏好:

  • 4 列縮排。
  • 如果可能,將開括號放在與關鍵字相同的行上,否則對齊。
  • 多行 BLOCK 的開括號前留一個空格。
  • 單行 BLOCK 可以放在一行上,包括大括號。
  • 分號前不留空格。
  • 在“短”單行 BLOCK 中省略分號。
  • 大多數運算子周圍留有空格。
  • “複雜”下標(括號內)周圍留有空格。
  • 執行不同操作的程式碼塊之間留空行。
  • else 不與 if 緊挨著。
  • 函式名稱與其開括號之間不留空格。
  • 每個逗號後留一個空格。
  • 長行在運算子後換行(`and` 和 `or` 除外)。
  • 當前行匹配的最後一個括號後留一個空格。
  • 垂直對齊相應的專案。
  • 省略冗餘標點符號,只要清晰度不受影響。

以下是一些其他更重要的樣式問題需要考慮:僅僅因為您可以以某種特定方式做某事並不意味著您應該那樣做。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`。

當 Perl 提供 `last` 運算子允許您在中間退出時,不要費力地嘗試在迴圈頂部或底部退出迴圈。只需稍微“縮排”一下以使其更清晰:

LINE:
for (;;) {
   statements;
   last LINE if $foo;
   next LINE if /^#/;
   statements;
}

讓我們看看更多重要的幾點:

  • 不要害怕使用迴圈標籤——它們既可以增強可讀性,也可以允許多級迴圈中斷。參見前面的示例。

  • 避免在空上下文中使用 `grep()`(或 `map()`)或反引號,也就是說,當您只是丟棄它們的返回值時。這些函式都有返回值,因此請使用它們。否則,請改用 `foreach()` 迴圈或 `system()` 函式。

  • 為了可移植性,在使用可能並非在每臺機器上都實現的功能時,請在 `eval` 中測試該構造以檢視它是否失敗。如果您知道在哪個版本或補丁級別實現了特定功能,您可以測試 `$]`(英文中的 `$PERL_VERSION`)以檢視它是否可用。`Config` 模組還允許您查詢 Perl 安裝時 `Configure` 程式確定的值。

  • 選擇助記符識別符號。如果您不記得助記符是什麼意思,那麼您就遇到問題了。

  • 雖然像 `$gotit` 這樣的短識別符號可能沒問題,但請使用下劃線來分隔較長識別符號中的單詞。通常,閱讀 `$var_names_like_this` 比 `$VarNamesLikeThis` 更容易,尤其是非英語母語人士。這也是一個與 `VAR_NAMES_LIKE_THIS` 一致且始終有效的簡單規則。

  • 包名有時是對此規則的例外。Perl 非正式地為 `integer` 和 `strict` 等“pragma”模組保留小寫模組名稱。其他模組應該以大寫字母開頭並使用混合大小寫,但可能由於原始檔案系統對模組名稱表示為必須適合幾個稀疏位元組的檔案的限制而沒有下劃線。

  • 如果您有一個非常複雜的正則表示式,請使用 `/x` 修飾符並新增一些空格以使其看起來不那麼像噪聲。當您的正則表示式包含斜槓或反斜槓時,請不要使用斜槓作為分隔符。

  • 始終檢查系統呼叫的返回碼。良好的錯誤訊息應傳送到 STDERR,包括導致問題的程式、失敗的系統呼叫及其引數,以及(非常重要)應包含導致錯誤的標準系統錯誤訊息。這是一個簡單但足夠的例子:

opendir(D, $dir) or die "can't opendir $dir: $!";
  • 考慮可重用性。當您可能想要再次執行類似操作時,為什麼要浪費腦力在一個一次性任務上?考慮泛化您的程式碼。考慮編寫模組或物件類。考慮讓您的程式碼在啟用 `use strict` 和 `use warnings`(或 `-w`)的情況下乾淨地執行。考慮贈送您的程式碼。考慮改變你的整個世界觀。考慮……哦,算了吧。

  • 保持一致。

  • 友好相處。

廣告
© . All rights reserved.