標量數據
perl的數據類型非常簡單,第一種數據類型稱爲scalar(標量),一般用於表示數字或者字符串。
兩種標量的使用:
一種是標量數據,表示數據的值;一種是標量變量,表示存儲標量數據的容器。
Perl處理數字時使用的是底層C庫,且統一使用雙精度浮點數來存儲和計算數據(雙精度浮點數,使用8字節,共64位來存儲一個浮點數)
整數直接量:就是在源代碼中直接寫成數據內容的形式。
寫法如下:
0
2001
-40
137
61298040283768
最後一數字比較長,Perl中允許你在整數直接量中加入下劃線。將若干位數分開,寫成下面這樣:
61_298_040_283_768
兩種寫法對計算機來說都表示一個數字。
Perl提供乘冪運算符,即兩個**,比如2**3表示2的3次方,結果是8。
字符串:Perl完全支持Unicode,所以在字符串中可以使用任意一個合法的Unicode字符。但由於歷史原因,它不會自動將程序源代碼當作Unicode編碼的文本文件讀入,所以如果想在源代碼中使用過Unicode書寫直接量的話,需要手工加上utf8編譯指令
注:
最好養成習慣始終加上這句
use utf8;
字符串的連接使用.
操作符
"hello".“world” #等同於“helloworld”
"hello"." "."world" #等同於"hello world"
小寫的字母x,此操作符會將其左邊的操作數(也就是要重複的字符串)與它本身重複連接,重複次數則由右邊的操作數(某個數字)指定,例子:
“fred” x 3 #得“fredfredfred”
"barney" x (4+1) #得"barney" x 5 ,即“barneybarneybarneybarneybarney”
5 x 4.8 #本質上就是"5" x 4,所以得“5555”
Perl的內置警告信息
從Perl 5.6開始,可以通過編譯指令啓用警告機制
1.
#!/usr/bin/perl
use warnings;
2.也可以在命令行調用程序時使用-w選項啓用警告機制
$ perl -w 1.pl
3.也可以在第一行這樣啓用
#!/usr/bin/perl -w
如果看不明白警告信息說的是什麼,可以利用diagnostics編譯指令,在perldiag文檔中列出每個警告信息的簡短描述和詳盡解釋
use diagnostics;
把這條加進去之後,程序啓動可能會有些慢。(也可以使用命令行的-M選項)
非十進制數字的轉換
可以使用hex()或者oct()函數將字符串轉換爲對應的數字。
hex('DEADBEEF') #即十進制數字 3_735_928_559
hex('0xDEADBEEF') #即十進制數字 3_735_928_559
用代碼點創建字符
對於一些特殊字符的輸入,可以使用代碼點(code point),比如
$alef = chr(0x05D0);
$alpha = chr(hex('03B1'));
$omega = chr(0x03C9);
或者已知字符,要取得他的代碼點,可以通過ord()函數轉換:
$code_point = ord('א')
比較 | 數字 | 字符串 |
---|---|---|
相等 | == | eq |
不等 | != | ne |
小於 | < | lt |
大於 | > | gt |
小於或等於 | <= | le |
大於或等於 | >= | ge |
- 注意Perl中的判斷和C語言不同的地方:if和while必須帶花括號
獲取用戶輸入
- 行輸入操作符<STDIN>
注意:從<STDIN>讀取的字符串是包含末尾的換行符的。實際應用的時候,我們往往不需要末尾的那個換行符,需要用chomp()操作符去掉。
#!/usr/bin/perl
$line = <STDIN>;
if($line eq "\n")
{
print "That was just a blank line!\n";
}else{
print "That line of input was:$line";
}
-
chmop()操作符:去掉字符串末尾的換行符,如果沒有,就啥都不幹。
chmop()本質上是函數,它的返回值是實際移除的字符數,但這個數字幾乎沒用。 -
注意:如果字符串後面有兩個以上的換行符,chomp()只去掉最後的那個;如果末尾沒用換行符,就啥也不幹並返回0。
chomp($text = <STDIN>); #讀取不帶換行符的輸入
#下面是另一種寫法
$text = <STDIN>;
chomp($text);
下面再介紹一個例子:
$food = <STDIN>;
$betty = chomp $food; #會得到返回值1————我們之前已經知道了
這裏用chomp()的時候沒有加括號,對於函數而言這種括號是可加可不加的,這是Perl的另一項慣例:除非去掉括號會改變表達式的意義,否則括號可以省略。
- undef值
undef本身既不是數字也不是字符串,它完全是一種獨立類型的標量值。
可以根據undef作爲數字使用時會被視作爲數字0,構造一個數字累加器,在開始累加前完全不用做任何初始化工作:
#累加一些奇數
$n=1;
while($n<10)
{
$sum+=$n;
$n+=2; 準備好下一個奇數
}
print "The total was $sum.\n";
循環開始前$sum的初值是undef,由於我們把undef當成數字用,相當於0,所以累加的結果就是1。同樣的道理,串接字符串的時候也不用刻意的去進行初始化:
$string .= "more text\n";
如果$string的值起初是undef,那麼這個串接操作的結果就好比是空字符串和"more text\n"串接後存入該變量,如果初始值是某個字符串,那麼就和以往一樣,追加新的部分到字符串末尾。
- defined函數
爲了判斷某個字符串是否爲undef,可以用defined函數,即如果是undef,該函數就返回假;否則,即使是空字符串,那也是已定義的值,函數返回真