發新話題

Perl的基本語法 - 資料型態(Data type)

Perl的基本語法 - 資料型態(Data type)

資料型態(Data type):
Perl的資料型態大致分為四種:訪客無法瀏覽此圖片或連結,請先 註冊登入會員 訪客無法瀏覽此圖片或連結,請先 註冊登入會員 訪客無法瀏覽此圖片或連結,請先 註冊登入會員 訪客無法瀏覽此圖片或連結,請先 註冊登入會員 ,看起來雖少但用起來卻綽綽有餘。尤其在寫Perl程式時可以不必事先宣告變數,這一點對剛學程式語言的人甚為方便,不過為了以後程式除錯和維護方便,我建議你還是養成事先宣告變數的習慣比較好。 [size=+1](a) Scalar:純量變數是Perl裡最基本的一種資料型態,它可以代表一個字元、字串、整數、甚至浮點數,而Perl把它們都看成是一樣的東東! 你甚至可以混著用,不可思議吧。例如:

[size=+1]# 井字號開頭的後面都是註解。
# 純量變數以$開頭。
# my 是一種宣告變數的方式,它可以使變數區域化。
# 宣告變數時若不加 my 或 local 則Perl會把它當作全域變數使用。
# 習慣上,我們會將字串用雙引號括起來,而數值就不用加引號。
my $x="abc";
my $x=123;
my $x=4.56;

那麼程式怎麼判斷這是數值還是字串呢? 其實不是程式判斷,而是你自己要判斷。Perl分別提供了一堆運算子來處理數字和字串,你必須知道這個變數是數值或字串,才能使用個別的運算子來對變數做運算。我分別列出字串運算子和數值運算子,好讓大家能區分它們的不同。

◎字串運算子
String OperatorPurpose
xReturns a string consisting of the string on the left of the operand, repeated the number of times of the right operand.
Concatenates the two strings on both sides of the operator.
eqReturns True if the two operands are equivalent, False otherwise.
neReturns True if the two operands are not equal, False otherwise.
leReturns True if the operand on the left is stringwise less than the operand on the right of the operator. Returns False otherwise.
ltReturns True if the operand on the left is stringwise less than or equal to the operand on the right of the operator. Returns False otherwise.
geReturns True if the operand on the left is stringwise greater than or equal to the operand on the right of the operator. Returns False otherwise.
gtReturns True if the operand on the left is stringwise greater than the operand on the right of the operator. Returns False otherwise.
cmpReturns -1, 0, or 1 if the left operand is stringwise less than, equal to, or greater than the right operand.
,Evaluates the left operand, the evaluates the right operand. It returns the result of the right operand.
++Increments the string by one alphabetic value.


◎數值運算子
Value OperatorPurpose
+Computes the additive value of the two operands.
-Computes the difference between the two operands.
*Computes the multiplication of the two operands.
/Computes the division between the two operands.
%Computes the modulus(remainder) of the two operands.
= =Returns Ture if the two operands are equivalent, False otherwise.
!=Returns Ture if the two operands are not equal, False otherwise.
<=Returns Ture if the operand on the left is numerically less than or equal to the operand on the right of the operator. Returns False otherwise.
=>Returns Ture if the operand on the left is numerically greater than or equal to the operand on the right of the operator. Returns False otherwise.
<Returns Ture if the operand on the left is numerically less than the operand on the right of the operator. Returns False otherwise.
>Returns Ture if the operand on the left is numerically greater than the operand on the right of the operator. Returns False otherwise.
< = >Returns -1 if the left operand is less than the right, +1 if is it greater than, and 0(False) otherwise.
&&Performs a logical AND operation. If the left operand is True m then the right operator is not evaluated.
||Performs a logical OR operation. If the left operand is True m then the right operator is not evaluated.
&Returns the valueof the two operators bitwise ANDed.
|Returns the valueof the two operators bitwise ORed.
^Returns the valueof the two operators bitwise XORed.
++Increment operator. Increments the variable's value by 1.
--Decrement operator. Decrements the variable's value by 1.
**Computes the power of the left-hand value to the power of the rihght-hand value.
+=Adds the value of the right-hand operand to the value of the left-hand operand.
-+Subtracts the value of the right-hand operand to the value of the left-hand operand.
*=Mlutiplies the value of the left-hand operand to the value of the right-hand operand.
>>Shifts the left operand right by the number of bits that is specified by the right operand.
<<Shifts the left operand left by the number of bits that is specified by the right operand.
~Performs a 1s complement of the operator. This is a unary operator.

[size=+1](b) Scalar Array:純量陣列,陣列內的每一個元素都是Scalar variable。宣告及使用方式如下:

[size=+1]# 純量陣列以 @ 開頭。
my @array;
my @array=qw(a b c d);

# qw 函數會將其後的每個元素用逗點隔開,效果就像下面這行。
my @array=("a","b","c","d");

# 當然你也可以一個個元素宣告,下面就是存取每一個元素的方法。
# 因為陣列中的每一個元素都是純量變數,所以要以 $ 開頭,
# 剛開始容易搞混,請注意。
$array[0]="a"; $array[1]="b"; $array[2]="c"; $array[3]="d";

# 使用for loop印出陣列內每個元素的值。
for($i=0; $i<=$#array; $i++) {
print "$array[$i]\n";
}

看到$#array這個奇怪的東東沒? 這是Perl的一個特殊用法,代表這個陣列最後一個元素的註標。由於Perl不必事先宣告變數,也不必預先宣告陣列的大小,甚至可以隨時增加新元素,那我們怎麼知道這個陣列到底有多大呢? 透過這個特殊變數我們可以得知這個這個陣列最後一個元素的註標,自然而然也就知道這個陣列究竟有多大了。另外Perl只定義了一維陣列的語法,二維以上只能用指標間接來達成。


[size=+1](c) Hash Array(Associative Array):雜湊陣列也叫做相關陣列,它和一般陣列沒什麼不同,差別只是在它的索引值用的是字串,而非一般陣列所用的整數值,因此相關陣列不像一般陣列一樣有次序的概念,它沒有所謂的第一項資料這種說法。它就相當於把一堆變數組合成一個group,然後我們可以透過索引字串存取這個group每一個元素的值。相關陣列的宣告及使用方式如下:

[size=+1]# 相關陣列是以 % 符號開頭的。
my %hash;

# => 這個符號是Perl5新增的,是為了相關陣列量身定做的,
# 因為索引和元素值都是純量,若使用 => 這個符號,
# (索引=>元素值) 兩兩對應,就不容易發生失誤。
my %hash=("i1"=>"aaa","i2"=>"bbb","i3"=>"ccc");

# 上面這行的效果和下面這行是一樣的。
my %hash=("i1","aaa","i2","bbb","i3","ccc");

# 下面是存取每個元素的方法,注意是用大括號把索引括起來哦。
# 習慣上索引值用單引號、元素值用雙引號括起來。
$hash{'i1'}="aaa"; $hash{'i2'}="bbb"; $hash{'i3'}="ccc";

# 下面是使用相關陣列的三個例子:
foreach $key (keys %hash) {
print "$hash{$key}\n";
}
foreach $value (values %hash)
while(($key,$value)=each %hash)

Perl有上述三個函數可對相關陣列做運算:keys函數可取出相關變數的索引值,組成一純量陣列,注意這些由keys函數取出的索引值沒有次序性;values函數可取出相關變數的元素值;each函數則會取出(索引、元素)對。使用者可視情況而用。


[size=+1](d) References(Pointer):Perl 5新增了參考指標的資料型態,使Perl和C一樣可借由指標建立一些複雜的資料結構。普通程式是用不到指標這玩意的,下面也只是簡單介紹一下,看不懂的人可不必深究。 ⊙如何取得變數的位址?
[size=+1]$scalarRef=\$scalarVar;
$arrayRef=\@arrayVar;
$hashRef=\%hashVar;
$funcRef=\&funcName;
⊙如何使用指標?
[size=+1]print $$scalarRef;
print "@$arrayRef";
print $hashRef->{$key};
&$funcRef;
⊙Anonymous Array References:(二維陣列)
[size=+1]$arrayRef=[[1,2,3,4],a,b,[x,y,z],c];
print "$arrayRef->[0][0]\t$arrayRef->[2]\t$arrayRef->[3][2]\n";
⊙Anonymous Hash References:
[size=+1]$hashRef={a=>aa,b=>bb,c=>cc};
print "$hashRef->{a}\t$hashRef->{b}\t$hashRef->{c}\n";


TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。