一、Perl数据类型


Perl的三个基本的数据类型:标量、数组、哈希。

  • 标量 $ 开始, 如$a $b 是两个标量。
  • 数组 @ 开始 , 如 @a @b 是两个数组。
  • 哈希 % 开始 , %a %b 是两个哈希。

Perl变量

创建变量

变量不需要显式声明类型,在变量赋值后,解释器会自动分配匹配的类型空间。
变量使用等号(=)来赋值。
等号左边为变量,右边为值。

$age = 25;             # 整型
$name = "runoob";      # 字符串
$salary = 1445.50;     # 浮点数

Perl标量

标量是一个单一的数据单元。 数据可以是整数,浮点数,字符,字符串,段落等。简单的说它可以是任何东西。以下是标量的简单应用:

#!/usr/bin/perl
 
$age = 25;             # 整型
$name = "runoob";      # 字符串
$salary = 1445.50;     # 浮点数
 
print "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";

以上程序执行输出结果为:

Age = 25
Name = runoob
Salary = 1445.5

数字标量

标量通常是一个数字或字符串,以下实例演示了不同类型的数字标量的使用:

#!/usr/bin/perl
 
$integer = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;
 
# 八进制 377 , 十进制为 255 
$octal = 0377;
 
# 十六进制 FF, 十进制为 255 
$hexa = 0xff;
 
print "integer = $integer\n";
print "negative = $negative\n";
print "floating = $floating\n";
print "bigfloat = $bigfloat\n";
print "octal = $octal\n";
print "hexa = $hexa\n";

执行以上程序,输出结果为

integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255

字符串标量

以下实例演示了不同类型的字符串标量的使用,注意单引号和双引号的使用区别:

#!/usr/bin/perl
 
$var = "字符串标量 - 菜鸟教程!";
$quote = '我在单引号内 - $var';
$double = "我在双引号内 - $var";
 
$escape = "转义字符使用 -\tHello, World!";
 
print "var = $var\n";
print "quote = $quote\n";
print "double = $double\n";
print "escape = $escape\n";

执行以上程序,输出结果为:

var = 字符串标量 - 菜鸟教程!
quote = 我在单引号内 - $var
double = 我在双引号内 - 字符串标量 - 菜鸟教程!
escape = 转义字符使用 -    Hello, World!

标量运算

以下实例演示了标量的简单运算:

#!/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

多行字符串

我们可以使用单引号来输出多行字符串,如下所示:

#!/usr/bin/perl
 
$string = '
123
    —— 456!
';
 
print "$string\n";

执行以上程序,输出结果为:

123
    —— 456

你也可以使用 “here” document 的语法格式来输出多行:

#!/usr/bin/perl
 
print <<EOF;
123
    —— 456!
EOF

执行以上程序,输出结果为:

123
    —— 456

特殊字符

以下我们将演示 Perl 中特殊字符的应用,如 FILE, LINE, 和 PACKAGE 分别表示当前执行脚本的文件名,行号,包名。

注意: __ 是两条下划线,FILE 前后各两条下划线。

这些特殊字符是单独的标记,不能写在字符串中,例如:

#!/usr/bin/perl
 
print "文件名 ". __FILE__ . "\n";
print "行号 " . __LINE__ ."\n";
print "包名 " . __PACKAGE__ ."\n";
 
# 无法解析
print "__FILE__ __LINE__ __PACKAGE__\n";

执行以上程序,输出结果为:

文件名 test.pl
行号 4
包名 main
__FILE__ __LINE__ __PACKAGE__

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 = &#x263a;
foo = foo
martin = Martin

Perl数组

数组是用于存储一个有序的标量值的变量。

数组 @ 开始。

要访问数组的变量,可以使用美元符号($)+变量名,并指定下标来访问,实例如下所示:

#!/usr/bin/perl
 
@ages = (25, 30, 40);             
@names = ("google", "runoob", "taobao");
 
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";

以上程序执行输出结果为:

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = google
$names[1] = runoob
$names[2] = taobao

程序中我们在 $ 标记前使用了转义字符 () ,这样才能输出字符 $。

创建数组

数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组。

@array = (1, 2, 'Hello');
@array = qw/这是 一个 数组/;

第二个数组使用 qw// 运算符,它返回字符串列表,数组元素以空格分隔。当然也可以使用多行来定义数组:

@days = qw/google
taobao
...
runoob/;

你也可以按索引来给数组赋值,如下所示:

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

访问数组元素

访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:

@sites = qw/google taobao runoob/;
 
print "$sites[0]\n";
print "$sites[1]\n";
print "$sites[2]\n";
print "$sites[-1]\n";    # 负数,反向读取

执行以上程序,输出结果为:

google
taobao
runoob
runoob

数组索引值从 0 开始,即 0 为第一个元素,1 为第二个元素,以此类推。
负数从反向开始读取,-1 为第一个元素, -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

数组大小

数组大小由数组中的标量上下文决定。:

@array = (1,2,3);
print "数组大小: ",标量 @array,"\n";

数组长度返回的是数组物理大小,而不是元素的个数,我们可以看以下实例:

#!/uer/bin/perl
 
@array = (1,2,3);
$array[50] = 4;
 
$size = @array;
$max_index = $#array;
 
print "数组大小:  $size\n";
print "最大索引: $max_index\n";

执行以上程序,输出结果为:

数组大小:  51
最大索引: 50

从输出的结果可以看出,数组元素只有四个,但是数组大小为 51。

添加和删除数组元素

Perl 提供了一些有用的函数来添加和删除数组元素。
如果你之前没有编程经验,可能会问什么是函数,其实我们之前使用的 print 即是一个输出函数。
下表列出了数组中常用的操作函数:

序号内容和描述
1push @ARRAY, LIST 将列表的值放到数组的末尾
2pop @ARRAY 删除数组的最后一个值
3shift @ARRAY 弹出数组第一个值,并返回它。数组的索引值也依次减一
4unshift @ARRAY, LIST 将列表放在数组前面,并返回新数组的元素个数
#!/usr/bin/perl
 
# 创建一个简单是数组
@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";

执行以上程序,输出结果为:

在这里插入图片描述

切割数组

我们可以切割一个数组,并返回切割后的新数组:

#!/usr/bin/perl
 
@sites = qw/google taobao runoob weibo qq facebook 网易/;
 
@sites2 = @sites[3,4,5];
 
print "@sites2\n";

执行以上程序,输出结果为:

weibo qq facebook

数组索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。
如果是连续的索引,可以使用 … 来表示指定范围:

#!/usr/bin/perl
 
@sites = qw/google taobao runoob weibo qq facebook 网易/;
 
@sites2 = @sites[3..5];
 
print "@sites2\n";

执行以上程序,输出结果为:

weibo qq facebook

替换数组元素

Perl 中数组元素替换使用 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";

执行以上程序,输出结果为:

替换前 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
替换后 - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

将字符串转换为数组

Perl 中将字符串转换为数组使用 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

执行以上程序,输出结果为:

o
com
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";

执行以上程序,输出结果为:

www-runoob-com
google,taobao,runoob,weibo

数组排序

Perl 中数组排序使用 sort() 函数,语法格式如下:

sort [ SUBROUTINE ] LIST

参数说明:

  • SUBROUTINE:指定规则。
  • LIST:列表或数组。
#!/usr/bin/perl
 
# 定义数组
@sites = qw(google taobao runoob facebook);
print "排序前: @sites\n";
 
# 对数组进行排序
@sites = sort(@sites);
print "排序后: @sites\n";

执行以上程序,输出结果为:

排序前: google taobao runoob facebook
排序后: facebook google runoob taobao

注意:数组排序是根据 ASCII 数字值来排序。所以我们在对数组进行排序时最好先将每个元素转换为小写后再排序。

特殊变量: $[

特殊变量 $[ 表示数组的第一索引值,一般都为 0 ,如果我们将 $[ 设置为 1,则数组的第一个索引值即为 1,第二个为 2,以此类推。实例如下:

#!/usr/bin/perl
 
# 定义数组
@sites = qw(google taobao runoob facebook);
print "网站: @sites\n";
 
# 设置数组的第一个索引为 1
$[ = 1;
 
print "\@sites[1]: $sites[1]\n";
print "\@sites[2]: $sites[2]\n";

执行以上程序,输出结果为:

网站: google taobao runoob facebook
@sites[1]: google
@sites[2]: taobao

一般情况我们不建议使用特殊变量 $[,在新版 Perl 中,该变量已废弃。

合并数组

数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下所示:

#!/usr/bin/perl
 
@numbers = (1,3,(4,5,6));
 
print "numbers = @numbers\n";

执行以上程序,输出结果为:

numbers = 1 3 4 5 6

也可以在数组中嵌入多个数组,并合并到主数组中:

#!/usr/bin/perl
 
@odd = (1,3,5);
@even = (2, 4, 6);
 
@numbers = (@odd, @even);
 
print "numbers = @numbers\n";

执行以上程序,输出结果为:

numbers = 1 3 5 2 4 6

从列表中选择元素

一个列表可以当作一个数组使用,在列表后指定索引值可以读取指定的元素,如下所示:

#!/usr/bin/perl
 
$var = (5,4,3,2,1)[4];
 
print "var 的值为 = $var\n"
```perl
执行以上程序,输出结果为:
```perl
var 的值为 = 1

同样我们可以在数组中使用 … 来读取指定范围的元素:

#!/usr/bin/perl
 
@list = (5,4,3,2,1)[1..3];
 
print "list 的值 = @list\n";

执行以上程序,输出结果为:

list 的值 = 4 3 2

Perl哈希

哈希是一个 key/value 对的集合。
哈希 % 开始。
如果要访问哈希值,可以使用 $ + {key} 格式来访问:

#!/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

创建哈希

创建哈希可以通过以下两种方式:

一、为每个 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 不能出现空格,读取元素方式为:

```perl
$val = $data{-google}
$val = $data{-runoob}

访问哈希元素

访问哈希元素格式:${key},实例如下:

#!/usr/bin/perl
 
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
 
print "\$data{'google'} = $data{'google'}\n";
print "\$data{'runoob'} = $data{'runoob'}\n";
print "\$data{'taobao'} = $data{'taobao'}\n";

执行以上程序,输出结果为:
在这里插入图片描述

读取哈希值

你可以像数组一样从哈希中提取值。
哈希值提取到数组语法格式:@{key1,key2}。

#!/uer/bin/perl
 
%data = (-taobao => 45, -google => 30, -runoob => 40);
 
@array = @data{-taobao, -runoob};
 
print "Array : @array\n";

执行以上程序,输出结果为:

Array : 45 40

读取哈希的 key 和 value

读取所有key
我们可以使用 keys 函数读取哈希所有的键,语法格式如下:

keys %HASH

该函数返回所有哈希的所有 key 的数组。

#!/usr/bin/perl 
 
%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";

执行以上程序,输出结果为:

taobao
google
runoob

类似的我们可以使用 values 函数来读取哈希所有的值,语法格式如下:

values %HASH

该函数返回所有哈希的所有 value 的数组。

#!/usr/bin/perl 
 
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
 
@urls = values %data;
 
print "$urls[0]\n";
print "$urls[1]\n";
print "$urls[2]\n";

执行以上程序,输出结果为:

taobao.com
runoob.com
google.com

检测元素是否存在

如果你在哈希中读取不存在的 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 键不存在

以上代码中我们使用了 IF…ELSE 语句,在后面的章节我们会具体介绍。

获取哈希大小

哈希大小为元素的个数,我们可以通过先获取 key 或 value 的所有元素数组,再计算数组元素多少来获取哈希的大小,实例如下:

#!/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";

执行以上程序,输出结果为:

1 - 哈希大小: 3
2 - 哈希大小: 3

哈希中添加或删除元素

添加 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"; ```
# 添加元素
$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";

执行以上程序,输出结果为:

1 - 哈希大小: 3
2 - 哈希大小: 4
3 - 哈希大小: 3

迭代哈希

我们可以使用 foreach 和 while 来迭代哈希:
实例 - 使用 foreach

#!/usr/bin/perl
 
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
foreach $key (keys %data){
    print "$data{$key}\n";
}

实例 - 使用 while

#!/usr/bin/perl
 
%data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');
while(($key, $value) = each(%data)){
    print "$data{$key}\n";
}

执行以上程序,输出结果为:

runoob.com
google.com
taobao.com

变量上下文

所谓上下文:指的是表达式所在的位置。

上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文。

Perl 解释器会根据上下文来决定变量的类型。实例如下:

#!/usr/bin/perl
 
@names = ('google', 'runoob', 'taobao');
 
@copy = @names;   # 复制数组
$size = @names;   # 数组赋值给标量,返回数组元素个数
 
print "名字为 : @copy\n";
print "名字数为 : $size\n";
#!/usr/bin/perl
 
@names = ('google', 'runoob', 'taobao');
 
@copy = @names;   # 复制数组
$size = @names;   # 数组赋值给标量,返回数组元素个数
 
print "名字为 : @copy\n";
print "名字数为 : $size\n";

以上程序执行输出结果为:

名字为 : google runoob taobao
名字数为 : 3

代码中 @names 是一个数组,它应用在了两个不同的上下文中。第一个将其复制给另外一个数组,所以它输出了数组的所有元素。第二个我们将数组赋值给一个标量,它返回了数组的元素个数。

以下列出了多种不同的上下文

序号上下文描述
1标量 − 赋值给一个标量变量,在标量上下文的右侧计算
2列表 − 赋值给一个数组或哈希,在列表上下文的右侧计算。
3布尔 − 布尔上下文是一个简单的表达式计算,查看是否为 true 或 false。
4Void − 这种上下文不需要关系返回什么值,一般不需要返回值。
5插值 − 这种上下文只发生在引号内。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值