發新話題

網路管理語言 Perl 入門與實作

4.1.8 純量變數
純量變數是向記憶體要求配置一個空間,用來存放數值或字串之用。

大部份高階語言皆要求使用變數之前要先宣告,但 Perl 不必,隨時隨處均可立即產生,不必預先宣告。

Perl 的純量變數表示法很簡單:$ 加上變數名稱。變數名稱的第一個字必須為英文字元或底線_,例如:
引用:
正確:

$i
$j
$yesdoit
$name
$HoldYourHand
$_


錯誤:

$5year
以下是二種純量變數:
引用:
# 純量字串變數

$myName = "臥龍小三";

$yourName = '3SLO';


# 純量數值變數

$myVar = 1.414;

$yourVar = -1.2e5;

TOP

4.1.9 顯示純量變數內容
print 這個指令可以印出變數內容。
引用:
$v1 = 99;
print "純金 ", $v1;

$f1 = 'Just do it!';
print $f1;


$f2 = "一二三四笑咪咪\n\n";
print $f2;


雙引號中可以做變數代換:

print "$f1 $f2";

TOP

4.1.10 數值和字串也可以運算
數值和字串是可以一起運算的,結果視其運算目的而定。
引用:
$v1 = 99;
$v2 = '121';

print $v1 + $v2;   (欲計算數值)

結果:220 (數值)


$v1 = 99;
$v2 = '121';

print $v2 . $v1;   (欲形成字串)

結果:12199 (字串)


$v1 = '324'; (字串)

print $v1 * 1;     (欲計算數值)

結果:324 (數值)
雖然數值和字串可以混合運算,但若太奇怪的組合,便失去其用處。
引用:
比如:

$v1 = "jack die\n";

$v2 = 20;

print $v1 * $v2;
試問,這有何意義可言?因此,適度的運用,有益;過度,則造成意義混淆不明。

TOP

4.1.11 運算的順序
數值的運算是有一定的優先順序的。您應該記得四則運算時先乘除後加減這個口訣吧?!
引用:
$a = 4 + 2 * 3 / 5 - 1;

print $a;

請問是多少?
除了既的運算優先順序之外,我們可以小括號( )來改變運算的次序。
引用:
$a = ( 4 + 2 * 3 ) / 5 - 1;

print $a;

請問是多少?

TOP

4.1.12 比較算符
純量除了運算之外,還有一種比較算符,用來比較大小及順序。

Perl 的比較算符有二套,數值用一套,字串用一套。記住這個特色,有利於您快速掌握 Perl !!
引用:
數值的比較算符:

大於   >
等於   ==
小於   <
不等於 !=
大於或等於 >=
小於或等於 <=


字串的比較算符:

大於   gt
等於   eq
小於   lt
不等於 ne
大於或等於 ge
小於或等於 le
要特別注意的是:字串之間比較大小,是將二個字串的字元,逐一以字元在 ASCII 表中順序,做為比較大小的依據:
引用:
$a = "abcde";
$b = "ABCDE";

if ($a gt $b) {
   print '$a 大於 $b';
} elsif ($a eq $b) {
   print  '$a 等於 $b';
} else {
   print  '$a 小於 $b';
}

結果:

$a 大於 $b

(因為 ASCII 中,大寫英文字母排在小寫字母之前)

TOP

4.1.13 真假值
在 Perl 中,什麼是真?什麼是假?有一套特殊的定義。初入門者,應特別留意。

Perl 用以下方式來決定真假值:

1.0 為假,其它數值皆為真。

2.'0'、"0" 及空字串 ''、"" 為假,其它字串皆為真。

3.運算結果可以轉換成 "0" 者為假。

4.undef 這個特別值為假。

5.任何未定義的值為假。

6.上述假值定義之外,其餘為真。


我們來看一些例子:
引用:
假值:

0
'0'
"0"
''
""
undef
10-10
0.0
'0.00' + 0   (請思考之)



真值:

1
11
22
-5
'0.00'


用例:

#! /usr/bin/perl

print "Sir, 請輸入: ";
$ans=<>;
chomp $ans;

if (!$ans) {
        print "您沒有輸入任何東西!\n";
} else {
        print "您輸入的是:$ans\n";
}
註 1:<> 是輸入符號,可由 標準輸入 取值。

註 2:chomp 是內建函式,可截去變數尾端的 \n 換行字元。

上述檢查只做一次就結束了,沒有太大意義,最好使用迴圈:
引用:
#! /usr/bin/perl

while (!$ans) {
        print "Sir, 請輸入: ";
        $ans=<>;
        chomp $ans;
        if (!$ans) { print "您沒有輸入任何東西!\n\n"; }
}

print "您輸入的是:$ans\n\n";
上面這個例子有個缺點:當使用者輸入 0 時,由於 0 為假值,會被 !$ans 誤判為沒有輸入任何東西,解決的方法之一是採用:檢查$ans 的長度來判斷有無輸入資料?如下所示:
引用:
#! /usr/bin/perl

while (length($ans)==0) {
        print "Sir, 請輸入: ";
        $ans=<>;
        chomp $ans;
        if (length($ans)==0) { print "您沒有輸入任何東西!\n\n"; }
}

print "您輸入的是:$ans\n\n";

TOP

4.1.14 undef 的應用
undef 是累加時常用的技巧,下列中,$sum 第一次值為 undef,往後逐次增加。
引用:
#! /usr/bin/perl

$i=1;

while ($i < 50) {
        $sum += $i; # 同於 $sum = $sum + $i;
        $i++;       # 同於 $i = $i + 1;
}
print "累加總和是:$sum\n";

結果:

累加總和是:1225


註:

$sum -= $i;  同於  $sum = $sum - $i;

$sum *= $i;  同於  $sum = $sum * $i;

$sum /= $i;  同於  $sum = $sum / $i;
undef 可將變數還原成未定義狀態:
引用:
#! /usr/bin/perl

$i=1

while ($i < 50) {
        $sum += $i;
        $i++;
}

$sum=undef;

print "累加總和是:$sum\n";

結果:

累加總和是:

TOP

4.1.15 邏輯運算
有了真假值之後,便有邏輯運算。
引用:
&& ---> AND (且)  : 甲 && 乙,當 甲和乙均為真時,結果為真 (若甲一開始是假的,乙不會被檢查)
|| ---> OR  (或)  : 甲 || 乙,當 甲和乙有一個為真時,結果為真 (若甲一開是真的,乙不會被檢查)
!  ---> NOT (非)  : !甲,當 甲為假時,結果為真
用例:
引用:
#! /usr/bin/perl

chomp($a=<STDIN>);
chomp($b=<STDIN>);

if ( ($a<100) || ($b>100) ) {
        print "I don't like it!\n";

TOP

4.1.16 HERE Document
所謂 HERE Document 是說:利用標籤印出一大段字串,而不必使用引號。用法如下:
引用:
$mywords=<<HERE;

全方位解決xml中文問題

許多朋友朋友在處理xml的時候都遇到這樣的問題,那就是中文問題。如果解決這個問題呢?
其次方法是很簡單的,首先讓我們瞭解一下編碼UTF

什麼是 Unicode?

歷史上, 有兩個獨立的, 創立單一字符集的嘗試. 一個是國際標準化組織(ISO)的 ISO 10646 項目,
另一個是由(一開始大多是美國的)多語言軟件製造商組成的協會組織的 Unicode 項目.
幸運的是, 1991年前後, 兩個項目的參與者都認識到, 世界不需要兩個不同的單一字符集.
它們合併雙方的工作成果, 並為創立一個單一編碼表而協同工作.
兩個項目仍都存在並獨立地公佈各自的標準, 但 Unicode 協會和 ISO/IEC JTC1/SC2 都同意保持
Unicode 和 ISO 10646 標準的碼表兼容, 並緊密地共同調整任何未來的擴展.

HERE


print $mywords;
上述 HERE 就是一個標籤,在 =<<HERE; 和 HERE 之間夾住一大段字串。

標籤不必一定要寫成 HERE,您可以用任何一個字串來替代。要注意的是:HERE 之下至少要空一列以上。

特別要注意的是:HERE Document 中仍然可以進行變數代換喔!
引用:
#! /usr/bin/perl

$myName="My name is Jack";

$words=<<HERE;

甲:您好! 您叫什麼名字?

乙:$myName

HERE


print $words;

# 輸出結果:

甲:您好! 您叫什麼名字?

乙:My name is Jack

TOP

4.1.17 字串的操作
這裡主要說明截取子字串、字串的長度、大小寫轉換、尋找某子字串等操作

子字串
比如:$str="mynameis"; "myn" 就是 "mynameis" 的子字串。

Perl 提供 substr 這函式,可以幫我們截取子字串。
引用:
語法:

傳回子字串 = substr 字串, 開始位置, [截取長度]

註:開始位置由 0 計數起,若開始位置之值為負整數,則由字串結尾開始計算截取位置,
比如:-1 表示最後一個字元開始截取,-3 表示倒數第三個字元開始截取。若省略了截取
長度,則表示由開始截取位置一直到字串結束。
例:

$str = "ABCDEFG1234567";

$a = substr $str, 0, 5;   # 由第一個字元開始截取 5 個字元長度

print $a;

# 得:ABCDE


$a = substr $str, 3, 4;   # 由第 4 個字元開始截取 4 個字元長度

print $a;

# 得:DEFG


$a = substr $str, 5;   # 第6個字元開始截取至字串結束

print $a;

# 得:FG1234567


$a = substr $str, -1;   # 最後一個字元

print $a;

# 得:7


$a = substr $str, -4, 2;   # 最後第四個字元開始截取2個字元長度

print $a;

# 得:45
字串的長度
Perl 提供 length 函式,可用來計算字串的長度。
引用:
語法:

$str="我們一起看雲去";
$str_len = length($str);

print $str_len, "\n\n";
轉換大小寫
Perl 提供 uc / lc 函式,可轉字串為大寫/小寫。
引用:
語法:

# 轉成大寫
$str = uc(字串);

# 轉成小寫
$str = lc(字串);

$str="abCD99e";
$str = uc($str);   # 此時 $str 為 ABCD99E
$str = lc($str);   # 此時 $str 為 abcd99e
找尋子字串
Perl 提供 index 函式,可在字串中找尋某一子字串的起始位置。
引用:
語法:

$pos = index($str1, $str2);

# 找尋 $str2 在 $str1 中的起始位置
找尋子字串的最後位置
Perl 提供 rindex 函式,可在字串中找尋某一子字串最後的起始位置。
引用:
語法:

$pos = rindex($str1, $str2, $pos);

# 由 $str1 的 $pos 位置開始找起,找尋 $str2 在 $str1 中最後的起始位置
# 若 $pos 省略,則由字串的最後面開始找。
傳回 ASCII 值
Perl 提供 ord 函式,可傳回某一字元的 ASCII 值。
引用:
語法:

$num = ord(字元);


用例:

$num = ord('a');

print "$num\n";
chr 函式,則可將 ASCII 值轉成字元。
引用:
語法:

$char = chr(數字);


用例:

$char = chr(48);

print "$char\n";

TOP

發新話題

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