1.2 数组
1.2.4 切割数组
跟python 的列表一致,指定有效的索引值切割,可以用逗号分割,如果是连续的索引,可以用.. 来表示指定范围
@sites2 = @sites[3,4,5];
@sites2 = @sites[3..5];
1.2.5 替换数组元素
数组元素替换用splice()函数
splice(@nums, 5, 4, 21..24);
指第5位元素(从1开始数)替换4个元素,新的元素为21到24
1.2.6 将字符串转换为数组
类似python中的字符串转换为列表,用split()函数
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
参数说明:
PATTERN:分隔符,默认为空格。
EXPR:指定字符串数。
LIMIT:如果指定该参数,则返回该数组的元素个数。(一开始对于这个参数不是很理解,测试之后发现,这个参数为数字,这个数字表示你希望返回数组的元素是几个,如果不给该参数,则不限制)
#!/usr/bin/perl
# 定义字符串
$var_test = "runoob";
# 字符串转为数组
@test = split('', $var_test);
@test1 = split('', $var_test, 3);
@test2 = split('', $var_test, 4);
print "@test\n"; # 输出 数组
print "@test1\n"; # 输出 数组
print "@test2\n"; # 输出 数组
执行以上程序,输出结果为:
r u n o o b
r u noob
r u n oob
1.2.7 将数组转换为字符串
跟python的列表转换为字符串一样,
$string2 = join( ',', @names );
1.2.8 数组排序
跟python列表排序一致
@sites = sort(@sites);
注意:数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。
1.2.9 合并数组
数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下所示:
实例
#!/usr/bin/perl
@numbers1 = (1,3,(4,5,6));
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers2 = (@odd, @even);
print "numbers = @numbers1\n";
print "numbers = @numbers2\n";
执行以上程序,输出结果为:
numbers1 = 1 3 4 5 6
numbers = 1 3 5 2 4 6
1.3 哈希
哈希 % 开始,哈希是一个key/values 对的集合,访问哈希元素格式:${key}。
%data = ('google', 45, 'runoob', 30, 'taobao', 40);
print "\$data{'google'} = $data{'google'}\n";
输出结果为:
$data{'google'} = 45
这里可以看出跟python中的字典类似。
1.3.1 创建哈希
#!/usr/bin/perl
$data{'google'} = 'google.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'); #也可以使用 => 符号来设置 key/value
%data = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com'); #使用 - 来代替引号,使用这种方式 key 不能出现空格,读取元素方式为:
$val = $data{-google}
$val = $data{-runoob}
1.3.2 读取哈希值
你可以像数组一样从哈希中提取值。
哈希值提取到数组语法格式:@{key1,key2}。
实例
#!/uer/bin/perl
%data = (-taobao => 45, -google => 30, -runoob => 40);
@array = @data{-taobao, -runoob}; #从哈希中提取值
print "Array : @array\n";
@names = keys %data;#读取所有key, keys %HASH, 该函数返回所有哈希的所有 key 的数组。
print "@names\n";
@urls = values %data; #values %HASH,该函数返回所有哈希的所有 value 的数组。
print "@urls\n";
执行以上程序,输出结果为:
Array : 45 40
-google -taobao -runoob
30 45 40
1.3.3 检测元素是否存在
如果你在哈希中读取不存在的 key/value 对 ,会返回 undefined 值,且在执行时会有警告提醒。
为了避免这种情况,我们可以使用 exists 函数来判断key是否存在,存在的时候读取:
实例
#!/usr/bin/perl
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
if( exists($data{'facebook'} ) ){
print "facebook 的网址为 $data{'facebook'} \n";
}
else
{
print "facebook 键不存在\n";
}
执行以上程序,输出结果为:
facebook 键不存在
1.3.4 获取哈希大小与哈希中添加或删除元素
哈希大小为元素的个数,我们可以通过先获取 key 或 value 的所有元素数组,再计算数组元素多少来获取哈希的大小,添加 key/value 对可以通过简单的赋值来完成。但是删除哈希元素你需要使用 delete 函数,实例如下:
#!/usr/bin/perl
%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";
# 添加元素
$data{'facebook'} = 'facebook.com';
@keys = keys %data;
$size = @keys;
print "3 - 哈希大小: $size\n";
# 删除哈希中的元素
delete $data{'taobao'};
@keys = keys %data;
$size = @keys;
print "4 - 哈希大小: $size\n";
执行以上程序,输出结果为:
1 - 哈希大小: 3
2 - 哈希大小: 3
3 - 哈希大小: 4
4 - 哈希大小: 3
1.4 变量的上下文
perl 为每个变量类型设置了独立的命令空间,所以不同类型的变量可以使用相同的名称,不用担心冲突。
所谓上下文:指的是表达式所在的位置。
举例如下:
#!/usr/bin/perl
@names = ('google', 'runoob', 'taobao');
@copy = @names; # 复制数组
$size = @names; # 数组赋值给标量,返回数组元素个数
print "名字为 : @copy\n";
print "名字数为 : $size\n";
以上程序执行输出结果为:
名字为 : google runoob taobao
名字数为 : 3
代码中 @names 是一个数组,它应用在了两个不同的上下文中。第一个将其复制给另外一个数组,所以它输出了数组的所有元素。第二个我们将数组赋值给一个标量,它返回了数组的元素个数。