PERL學習筆記[不完整版]

一、簡單變量
===========

1. 整型
$x = 123456;
PERL中將整型數據存放在浮點寄存器中,實際上整型變量在PERL中是當作浮點數來看但,只不過是一種浮點數據的特列。
8進制數據以0打頭
$var1 = 047(十進制39)
16進制數據以0x打頭
$var2 = 0x1f(十進制31)

2. 浮點型
浮點寄存器通常是不能精確的存儲浮點數,會產生誤差。使用浮點數時需要注意指數範圍通常是-309到+308。
e.g.
11.4, -0.3, .3, 3., 64.1e+02, 5.4e04

$value = 9.01e+21 + 0.01 - 9.01e+21; (value爲0)
$value = 9.01e+21 - 9.01e+21 + 0.01; (value爲0.01)

3. 字符串
PELR中字符串的結尾沒有C語言中的'/0',需要注意。
PERL中的字符串支持單引號和雙引號兩種操作,但是有不同:
雙引號的字符串支持簡單的變量替換:
$number = 11;
$text = "This text contains the number $number.";

同時雙引號字符串支持轉義字符:
/a        Bell
/b        Backspace
/cn        The CTRL + n character
/e        Escape
/E        End the effect of /L, /U or /Q
/f        Form feed
/l        Forces the next letter into lowercase
/L        All following letters are lowercase
/n        Newline
/r        Carriage return
/Q         Do not look for specifial pattern characters
/t        Tab
/u        Force next letter into uppercase
/U        All following letters are uppercase
/v        Vertical tab

若要在字符串包含雙引號或者反斜線,則需要在之前加入一個反斜線作爲轉義:
$res = "A quote /" and A backslash //";

單引號與雙引號有2個區別:1.沒有變量替換功能, 2.反斜線不支持轉義字符

在PERL中所有的變量缺省都爲undef

二、操作符
=====
1. 算術操作符
a)乘冪的基數不能爲負:(-5)**2
b)乘冪結果不能超出計算機表示範圍:10**99999
c)取餘操作數如果不是整數,則四捨五入成整數後運算,運算符右邊不能爲0
d)單目負可用於變量:-$y(等效$y*-1)

2.整數比較操作符
<        小於
>        大於
==        等於
<=        小於等於
>=        大於等於
!=        不等於
<=>        比較,返回1,0或-1(0兩值相等,1第一個值大,-1第二個值大)

e.g.
$value1 = 20;
$value2 = 30;
print $value1 <=> $value2;
結果爲-1

3.字符串比較操作符
lt        小於
gt        大於
eq        等於
le        小於等於
ge        大於等於
ne        不等於
cmp        比較,返回1, 0或-1

4. 邏輯操作符
||(or)        邏輯或
&&(and)        邏輯與
!(not)        邏輯非
xor        邏輯異或

5. 位操作符
&         位與
|         位或
~         位非
^         位異或
<<         左移位
>>         右移位

PS:若$用於負整數,則PERL會將其轉化成無符號數

6. 賦值操作符
=
+=
-=
*=
/=
%=
**=
&=
|=
^=

7. 自增,自減

8. 字符串聯結和重複操作符
聯結: .(.=)
重複: x

e.g.
$newstring = "potato" . "head";(等於"potatohead")
$newstring = "t" x 5(等於"ttttt")

9.逗號操作符
逗號前的表達式先會被計算
$var1 +=1, $var2 = $var1;
等於:
$var1 += 1;
$var2 = $var1;

$var = 26;
$result = (++$var, $var + 5);(result爲32)

10.條件操作符
$result = $var == 0 ? 14 : 7

11. 操作符優先序列


二、列表和數組變量
================
1. 列表
列表是包含在括號裏的一序列值,可以是任何數值,也可以爲空。
e.g.
(1, 4.3, "Hello", 55)
()空列表
PS:含有一個數值的列表((4.3))和該數值本身(4.3)是不同的,但是可以轉化

(17, $var, "a string")
(17, 256 << 2)

2. 數組(@)
列表存儲在數組變量中,與簡單變量不同,數組變量以"@"打頭
@array = (1, 2, 3);
數組變量創建時初始化值爲空列表(),而且由於PERL用@和$來區分數組變量和簡單變量,因此可以使用同一個名字表示數組變量和簡單變量。
e.g.
$var = 1;
@var = (11, 23, $var);

數組存儲
對於數組中的值可以通過下標訪問,第一個元素下標爲0。若試圖訪問不在的數組元素時,結果爲NULL,但如果給超出數組大小的元素賦值,則數組會自動增長,其中增長的元素填充NULL值。
e.g.
@array = (1, 2, 4, 5);
$scalar = $array[0];
$array[3] = 4; #array is (1, 2, 4, 4)
$scalar = $array[4]; # $scalar is null
$array[6] = 17; # @array is (1, 2, 4, 4, "", "", 17)

數組拷貝
@result = @original

用數組給列表賦值
@list1 = (2, 4, 5);
@list2 = (1, @list1, 65);

對簡單變量賦值
@array = (2, 3, 4);
($var1, $var2, $var3) = @array;

字符串中的方括號和變量替換
"$var[0]" 數組中的第1個元素值
"$var/[0]" 等於"$var"."[0]"
"${var}[0]" 等於"$var"."[0]"
"$/{var}" 等於${var}

列表範圍
(1..10) = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(3..3) = (3)
(2.1..5.3) = (2.1, 3.1, 4.1, 5.1)
(4.5..1.6) = ()
("aaa".."aad") = ("aaa", "aab", "aac", "aad")
($var1..$var2+4)

數組輸出
print ("@array/n")

數組長度
若數組變量出現在預期簡單變量出現的地方,則PERL解析爲其長度
@array = (1, 2, 4)
$scalar = @array; # $scalar = 3
($scalar) = @array; # $scalar = 1
上面的表達式,實際上把$scalar看成是一個獲取列表元素的表達式了,因此實際上獲取的是列表array的第一個元素的值.
e.g.以數組長度遍歷列表
$count = 1;
while ($count <= @array) {
      print ("Element $count: @array[$count - 1]/n");
      $count++;
}

子數組
@array = (1, 2, 3, 4, 5);
@subarray = @array[0, 1]; # @subarray=(1, 2)
@subarray2 = @array[1..3]; # @subarray=(2, 3, 4)
@array[0,1] = ("string", 24) #@array = ("string", 24, 3, 4, 5)
@array[1,2] = @array[2,1] 用子數組形式交換兩個元素

數組相關函數
sort - 按字符順序排序
@array = ("this", "is", "a", "test");
@array2 = sort(@array); # @array2=("a", "is", "test", "this")

reverse - 反轉數組
@array2 = reverse(@array);

chop - 數組去尾
去掉STDIN輸入字符串時最後一個字符-換行符,若用到數組上,則對數組的每一個元素都進行去尾處理。
@list = ("rabbit", "12345", "quartz");
chop (@list); # @list = ("rabbi", "1234", "quart")

join/split - 連接/拆分
join的第一個參數是連接所用的分割符,其餘爲待連接的字符數組
$string = join(" ", "this", "is", "a", "string"); # "this is a string"
$string = "words::and::clons"
@array = split(/::/, $string); # @array=("words", "and", "colons");

三、文件讀寫
===========
1. 打開、關閉文件
open (filevar, filename)
filevar: 文件句柄
filename: 文件名

PERL中有三種訪問模式:讀、寫、添加。寫模式會將原有數據覆蓋,而添加模式,是在文件末尾加入新內容。但是不能對文件進行讀寫/添加操作
open(MYFILE, "myfile") 讀
open(MYFILE, ">myfile") 寫
open(MYFILE, ">>myfile") 添加

文件打開處理:
if (open(MYFILE, "myfile)) {
   # here's what to do if the file opened succesfully
}

unless(open(MYFILE, "myfile")) {
   die ("Can not open input file!/n");
}

open(MYFILE, "myfile") || die ("Could not open file.");

使用完畢後需要用close(MYFILE)關閉文件

讀文件操作
$line = <MYFILE> 從文件中讀取一行數據到變量$line中,並且把文件指針向後移動一行。對於<STDIN>不需要打開文件,即可操作
@array = <MYFILE> 把文件全部內容讀入數組@array,文件每一行(包含回車)爲@array的一個元素。

寫文件
open(OUTFILE, ">outfile")
print OUTFILE ("Here is an output line./n")
PS: STDOUT, STDERR爲標準輸出和標準錯誤文件,通常爲終端,因此不需要打開文件

處理文件狀態
-op expr
e.g.
if (-e "path/file1") {
   print STDERR ("File exists./n");
}

-b        是否爲塊設備
-c        是否爲字符設備
-d        是否爲目錄
-e        是否存在
-f        是否爲普通文件
-g        是否設置了setgid位
-k        是否設置了sticky位
-l        是否爲符號連接
-o        是否擁有該文件
-p        是否爲管道
-r        是否可讀
-s        是否非空
-u        是否設置了setuid位
-t        是否表示終端
-w        是否可寫
-x        是否可執行
-z        是否爲空文件
-A        距上次訪問多長時間
-B        是否爲二進制文件
-C        距上次訪問文件的inode多長時間
-M        距上次修改多長時間
-O        是否只有真正用戶所有
-R        是否只有真正用戶可讀
-S        是否爲SOCKET
-T        是否爲文本文件
-W        是否只有真正用戶可寫
-X        是否只有真正用戶可訪問

命令行參數
@ARGV是PERL中的命令行參數數組,但是@ARGV[0]並不是代表文件名,而是第一個參數。
$var = $ARGV[0]; #第一個參數
$number = @ARGV; #參數個數

PERL中<>操作符,實際上是對數組@ARGV的隱含引用:
1. 當PERL解析器第一次看到<>時,打開以$ARGV[0]爲文件名的文件
2. 執行動作shift(@ARGV); 把數組@ARGV的元素向前移動一個,其元素量減少1
3. <>操作符讀取在第一步打開的文件中的所有行
4. 讀完後,解析器回到第一步重複
e.g.
@ARGV = ("myfile1", "myfile2");    #實際上是由命令行參數賦值
while ($line = <>) {
      print ($line);
}
把文件myfile1和myfile2的內容打出來。

打開管道
open (MESSAGE, "| cat > hello")
等價於
open (MYPIPE, ">hello")

四、模式匹配
===========


五、控制結構
===========
1)條件判斷
if (<expression>) {
   <statement_block_1>
} elseif (<expression>) {
   <statement_block)2>
}
...
else {
   <statement_block_n>
}

2)循環
a)while循環
while (<expression>) {
   <statement_block>
}

b)until循環
until(<expression>) {
   <statement_block>
}

c)for循環
for ($count = 1; $count <= 5; $count++) {
    # statements inside the loop go here
}

d)foreach循環
foreach localvar (listexpr) {
    statement_block;
}

e.g.
foreach $word (@words) {
    if ($word eq "the") {
       print ("found the word 'the'/n");
    }
}

e)do循環
do {
   statement_block
} while/until(condexpr)

f) 循環控制
退出循環last(C的break)
執行下一個循環next(C的continue)
redo重複此次循環,循環變量不變,但是redo在do循環中不起作用。

g)goto
goto label;

3)單行條件語句
statement keyword condexpr
其中keyword:if, unless, while, until
e.g.
pirnt ("This is zero./n") if ($var = 0);
print ("This is zero./n") unless ($var != 0);
PS:雖然條件判斷在後面,但是是先行執行。

六、子程序
=========
1. 定義
sub subroutine{
    statements;
}

2. 調用(&)
&subname;
...
sub subname {
    ...
}

3. 先定義後使用可以省略&符號
sub subname {
    ...
}

subname;

4. 向前引用,現定義字程序名,後定義子程序體
sub subname;
...
subname;
...
sub subname {
    ...
}

5. 用do調用
do my_sub(1, 2, 3);#等價&my_sub(1, 2, 3);

6. 返回值
缺省情況,子程序最後一個語句作爲返回值

7. 局部變量
my 定義的變量只在該子程序中存在
local定義的變量不存在於主程序中,但是存在在該子程序和該自春光許調用的子程序中
e.g.
my ($scalar) = 43;
local(@array) = (1,2,3);

8. 參數傳遞
&sub1($number1, &number2, &number3);
...
sub sub1{
    my($number1, $number2, $number3) = @_;
    ...
}

9. 傳送數組
&addlist (&mylist);
&addlist ("14", "6", "11");

sub addlist {
    my (@list) = @_;
    ...
}

當參數爲數組的時候,子程序只能將其賦給一個數組變量

10. 別名傳遞數組參數(引用傳遞)
@myarray = (1, 2, 4, 5);
&my_sub(*myarray);
sub my_sub {
    my (*subarray) = @_;
}

在定義數組別名後,如果有相同的簡單變量,則對該簡單變量的操作同樣會影響到別名數組。

11. 預定義子程序
PERL5中預定義了三個子程序:
BEGIN子程序在程序啓動時候調用
END子程序在程序結束時被調用
AUTOLOAD在找不到某個子程序時被調用
e.g.
BEGIN {
      print ("Hi! welcome./n");
}

AUTOLOAD {
      print ("HHH/n");
}

若預定義子程序定義了多個,BEGIN按順序執行,END按逆序執行。


七、關聯數組

八、格式化輸出

九、文件系統

十、引用(指針)
=============
PERL5中有兩種類型的引用類型:硬引用和符號引用。符號引用包含變量的名字,它對於運行時創建變量名,並定位很有用處。基本上,符號引用就像文件名或UNIX系統中的軟連接。而硬引用則像文件系統中的硬連接。
硬引用跟蹤引用計數器,當其數爲0時,PERL自動將被引用的數據釋放,如果該數據是對象,則析構釋放到內存池中。對於非簡單變量的引用必須顯示的解除引用,並且告訴其應當如何做。
1)使用引用
任何簡單變量均可保存硬引用,因爲數組和哈西表含有多個簡單變量,所以可以建立多種組合而成的複雜的數據結構,如數組的數組,哈西表的數組。
取地址:
如果$pointer的值爲一個數組的指針,則@$pointer可以訪問數組中的元素,表示取出$pointer中的地址值當作數組使用。類似%$pointer表示指向哈西表中的第一個元素的引用。

創建使用引用
反斜線(/)與C語言中傳遞地址操作符類似(&),PERL中用'/'符號創建一個新的引用:
$variavle = 22;
$pointer = /$variable;
$ice = "jello";
$iceptr = /$ice;
引用$pointer指向$variavle的值位置,引用$iceptr指向"jello",即使$varivle銷燬,仍然可以使用$pointer訪問該值,這是一個硬引用,所以必須同時銷燬$pointer和$variavle以便釋放空間。
例子中引用變量$pointer保存的是$variavle的地址,而不是值本身,若要獲取的其值,則用兩個$$符號
e.g.
$value = 10;
$pointer = /$value;
printf "$$pointer";

2) 引用和數組
$pointer = /@ARGV

$i = 0;
foreach (@$pointer) {
    print "$i: $$pointer[$i++]/n";
}

通過引用訪問哈西表的形式爲$$pointer{$index}($index爲哈西表鍵值),構造哈西表還可以用=>符號:
%weekday = {
'01' => 'Mon',
'02' => 'Tue',
...
};

使用哈西表和數組時,用$和用->是等效的:
$$name[0] = "kamran";
等效於
$name->[0] = "kamran";

$$lastnames{"kamran"} = "Husain";
等效於
$lastnames->{"kamran"} = "Husain";

3) 子程序的引用
$pointer_to_sub = sub {... declaration of sub ...};
調用函數指針
&$pointer_to_sub(parameters);

4)文件句柄的引用
/*FILEHANDLE
e.g.
splitOut(/*STDIN);
splitOut(/*LPHANDLE);

十一、面向對象

十二、包和模塊

 
發佈了71 篇原創文章 · 獲贊 6 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章