文章目录
基本数据类型、数字字面量、变量
1、基本数据类型
标量、数组、哈希
2、数字字面量
整形、浮点数
3、变量
变量是存储在内存
中的数据,创建一个变量即会在内存上开辟一个空间。
解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型、浮点型、字符串等。
上一章节中我们已经为大家介绍了Perl的三个基本的数据类型:标量、数组、哈希。
Perl 为每个变量类型设置了独立的命令空间,所以 不同类型的变量可以使用相同的名称,不用担心会发生冲突。例如 $foo 和 @foo 是两个不同的变量。
变量不需要显式声明类型,在变量赋值后,解释器会自动分配匹配的类型空间。
变量使用等号(=)来赋值。
我们可以在程序中使用 use strict
语句 让所有变量需要强制声明类型。
一、标量 $
标量是 Perl 语言中最简单的一种数据类型,这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。
在使用时在变量的名字前面加上一个 $,表示是标量。例如:
$age = 25; # 整型
$name = "runoob"; # 字符串
$salary = 1445.50; # 浮点数
print "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";
1、整型(被作为浮点数)
Perl 实际上把整数存在你的计算机中的 浮点寄存器
中,所以实际上被当作浮点数看待。
在多数计算机中,浮点寄存器可以存贮约 16 位数字,长于此的被丢弃。整数实为浮点数的特例。
整型变量及运算:
$x = 12345;
if (1217 + 116 == 1333) {
# 执行代码语句块
}
print "integer = $x\n";
8 进制和 16 进制数
8 进制以 0 开始,16 进制以 0x 开始。例如:
$var1 = 047; # 等于十进制的39
$var2 = 0x1f; # 等于十进制的31
print "octal = $var1\n"; # 39
print "hexa = $var2\n"; # 31
2、浮点数
浮点数数据如:11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03。
浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。
指数的范围通常为 -309 到 +308。
实例
#!/usr/bin/perl
$value = 9.01e+21 + 0.01 - 9.01e+21;
print ("第一个值为:", $value, "\n");
$value = 9.01e+21 - 9.01e+21 + 0.01;
print ("第二个值为:", $value, "\n");
执行以上程序,输出结果为:
第一个值为:0
第二个值为:0.01
3、字符串
Perl 中的字符串使用一个标量来表示,定义方式和 c 很像。
但是在 Perl 里面字符串不是用 \0
来表示结束的。
字符串中使用单双引号的区别,可见文章上方内容。
示例:
#!/usr/bin/perl
# 换行 \n 位于双引号内,有效
$str = "菜鸟教程 \nwww.runoob.com";
print "$str\n";
# 换行 \n 位于单引号内,无效
$str = '菜鸟教程 \nwww.runoob.com';
print "$str\n";
# 只有 R 会转换为大写
$str = "\urunoob";
print "$str\n";
# 所有的字母都会转换为大写
$str = "\Urunoob";
print "$str\n";
# 指定部分会转换为大写
$str = "Welcome to \Urunoob\E.com!";
print "$str\n";
# 将到\E为止的非单词(non-word)字符加上反斜线
$str = "\QWelcome to runoob's family";
print "$str\n";
4、v 字符串
一个以 v 开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。
当你想为每个字符 直接声明其数字值时,v-字串提供了一种更清晰的构造这类字串的方法。
而不像 \x{1}\x{14}\x{12c}\x{fa0}
这种不易于理解。
我们可以看下面的实例:
#!/usr/bin/perl
$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";
执行以上程序,输出结果为:
Wide character in print at test.pl line 7.
smile = ☺
foo = foo
martin = Martin
5、运算
#!/usr/bin/perl
$str = "hello" . "world"; # 字符串连接
$num = 5 + 10; # 两数相加
$mul = 4 * 5; # 两数相乘
$mix = $str . $num; # 连接字符串和数字
print "str = $str\n";
print "num = $num\n";
print "mix = $mix\n";
执行以上程序,输出结果为:
str = helloworld
num = 15
mix = helloworld15
二、数组 @
数组是用于存储一个有序
的标量值的变量,索引从 0 开始。使用 @ 开始。也可以以 qw 开始定义数组。
要访问数组的变量,可以使用美元符号 $
+ 变量名,并指定下标来访问,实例如下所示:
1、数组常用创建和遍历
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("google", "runoob", "taobao");
@array = qw/这是 一个 数组/; # 返回字符串列表,数组元素以空格分隔
@days = qw/google
taobao
...
runoob/;
# 使用索引来给数组赋值
$array[0] = 'Monday';
print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
print "$names[-1]\n"; # taobao
以上程序执行输出结果为:
$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = google
$names[1] = runoob
$names[2] = taobao
程序中我们在 $
标记前使用了转义字符 \
,这样才能输出字符 $
。
2、数组序列号
Perl 提供了可以按序列输出的数组形式,格式为 起始值 + … + 结束值,实例如下:
#!/usr/bin/perl
@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
执行以上程序,输出结果为:
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z
3、数组个数和物理大小
数组长度返回的是数组物理大小,而不是元素的个数;
数组大小由数组中的标量上下文决定:
@array = (1,2,3);
$array[50] = 4;
$size = @array;
$max_index = $#array;
$new_size = @array ; # 3 数组个数
print "数组大小: $size\n"; # 51
print "最大索引: $max_index\n"; # 50
4、添加和删除数组元素
数组常用操作函数
序号 | 类型 | 描述 |
---|---|---|
1 | push @ARRAY, LIST | 将列表的值放到数组的末尾 |
2 | pop @ARRAY | 删除数组的最后一个值 |
3 | shift @ARRAY | 弹出数组第一个值,并返回它。数组的索引值也依次减一。 |
4 | unshift @ARRAY, LIST | 将列表放在数组前面,并返回新数组的元素个数。 |
#!/usr/bin/perl
# 创建一个简单是数组
@sites = ("google","runoob","taobao");
$new_size = @sites ;
print "1. \@sites = @sites\n"."原数组长度 :$new_size\n"; # 3
# 在数组结尾添加一个元素
$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"; # weibo
5、切割数组
索引从 0 开始;
索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。
如果是连续的索引,可以使用 … 来表示指定范围
@sites = qw/google taobao runoob weibo qq facebook 网易/;
@sites2 = @sites[3,4,5];
print "@sites2\n"; # weibo qq facebook
6、替换数组元素
Perl 中数组元素替换使用 splice() 函数,语法格式如下:
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
参数说明:
- @ARRAY:要替换的数组。
- OFFSET:起始位置。
- LENGTH:替换的元素个数。
- LIST:替换元素列表。
@nums = (1..20); # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 从第6个元素开始替换数组中的5个元素
splice(@nums, 5, 5, 21..25);
# 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
7、字符串转换为数组
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
8、数组转字符串
使用 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"; # www-runoob-com
print "$string2\n"; # google,taobao,runoob,weibo
9、数组排序
根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。
sort [ SUBROUTINE ] LIST
参数说明:
- SUBROUTINE:指定规则。
- LIST:列表或数组。
@sites = qw(google taobao runoob facebook);
@sites = sort(@sites); # facebook google runoob taobao
10、合并数组
@numbers = (1,3,(4,5,6)); # 1 3 4 5 6
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers = (@odd, @even); # 1 3 5 2 4 6
11、从列表中选择元素
一个列表可以当作一个数组使用,在列表后指定索引值可以读取指定的元素
$var = (5,4,3,2,1)[4]; # 1
@list = (5,4,3,2,1)[1..3]; # 4 3 2
三、哈希 %
哈希是一个 key/value 对的集合。使用 %
标记开始。
使用 $ + {key}
格式来访问哈希值。
1、简单使用
#!/usr/bin/perl
%data = ('google', 45, 'runoob', 30, 'taobao', 40);
print "\$data{'google'} = $data{'google'}\n";
print "\$data{'runoob'} = $data{'runoob'}\n";
print "\$data{'taobao'} = $data{'taobao'}\n";
以上程序执行输出结果为:
$data{'google'} = 45
$data{'runoob'} = 30
$data{'taobao'} = 40
2、创建哈希
1) 为每个 key 设置 value
$data{'google'} = 'google.com';
$data{'runoob'} = 'runoob.com';
$data{'taobao'} = 'taobao.com';
2) 通过列表设置
使用这种方式 key 不能出现空格
# 列表中第一个元素为 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');
# 读取元素
$val = $data{-google}
$val = $data{-runoob}
3、读取哈希
可以像数组一样从哈希中提取值。
哈希值提取到数组语法格式:@{key1,key2}
。
%data = (-taobao => 45, -google => 30, -runoob => 40);
@array = @data{-taobao, -runoob};
print "Array : @array\n"; # 45 40
# 使用 keys 函数读取哈希所有的 keys, 返回所有 key 的数组。
# keys %HASH
@names = keys %data;
# 使用 values 函数来读取哈希所有的值
@urls = values %data;
4、检测元素是否存在 exists
如果你在哈希中读取不存在的 key/value 对 ,会返回 undefined
值,且在执行时会有警告提醒。
为了避免这种情况,我们可以使用 exists
函数来判断key是否存在。存在的时候读取:
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
if( exists($data{'facebook'} ) ){
print "facebook 的网址为 $data{'facebook'} \n";
}
else
{
print "facebook 键不存在\n";
}
5、获取哈希大小
哈希大小为元素的个数。
可以通过先获取 key 或 value 的所有元素数组,再计算数组元素多少来获取哈希的大小。
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@keys = keys %data;
$size = @keys;
print "1 - 哈希大小: $size\n"; # 3
@values = values %data;
$size = @values;
print "2 - 哈希大小: $size\n"; # 3
6、增删元素
添加 key/value 对可以通过简单的赋值来完成。
删除哈希元素你需要使用 delete 函数:
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
@keys = keys %data;
$size = @keys; # 3
# 添加元素
$data{'facebook'} = 'facebook.com';
@keys = keys %data;
$size = @keys; # 4
# 删除哈希中的元素
delete $data{'taobao'};
@keys = keys %data;
$size = @keys; # 3
7、迭代
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
foreach $key (keys %data){
print "$data{$key}\n";
}