變數 (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";