Perl数据类型
Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型。
Perl 有三个基本的数据类型:标量、数组、哈希:
\表示解析转移字符
标量
标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个 $,表示是标量。例如:
$a=100;
$b="str";
print "a = $a\n";
print "b = $b\n";
数组
数组变量以字符 @ 开头,索引从 0 开始,如:
@arr=(1,2,3)
print "\$arr[0] = $arr[0]\n";
数组序列号:Perl 提供了可以按序列输出的数组形式,格式为 起始值 + .. + 结束值,实例如下:
#!/usr/bin/perl @var_10 = (1..10); @var_20 = (10..20); @var_abc = (a..z);use Data::Dumper; print "@var_10\n"; # 输出 1 到 10 print "@var_20\n"; # 输出 10 到 20 print "@var_abc\n"; # 输出 a 到 z
数组长度:数组长度返回的是数组物理大小,而不是元素的个数。
#!/uer/bin/perl @array = (1,2,3); $array[50] = 4; $size = @array; $max_index = $#array; #数组长度为51,最大下标为50 print "数组长度: $size\n"; # 输出51 print "最大索引: $max_index\n"; # 50
添加和删除数组元素:
Perl 提供了一些有用的函数来添加和删除数组元素。
如果你之前没有编程经验,可能会问什么是函数,其实我们之前使用的 print 即是一个输出函数。
下表列出了数组中常用的操作函数:
序号 | 类型和描述 |
---|---|
1 | push @ARRAY, LIST
将列表的值放到数组的末尾 |
2 | pop @ARRAY
删除数组的最后一个值 |
3 | shift @ARRAY
弹出数组第一个值,并返回它。数组的索引值也依次减一。 |
4 | unshift @ARRAY, LIST
将列表放在数组前面,并返回新数组的元素个数。 |
切割数组:我们可以切割一个数组,并返回切割后的新数组
#!/usr/bin/perl @sites = qw/google taobao runoob weibo qq facebook 网易/; @sites2 = @sites[3,4,5]; print "@sites2\n";
执行以上程序,输出结果为:
weibo qq facebook
替换数组元素:数组元素替换使用 splice() 函数,语法格式如下:
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
参数说明:
- @ARRAY:要替换的数组。
- OFFSET:起始位置。
- LENGTH:替换的元素个数。
- LIST:替换元素列表。
以下实例从第6个元素开始替换数组中的5个元素:
#!/usr/bin/perl @nums = (1..20); print "替换前 - @nums\n"; splice(@nums, 5, 5, 21..25); print "替换后 - @nums\n";
将字符串转换为数组:将字符串转换为数组使用 split() 函数
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
参数说明:
- PATTERN:分隔符,默认为空格。
- EXPR:指定字符串数。
- LIMIT:如果指定该参数,则返回该数组的元素个数。
#!/usr/bin/perl # 定义字符串 $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
将数组转换为字符串:Perl 中将数组转换为字符串使用 join() 函数,语法格式如下:
join EXPR, LIST
参数说明:
- EXPR:连接符。
- LIST:列表或数组。
#!/usr/bin/perl # 定义字符串 $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";
哈希
哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值。哈希变量以字符 % 开头。
#方式1 %h=('a'=>1,'b'=>2); #方式2:第一个为key 第二个为value %data = ('google', 45, 'runoob', 30, 'taobao', 40); print "\$data{'google'} = $data{'google'}\n"; print "\$h{'a'} = $h{'a'}\n"; #为每个key设置value $data{'google'} = 'google.com'; $data{'runoob'} = 'runoob.com'; $data{'taobao'} = 'taobao.com'; #读取部分哈希值 %data = (-taobao => 45, -google => 30, -runoob => 40); @array = @data{-taobao, -runoob}; print "Array : @array\n"; #读取keys @names = keys %data; print "$names[0]\n"; print "$names[1]\n"; print "$names[2]\n"; #读取所有Value值 @urls = values %data; print "$urls[0]\n"; print "$urls[1]\n"; print "$urls[2]\n"; #判断key是否存在:exist函数 if( exists($data{'facebook'} ) ) { print "facebook 的网址为 $data{'facebook'} \n"; } else { print "facebook 键不存在\n"; } #获取哈希大小(元素个数) @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 "2 - 哈希大小: $size\n"; # 删除哈希中的元素 delete $data{'taobao'}; @keys = keys %data; $size = @keys; print "3 - 哈希大小: $size\n"; #迭代哈希 foreach $key (keys %data) { print "$data{$key}\n"; } while(($key, $value) = each(%data)) { print "$data{$key}\n"; }
为未初始化的哈希赋值也可以这样写
my %has1=(); #这样健不能省略引号 #my %has1=(these,are); #为哈希赋值,key可以省略引号 $has1{these}="are"; print "\%has1=$has1{these}";
哈希嵌套哈希
use Data::Dumper;
#哈希嵌套 my %hash; $hash{these}{are}{just}{a}{bunch}{of}{words} = 88; $hash{these}{are}{just}{a}{bunch}{of}{things} = 42; $hash{these}{things} = 33; print Dumper %hash;
输出结果
$VAR1 = 'these';
$VAR2 = {
'are' => {
'just' => {
'a' => {
'bunch' => {
'of' => {
'words' => 88,
'things' => 42
}
}
}
}
},
'things' => 33
};