本节简单记录perl脚本语言的学习过程。
Perl基础语法
1 | #!/usr/bin/perl |
运行结果:
Perl数据类型
Perl 有三个基本的数据类型:标量、数组、哈希。
标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个 $,表示是标量
数组变量以字符 @ 开头,索引从 0 开始。要访问数组的变量,可以使用美元符号($)+变量名,并指定下标来访问
哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值。哈希变量以字符 % 开头。如果要访问哈希值,可以使用 $ + {key} 格式来访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284#!/usr/bin/perl
#标量
print "===========标量相关===========\n";
$myfirst = 123; #数字123
$mysecond = "123"; #字符串123
$mythird = 11.2e-23; #浮点数
$var1 = 047; #八进制以0开始,等于十进制的39
$var2 = 0x1f; #十六进制以0x开始,等于十进制的31
print "$myfirst\n";
print "$mysecond\n";
print "$mythird\n";
print "$var1\n";
print "$var2\n";
print "===========标量运算===========\n";
$str = "hello" . "world"; # 字符串连接
$num = 5 + 10; # 两数相加
$mul = 4 * 5; # 两数相乘
$mix = $str . $num; # 连接字符串和数字
print "str = $str\n";
print "num = $num\n";
print "mul = $mul\n";
print "mix = $mix\n";
print "===========特殊字符===========\n";
#__FILE__, __LINE__, 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名
#但如果直接将其放入字符串中,Perl 解释器会将它们当成普通字符串处理,不会解析为特殊变量。
print "文件名 ". __FILE__ . "\n";
print "行号 " . __LINE__ ."\n";
print "包名 " . __PACKAGE__ ."\n";
print "__FILE__ __LINE__ __PACKAGE__\n";
print "===========v字符串===========\n";
#一个以 v 开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。
$smile = v9786;
$foo = v102.111.111;
$martin = v77.97.114.116.105.110;
print "smile = $smile\n";
print "foo = $foo\n";
print "martin = $martin\n";
print "---------------------------------------\n\n";
#数组
print "===========数组相关===========\n";
@arr = (1, 2, 3);
print "@arr\n";
print "$arr[0]\n";
print "$arr[1]\n";
print "$arr[2]\n";
#负数从反向开始读取,-1为最后一个元素,-2为倒数第二个元素,以此类推
print "$arr[-1]\n";
print "$arr[-2]\n";
print "$arr[-3]\n";
print "数组大小: ",scalar @arr,"\n";
#数组长度返回的是数组物理大小,而不是元素的个数,
@array = (1,2,3);
$array[50] = 4;
$size = @array;
$sizeActu = grep { defined } @array;
$max_index = $#array; # $#array 的 # 不是注释符号,而是 Perl 的特殊写法,表示数组 array 的最后一个下标,也就是最大索引。
print "数组大小: $size\n";
print "实际元素个数: $sizeActu\n";
print "最大索引: $max_index\n";
#变量上下文
print "===========变量上下文相关===========\n";
#上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文。
#Perl 解释器会根据上下文来决定变量的类型
@names = ('google', 'runoob', 'taobao');
@copy = @names; # 复制数组
$size = @names; # 数组赋值给标量,返回数组元素个数
print "名字为 : @copy\n";
print "名字数为 : $size\n";
print "===========数组序列号===========\n";
@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = ('a'..'z');
print "@var_10\n"; # 输出 1 到 10
print "@var_20\n"; # 输出 10 到 20
print "@var_abc\n"; # 输出 a 到 z
print "===========添加和删除数组元素===========\n";
# 创建一个简单是数组
@sites = ("google","runoob","taobao");
$new_size = @sites ;
print "1. \@sites = @sites\n"."原数组长度 :$new_size\n";
# 在数组结尾添加一个元素
$new_size = push(@sites, "baidu");
print "2. \@sites = @sites\n"."新数组长度 :$new_size\n";
# 在数组开头添加一个元素
$new_size = unshift(@sites, "weibo");
print "3. \@sites = @sites\n"."新数组长度 :$new_size\n";
# 删除数组末尾的元素
$new_byte = pop(@sites);
print "4. \@sites = @sites\n"."弹出元素为 :$new_byte\n";
# 移除数组开头的元素
$new_byte = shift(@sites);
print "5. \@sites = @sites\n"."弹出元素为 :$new_byte\n";
print "===========切割数组===========\n";
@sites = qw/google taobao runoob weibo qq facebook 网易/; #qw// 是 Perl 中的一个特殊语法,用于创建一个由空格分隔的字符串列表,并将其赋值给一个数组变量。它的作用是简化字符串列表的创建,避免了使用引号和逗号的麻烦。
@sites2 = @sites[3,4,5];
print "@sites2\n";
#如果是连续的索引,可以使用 .. 来表示指定范围:
@sites2 = @sites[2..6];
print "@sites2\n";
print "===========替换数组元素===========\n";
#Perl 中数组元素替换使用 splice() 函数,splice() 函数可以在数组中删除指定位置的元素,并在该位置插入新的元素。其语法如下:
#splice(@array, offset, length, list)
#其中,@array 是要操作的数组,offset 是要删除或替换的元素的起始位置,length 是要删除的元素数量,list 是要插入的新元素列表。
@nums = (1..20);
print "替换前 - @nums\n";
#从第6个元素开始替换数组中的5个元素,替换为21到25的数字
splice(@nums, 5, 5, 21..25);
print "替换后 - @nums\n";
print "===========将字符串转换为数组===========\n";
#Perl 中将字符串转换为数组使用 split() 函数,split() 函数可以根据指定的分隔符将字符串分割成一个数组。其语法如下:
#split(/PATTERN/, EXPR, LIMIT)
#其中,/PATTERN/ 是要使用的正则表达式模式,EXPR 是要分割的字符串,LIMIT 是一个可选参数,指定返回的最大字段数。如果省略 LIMIT,则返回所有字段。
# 定义字符串
$var_test = "runoob";
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
# 字符串转为数组
@test = split('', $var_test);
@string = split('-', $var_string);
@names = split(',', $var_names);
print "$test[3]\n"; # 输出 o
print "$string[2]\n"; # 输出 com
print "$names[3]\n"; # 输出 weibo
print "===========将数组转换为字符串===========\n";
#Perl 中将数组转换为字符串使用 join() 函数,join() 函数可以将一个数组的元素连接成一个字符串,并使用指定的分隔符分隔每个元素。其语法如下:
#join(EXPR, LIST)
#其中,EXPR 是要使用的分隔符,LIST 是要连接的数组或列表。
# 定义字符串
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
# 字符串转为数组
@string = split('-', $var_string);
@names = split(',', $var_names);
# 数组转为字符串
$string1 = join( '-', @string );
$string2 = join( ',', @names );
print "$string1\n";
print "$string2\n";
print "===========数组排序===========\n";
#Perl 中数组排序使用 sort() 函数,sort() 函数可以对一个数组进行排序,并返回一个新的排序后的数组。其语法如下:
#sort BLOCK LIST
#其中,BLOCK 是一个可选的代码块,用于指定排序的比较方式,LIST 是要排序的数组或列表。如果省略 BLOCK,则默认使用字符串比较进行排序。
# 定义数组
@sites = qw/google taobao runoob facebook/; #数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。
print "排序前: @sites\n";
# 对数组进行排序
@sites = sort(@sites);
print "排序后: @sites\n";
print "===========合并数组===========\n";
@numbers = (1,3,(4,5,6));
print "numbers = @numbers\n";
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers = (@odd, @even);
print "numbers = @numbers\n";
print "---------------------------------------\n\n";
#哈希
print "===========哈希相关===========\n";
#创建哈希
#方法一:为每个 key 设置 value
$data{'google'} = 'google.com';
$data{'runoob'} = 'runoob.com';
$data{'taobao'} = 'taobao.com';
#方法二:使用列表创建哈希
#列表中第一个元素为 key,第二个为 value。
%data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');
#也可以使用 => 符号来设置 key/value:
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
#以下实例是上面实例的变种,使用 - 来代替引号:
%data = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com');
#使用这种方式 key 不能出现空格,读取元素方式为:
$val = $data{-google};
$val = $data{-runoob};
#访问哈希元素
print "\$data{'google'} = $data{'google'}\n";
print "\$data{'runoob'} = $data{'runoob'}\n";
print "\$data{'taobao'} = $data{'taobao'}\n";
print "===========读取哈希值==========\n";
#你可以像数组一样从哈希中提取值。哈希值提取到数组语法格式:@{key1,key2}。
%data = (-taobao => 45, -google => 30, -runoob => 40);
@array = @data{-taobao, -runoob};
print "Array : @array\n";
print "===========读取哈希的 key 和 value==========\n";
#我们可以使用 keys 函数读取哈希所有的键,语法格式:keys %hash。
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@names = keys %data;
print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";
#类似的我们可以使用 values 函数来读取哈希所有的值,语法格式:values %hash。
@urls = values %data;
print "$urls[0]\n";
print "$urls[1]\n";
print "$urls[2]\n";
print "===========检测元素是否存在==========\n";
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
if( exists($data{'facebook'} ) ){
print "facebook 的网址为 $data{'facebook'} \n";
}
else
{
print "facebook 键不存在\n";
}
print "===========获取哈希大小==========\n";
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@keys = keys %data;
$size = @keys;
print "1 - 哈希大小: $size\n";
@values = values %data;
$size = @values;
print "2 - 哈希大小: $size\n";
print "===========哈希中添加或删除元素==========\n";
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@keys = keys %data;
$size = @keys;
print "1 - 哈希大小: $size\n";
# 添加元素
$data{'facebook'} = 'facebook.com';
@keys = keys %data;
$size = @keys;
print "2 - 哈希大小: $size\n";
# 删除哈希中的元素
delete $data{'taobao'};
@keys = keys %data;
$size = @keys;
print "3 - 哈希大小: $size\n";
print "===========遍历哈希==========\n";
foreach $key (keys %data){
print "$key: $data{$key}\n";
}
print "---------------------------------------\n";
while(($key, $value) = each(%data)){
print "$key: $value\n";
}运行结果: