位元詩人 [Perl] 程式設計教學:宣告和使用變數 (Variable)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

變數 (Variable) 的前綴 (Sigil)

在電腦程式中,變數 (variable) 是用來操作資料的標籤。和大部分程式語言的差異在於 Perl 的變數前會加上前綴 (sigil),不同前綴代表不同意義:

  • $ (scalar):表示純量
  • @ (array):表示陣列
  • % (hash):表示雜湊
  • & (subroutine):表示副程式

純量可能儲存內建型態、參考或物件型態的資料,一開始只需考慮內建型態的情境即可。陣列和雜湊為 Perl 內建的資料結構,我們將於後文說明。

筆者無法確認當初使用前綴的用意為何,根據前綴的作用來看,可能是做為變數的標註 (annotation)。像是 $v 可看出來是一個純量變數,而 @a 是一個陣列變數。不過,有些對 Perl 不熟的程式設計者,反而覺得前綴會造成混淆。

以下是使用變數的短例:

# Declare a variable `$name` and assign some string to it.
my $name = "Michelle";

# Use `$name` as a function parameter.
print "Hello ", $name, "\n";

在 Perl 中,使用 my 來宣告變數。

合法的識別字 (identifier) 名稱

在宣告變數時,變名名稱又叫做識別字 (identifier)。在 Perl 程式中,原本識別字不具有什麼意義,是透過宣告變數的動作才賦予其意義。以下是命名 Perl 識別字的規則:

  • 在開頭使用適當的前綴
  • 第一個字為英文字母 (letters) 或 _ 底線 (underscore)
  • 第二個字以後可為英文字母、底線或數字

除了合法的識別字外,還有一些建議的命名風格,詳見下一節。

命名識別字的風格

在一般程式設計社群中,有三種命名風格:

  • $PascalCase (大駝峰命名法)
  • $camelCase (小駝峰命名法)
  • $snake_case (蛇形命名法)

Perl 本身未強制規範命令風格,一般變數以蛇形命名法 (snake case) 較常見。大駝峰命名法會保留給類別 (class) 和模組 (module) 來使用。

在 Perl 程式中,同名但不同大小寫的變數視為相異的變數,像是 $foo$Foo$FOO 視為三個不同的變數。但實務上不應用這種方法來區分變數,因為會造成閱讀 Perl 程式碼的困難。

保留字 (Keywords)

保留字 (keywords) 是程式語言的內建語法,在 Perl 程式中已經具有特定的意義,不可做為識別字名稱。這份文件維護一份 Perl 保留字的清單,讀者可自行前往觀看。學程式設計時不要強記保留字,多撰寫 Perl 程式後會自然記住;另外,編輯器會用語法高亮提示保留字。

內建變數 (Builtin Variables)

Perl 設置許多內建變數,這些變數不需宣告即可立即使用,像是 @ARGV 表示傳入 Perl 程式的命令列參數。perlvar 文件維護一份內建變數的清單,有需要的讀者可自行前往觀看。一開始不需強記這些內建變數,邊寫邊查自然會記住這些變數。

由於大部分的 Perl 內建變數使用符號而非英文字所組成的識別字,在可讀性上會比較差。如果需要撰寫多人維護的 Perl 命令稿,建議用 English 模組將內建變數轉為等義的英文識別字,加強這些內建變數的可讀性。

變數的可視域 (Scope)

可視域代表變數的有效範圍。Perl 以區塊 (block) 來決定可視域。所以以下 Perl 程式無法存取變數 $i

# Create a block.
{
    # Declare a local variable.
    my $i = 9999;
}

# Error!
$i == 9999 or die "Unable to get \$i\n";

同樣地,for 迴圈的計數器也視為區塊:

# Run a dummy for loop 10 times.
for (my $i = 1; $i <= 10; ++$i) {}

# Error!
$i == 10 or die "Unable to get \$i\n";
關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。