1、Perl數(shù)據(jù)類型之標量
- 標量:Scalar,以$符號開頭
- 數(shù)字標量:
- 值為”數(shù)字“的標量
- Perl中的數(shù)字
- 全部為雙精度浮點數(shù):$data = 10; $data = 10.00;
- 普通放入表示方法:3.1415926,-500等
- 科學計數(shù)法:2.18e22,2.18E22,5.16e-10
- 特殊數(shù)字的表示方法:較長的、不帶小數(shù)點的數(shù)字,可用下劃線分開;非十進制數(shù)
- 數(shù)字標量:
- 字符串標量:
- 標量值為字符串,由引號標識
- 字符串由可輸出的字母、數(shù)字和標點符號組成,如$data = “Hellow, World"
- 字符串的引號既可以是單引號,也可以是雙引號,可靈活使用
- 單引號與雙引號表示的區(qū)別:轉(zhuǎn)義符只在雙引號中有效
- 標量的聲明
- 標量可以在任意位置隨時聲明并使用,標量的默認初始值為空
- 標量名可以是字符、數(shù)字或者下劃線,區(qū)分大小寫,取名應和用途相關(guān)
- 標量的作用域
- 標量的作用域指的是一個標量可以被有效訪問使用的范圍
- 兩種標量的作用域范圍:
- 包變量(全局的)
- Perl中一個package是一個包,主函數(shù)也可以看做一個包
- 默認情況下的變量為包變量,是包內(nèi)的全局變量,在整個包及下面的子函數(shù)中都可用
- 私有標量
- 分為my類型和local類型
- my變量:只在本層模塊中可以看到這個變量
- local變量:在本層及本層下層的函數(shù)中都可以看到的變量
sub g_print{ print "$x\n"; } sub test_my{ my $x = 11; print "call-my $x\n"; g_print; } sub test_local{ local $x = 20; print "call-local $x\n"; g_print; } $x = 9; test_my; test_local; print $x; # 運行結(jié)果 call-my 11 9 call-local 20 20 9
- 包變量(全局的)
2、Perl數(shù)據(jù)類型之數(shù)組
-
數(shù)組的定義
數(shù)組是標量數(shù)據(jù)的有序列表,是多個標量數(shù)據(jù)的一個集合??梢园我舛鄠€元素,從0到全部占滿內(nèi)存
-
數(shù)組以@符號作為標識
image.png -
列表直接量:
-
包含了一系列值的列表,以括號標識,中間用逗號隔開
image.png -
也可以用范圍操作符".."來產(chǎn)生列表直接量:
-
該操作符會從左邊的數(shù)字計數(shù)到右邊,每次加1,產(chǎn)生一連串的數(shù)字
image.png
-
-
-
數(shù)組的賦值
- 對于純字符串的列表,使用“qw”來表示,可省略對字符串加引號的過程
- 形式為:
- qw(string1 string2 string3); ##空格、制表符、換行符作為分隔符
- 等同于("string1","string2","string3");
- 也可用其他任何標點符號作為定界符,代替括號
- qw !string1 string2 string3! qw /string1 string2 string3/ qw #string1 string2 string3#
- 對數(shù)組進行賦值,可以直接將列表量傳遞給數(shù)組
- @array = ("string1", 1.5, 418); @array = qw(string1 string2 string3);
- 如果列表直接量中包含標量、數(shù)組,則會進行取值作為元素
- $test = "hello"; @array = ("hello", 123); @array2 = ($test, @arrray1, "How are you")
- 數(shù)組之間進行賦值:
- @array1 = ('string1', 1.5, 418); @array2 = @array1;
- 特殊的數(shù)組賦值方法:
- pop操作符:取出數(shù)組中最后一個元素,同時返回該元素值
- @array = (5..9); ##@array為(5,6,7,8,9)
- $test1 = pop(@array); ##$test1為9,@array為(5,6,7,8)
- $test2 = pop(@array); ##$test2為8,@array為(5,6,7)
- push操作符:添加一個元素(或一串元素)到數(shù)組的尾端
- @array = (5,6);
- push(@array,8); ##@array為(5,6,8)
- push(@array,1..5); ##@array為(5,6,8,1,2,3,4,5)
- shift操作符:取出數(shù)組最左邊的元素,同時返回該元素值
- @array = (5..9); ##@array為(5,6,7,8,9)
- $test1 = shift(@array); ##$test1為5,@array為(6,7,8,9)
- $test2 = shift(@array); ##$test2為6,@array為(7,8,9)
- unshift操作符:添加一個元素(或一串元素)到數(shù)組的前端
- @array= (5,6)
- unshift(@array,8) ##@array為(8,5,6)
- unshift(@array,1..5) ##@array為(1,2,3,4,5,8,5,6)
- pop操作符:取出數(shù)組中最后一個元素,同時返回該元素值
-
數(shù)組元素的訪問
- 通過索引對數(shù)組元素進行訪問:
- @array = ("hello","world",123)
- $array[0]="hello"; $array[1]="world"; $array[2] = 123;
- 同標量$array沒有任何關(guān)系
- 特殊索引值:
- 用$#<數(shù)組名>代表最后一個元素的索引值。$end=$#array
- 使用負數(shù)索引。
- $array[-1]代表最后一個元素值
- $array[-2]代表倒數(shù)第二個元素值
- 通過索引對數(shù)組元素進行訪問:
3、Perl數(shù)據(jù)類型之引用
引用作為一種數(shù)據(jù)變量,可以指向變量、數(shù)組甚至子程序,代表值的地址
在Perl中,可以把引用稱為指針,二者是通用、無差別的
-
變量、變量名、地址
image.png -
軟引用:
- 軟引用類似于軟連接,存儲一個變量的名字
- $scalar = "hello";
- @scalar = ("hello","world",123);
- $refer = "scalar"; ##引用變量名
- 軟引用的解引用
- $$refer ##實質(zhì)為$scalar,即為“Hello“
- $$refer[0] ##實質(zhì)為$scalar[0]
- 軟引用類似于軟連接,存儲一個變量的名字
-
硬引用:
- 硬引用類似于硬連接,就是存儲地址
- $scalarref = \$foo; ##標量引用,$foo = "hello";
- $constref = \186_282.42; ##常量引用
- $arrayref = \@arr; ##數(shù)組引用,@arr= 1..100;
- $arrRef = [1,2,3,4,5]; ##匿名數(shù)組的引用
- 硬引用的解引用
- 由于硬引用是地址,所以用{}來進行解引用
- $scalarref = \$foo; ==> ${$scalarref}, 簡寫為$$scalarref
- $constref = \186_282.42; ==> ${$constref}, 簡寫為$$constref
- $arrayref = \@arr; ==> ${$arrayref}
- $arrRef = [1,2,3,4,5]; ==> ${$arrRef}
- 硬引用類似于硬連接,就是存儲地址
-
引用有助于創(chuàng)建復雜的數(shù)據(jù)
- @array = ([1..5],"hello world")
- ${$array[0]}{0} ##值為1
my $scalar = "Hello";
my @array = ("Hello","World",123);
my $scal_ref = \$scalar;
my $arr_ref = \@array;
## compare
my $scalar_com = $scalar;
my $array_0 = $array[0];
printf("scalar value:$$scal_ref\n");
printf("array0 value:$($arr_ref)[0]\n");
## modify the value
$$scal_ref = "Hello2";
$($arr_ref)[0] = "Hello2";
$scalar_com = "Hello3";
$array_0 = "Hellow3";
printf("scalar value: $scalar\n");
printf("array0 value: $array[0]\n");
# 輸出結(jié)果
scalar value:Hello
array0 value:Hello
scalar value: Hello2
array0 value: Hello2



