Perl 的 Hello World 是怎么寫的呢?請看下面的程序:
#!/usr/bin/perl
print "Hello World"
這個程序和前面 BASH 的 Hello World 程序幾乎相同,只是第一行換成了 #!/usr/bin/perl ,還有顯示的時候用的是 print,而不是 echo。有了前面 BASH 基礎和 C 語言的基礎,許多 Perl 的知識可以很容易的就看懂和記住,下面我們就從簡單變量開始。
簡單變量是標量,是 Perl 處理的最簡單的數據類型。標量可以是數字(如2,3或2.5e6), 也可以是字符串。Perl 中的標量變量以美元符號 "$" 和一個字母開始,后面可以跟字母、數字和下劃線,Perl 的變量區分大小寫,因此 $a 和 $A 是代表不同的變量。和 BASH 中不同的是 Perl 語言中的變量即使是在最初賦值的時候也必須在變量前面加上 "$" 符號,而且 Perl 不要求 "=" 左右必須沒有空格。
雖然 Perl 中和 BASH 一樣,沒有變量類型的概念,我們還是可以把簡單變量分為數值型和字符串型來理解。在賦值時,如果是賦值成字符串,則需要在字符串兩邊加上雙引號(或單引號);如果是數值則就不用了,而且 Perl 中還可以接受8/16(以0開頭/以0x或0X開頭)進制的整數,還可以接受如 2.5,-6.3e5,-2.3-e6 這樣的浮點數。關于簡單變量舉例如下:
$a=23;
$a = "hello";
$a = 010;(表示十進制的 8)
$a = 0x10;
$a = 0X10;
和 C 語言類似,在雙引號之中可以用反斜杠表示一些特殊轉義字符,見下表:
結 構 | 含 義 |
\n | 換行 |
\r | 回車 |
\t | 水平置表符 |
\f | 換頁符 |
\b | 退格 |
\v | 垂直置表符 |
\a | 響鈴 |
\e | Esc |
\007 | 任一八進制ASCII值(這里007表示bell) |
\x7f | 任一十六進制ASCII值 |
\cC | 任一“控制”字符 |
\\ | 反斜杠 |
\" | 雙引號 |
\l | 下一字母小寫 |
\L | 以后所有字母小寫直到\E |
\u | 下一字母大寫 |
\U | 以后所有字母大寫直到\E |
\E | 結束\L和\U |
另外在 Perl 語言里,我們常會看到 my 這樣的變量定義,如:
my $a = "local var";
這表示 $a 是一個程序塊的局部變量。
數組是標量數據的有序列表。數組可以含從 0 個元素大小 直到 你計算機內存可以支持的大小。數組用括號內以逗號分隔的一系列元素來表示。如:
@a=(1,2,3,4,5)
@a=("aka",1974,173.5)
在 Perl 中對數組變量和前面的簡單變量的存儲是在不同的空間中,對數組的引用需要在變量前加 "@" 符號。
數組的賦值由下面幾種用法需要注意:
@a=(1,2,3); | # 初始化一個整數數組。 |
$a=@a; | # 這里表示將數組 @a 的長度賦給 $a,此時 $a 和 @a 不是一個變量,他們不在一個存儲空間里,引用時不會發生混淆。 |
($a, $b, $c)=(1,2,3); | # 這里表示將 1 賦給 $a;2 賦給 $b;3 賦給 $c; |
@a=("a","b","c"); | # 初始化一個字符串數組。 |
@b=@a; | # 表示把數組 @a 拷貝一份給數組 @b,@a 與 @b 不享有共同的存儲空間,他們彼此分離。 |
@c=(@a,@b); | # 表示數組 @c 擁有 @a 和 @b 的所有元素,仍然是一維數組,而不是發生了嵌套。 |
($a,@b)=@a; | # 表示變量 $a 等于數組 @a 的第一個元素,@b 拷貝了 @a 的剩余元素。 |
@a=(); | # 表示產生或清空一個數組。 |
($a)=@b; | 變量 $a 等于數組 @b 的第一個元素的值。 |
@b[i] | 引用數組 @b 的第 i 個元素。 |
$b[i] | 如果 b 表示一個數組的話,其含義同上。 |
$a[i,j]=[x,y] | 將數組 @a 的第 i 和第 j 個元素賦值為 x 和 y。 |
@a[i,j]=@a[j,i] | 將數組 @a 的第 i 和第 j 個元素的值互相交換。 |
關聯數組是 Perl 語言中特有的一種數據結構,是一個功能強大的數組,他與普通數組的不同在于關聯數組不是通過整數下標來索引,而是通過“鍵值”進行索引。使用關聯數組需要在變量前面加上 "%" 號,關聯數組的格式如:
ARRAY=(key1,value1,key2,value2,key3,value3);
上面每個 key 都對應著一個 value。關聯數組是存在在另外一個存儲空間中,不和簡單變量以及數組相混淆。
對關聯數組的操作有如下規則:
下面是一些關聯數組操作的例子:
%fred=(one,"aka",two,"free"); $a=$fred{one}; | # $a等于"aka" |
$b=$fred{two}; | # $b等于"free" |
$fred{two}="yes"; | # %fred=(one,"aka",two,"yes") |
@index=keys(%fred); | # @index=(one,two) |
@content=values(%fred); | # @content=("aka","yes") |
($index,$content)=echo(%fred); | # 此時 $index 的值為 one,$content 的值為 "aka",再執行一次 $index 為值為 two,$name 的值為 "yes" |
@a=%fred; | # 將關聯數組 fred 指定給數組 a,這時 @a=(one,"aka",two,"yes") |
%b=@a; | # 將數組 a 指定給關聯數組 b,這時 %b=(one,"aka",two,"yes") |
delete $fred{one}; | # 將關聯數組中 key 值為 one 的一對 key-value 刪除,這時 %fred=(two,"yes") |
%x=(); | # 把 %x 關聯數組置空 |
賦值(Assignment)運算符
算術(Arithmetic)運算符
數值(Numeric Values)關系運算符
字符串(String Values)關系運算符
邏輯(Logical)運算
其它常用的運算符
常用的文件數據(File Test)運算符
賦值(Assignment)運算符 | ||
符號 | 范例 | 說明 |
= | $x=$y; | 將$x的值指派給$y |
+= | $x+=$y; $x=$x+$y; |
將$x加$y之后再指派給$x |
-= | $x-=$y; $x=$x-$y; |
將$x減$y之后再指派給$x |
*= | $x*=$y; $x=$x*$y; |
將$x乘$y之后再指派給$x |
/= | $x/=$y; $x=$x/$y; |
求出$x除以$y之后的商數,再指派給$x |
**= | $x**=$y; $x=$x**$y; |
將$x乘上$y次方之后再指派給$x |
%= | $x%=$y; $x=$x%$y; |
求出$x除以$y的余數以后,再指派給$x |
.= | $str1.=$str2; $str1=$str1.$str2; |
將$str1這個字符串再加上$str2這個字符串之后,再指派給$str1這個字符串 |
x= | $strx=$y; $str=$strx$y; |
重復$str字符串$y次,并反結果指派給str這個字符串 |
算術(Arithmetic)運算符 | ||
符號 | 范例 | 說明 |
+ | $z=$x+$y | 將$x和$y相加之后,再將結果指派給$z |
- | $z=$x-$y | 將$x減掉$y之后,再將結果指派給$z |
* | $z=$x*$y | 將$x和$y相乘之后,再將結果指派給$z |
/ | $z=$x/$y | 將$x除以$y之后,再將商數指派給$z |
% | $z=$x%$y | 將$x除以$y之后,再將余數指派給$z |
** | $z=$x**$y | 將$x乘以$y之后,再將結果指派給$z |
++ | $x++;++$x; | 如同$x=$x++1;將$x加一以后再將結果指派給$x |
-- | $x--;--$x; | 如同$x=$x-1;將$x減一以后再將結果指派給$x |
. | $z=$x.$y; | 將$x字符串和$y字符串連接之后,再將結果指派給$z |
數值(Numeric Values)關系運算符 | ||
符號 | 范例 | 說明 |
> | $x>$y | 如果$x大于$y,返回1的值,否則返回0 |
>= | $x>=$y | 如果$x大于等于$y,返回1的值,否則返回0 |
< | $x<$y | 如果$x小于$y,返回1的值,否則返回0 |
<= | $x<=$y | 如果$x小于等于$y,返回1的值,否則返回0 |
== | $x==$y | 如果$x等于$y,返回1的值,否則返回0 |
!= | $x!=$y | 如果$x不等于$y,返回1的值,否則返回0 |
<=> | $x<=>$y | 如果$x大于$y,返回1的值,如果$x等于$y,否則返回0;&127;如果 $x小于$y,則返回-1的值 |
字符串(String Values)關系運算符 | ||
符號 | 范例 | 說明 |
gt | $str1 gt $str2 | 如果$str1大于$str2,返回1的值,否則返回0 |
ge | $str1 ge $str2 | 如果$str1大于等于$str2,返回1的值,否則返回0 |
lt | $str1 lt $str2 | 如果$str1小于$str2,返回1的值,否則返回0 |
le | $str1 le $str2 | 如果$str1小于等于$str2,返回1的值,否則返回0 |
eq | $str1 ep $str2 | 如果$str1等于$str2,返回1的值,否則返回0 |
ne | $str1 ne $str2 | 如果$str1不等于$str2,返回1的值,否則返回0 |
cmp | $str1 cmp $str2 | 如果$str1大于$str2,返回1的值,如果$str1等于$str2,返回0,如果$str1小于$str2,則返回-1的值 |
邏輯(Logical)運算 1) $x && $y(And) $x $y 結果 真(True) 真(True) 真(True) 真(True) 假(False) 真(True) 假(False) 真(True) 假(False) 假(False) 假(False) 假(False) 2) $x || $y(Or) $x $y 結果 真(True) 真(True) 真(True) 真(True) 假(False) 真(True) 假(False) 真(True) 真(True) 假(False) 假(False) 假(False) 3) $x(Not) $x 結果 真(True) 假(False) 假(False) 真(True) | ||
其它常用的運算符 指令:..區塊運算符(Range Operator) 說明:這個運算符是 Perl 語言中特有的運算符,是一個很實用的運算符。 范例: @digits=(1..9); # 此時 @digits=(1,2,3,4,5,6,7,8,9); 指令: 條件運算符(Conditional Operator) 說明: (判別運算式? 運算式1: 運算式2)這個語法的意義和C語言一樣:如果判別運算式的值是真(True)的話,則做運算式 1 的運算;如果判別運算式是假(False)的話,則做運算式 2 的運算。 范例: $price = ($age>60)? 100:200; | ||
常用的文件數據(File test)運算符 | ||
范例 | 說明 | |
-r $file | 如果 $file 是可讀取的話,返回 1 | |
-w $file | 如果 $file 是可寫入的話,返回 1 | |
-x $file | 如果 $file 是可執行的話,返回 1 | |
-e $file | 如果 $file 存在的話,返回 1 | |
-s $file | 返回 $file 的文件大小(bytes) | |
-f $file | 如果 $file 是正常文件的話,返回 1 | |
-T $file | 如果 $file 是文本文件的話,返回 1 | |
-B $file | 如果 $file 是Binary文件的話,返回 1 | |
-M $file | 返回 $file 文件最后一次更改時間到現在的日期數 |