Perl
+ -

Perl 数组

2019-09-09 2 0

Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。

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

实例

#!/usr/bin/perl
@hits = (25, 30, 40);             
@names = ("google", "bytekits", "taobao");
print "\$hits[0] = $hits[0]\n";
print "\$hits[1] = $hits[1]\n";
print "\$hits[2] = $hits[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

程序中 $ 符号使用了 \ 来转义,让他原样输出。

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

$hits[0] = 25
$hits[1] = 30
$hits[2] = 40
$names[0] = google
$names[1] = bytekits
$names[2] = taobao

创建数组

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

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

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

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

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

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

访问数组元素

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

实例

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

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

google
taobao
bytekits
bytekits

数组索引值从 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 即是一个输出函数。

下表列出了数组中常用的操作函数:

序号 类型和描述
1 push @ARRAY, LIST将列表的值放到数组的末尾
2 pop @ARRAY弹出数组最后一个值,并返回它
3 shift @ARRAY弹出数组第一个值,并返回它。数组的索引值也依次减一。
4 unshift @ARRAY, LIST将列表放在数组前面,并返回新数组的元素个数。

实例

#!/usr/bin/perl
# 创建一个简单是数组
@sites = ("google","bytekits","taobao");
print "1. \@sites  = @sites\n";
# 在数组结尾添加一个元素
push(@sites, "baidu");
print "2. \@sites  = @sites\n";
# 在数组开头添加一个元素
unshift(@sites, "weibo");
print "3. \@sites  = @sites\n";
# 删除数组末尾的元素
pop(@sites);
print "4. \@sites  = @sites\n";
# 移除数组开头的元素
shift(@sites);
print "5. \@sites  = @sites\n";

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

1. @sites  = google bytekits taobao
2. @sites  = google bytekits taobao baidu
3. @sites  = weibo google bytekits taobao baidu
4. @sites  = weibo google bytekits taobao
5. @sites  = google bytekits taobao

切割数组

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

实例

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

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

weibo qq facebook

数组索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。

如果是连续的索引,可以使用 .. 来表示指定范围:

实例

#!/usr/bin/perl
@sites = qw/google taobao bytekits 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 = "bytekits";
$var_string = "www-bytekits-com";
$var_names = "google,taobao,bytekits,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

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

e
com
weibo

将数组转换为字符串

Perl 中将数组转换为字符串使用 join() 函数,语法格式如下:

join EXPR, LIST

参数说明:

  • EXPR:连接符。
  • LIST:列表或数组。

实例

#!/usr/bin/perl
# 定义字符串
$var_string = "www-bytekits-com";
$var_names = "google,taobao,bytekits,weibo";
# 字符串转为数组
@string = split('-', $var_string);
@names  = split(',', $var_names);
# 数组转为字符串
$string1 = join( '-', @string );
$string2 = join( ',', @names );
print "$string1\n";
print "$string2\n";

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

www-bytekits-com
google,taobao,bytekits,weibo

数组排序

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

sort [ SUBROUTINE ] LIST

参数说明:

  • SUBROUTINE:指定规则。
  • LIST:列表或数组。

实例

#!/usr/bin/perl
# 定义数组
@sites = qw(google taobao bytekits facebook);
print "排序前: @sites\n";
# 对数组进行排序
@sites = sort(@sites);
print "排序后: @sites\n";

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

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

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


特殊变量: $[

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

实例

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

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

网站: google taobao bytekits 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"

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

var 的值为 = 1

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

实例

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

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

list 的值 = 4 3 2

0 篇笔记 写笔记

C++ 指针vs数组
指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:#include using namespace std;const int MAX = 3;int ma......
C# 索引器(Indexer)
索引器(Indexer) 允许一个对象可以像数组一样被索引。当您为类定义一个索引器时,该类的行为就会像一个 虚 拟数组(virtualarray) 一样。您可以使用数组访问运算符([ ])来访问该类的实例。语法一维索引器的语法如下:element-type this[int index] { /......
Perl 引用
引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。创建引用定义变量的时候,在变量名前面加个,就得到了这个变量的一个引用,比如:$scalarref = $foo; # 标量变量引用$arrayref = @ARG......
MongoDB 覆盖索引查询
官方的MongoDB的文档中说明,覆盖查询是以下的查询:所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取......
Perl POD 文档
Perl 中可以在模块或脚本中嵌入 POD(Plain Old Documentation) 文档。POD 是一种简单而易用的标记型语言(置标语言)。POD 文档使用规则:POD 文档以 =head1 开始, =cut 结束, =head1 前与 =cut 后添加一空行。Perl 会忽略 POD 中......
Ruby 方法
Ruby 方法与其他编程语言中的函数类似。Ruby 方法用于捆绑一个或多个重复的语句到一个单元中。方法名应以小写字母开头。如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常量,从而导致不正确地解析调用。方法应在调用之前定义,否则 Ruby 会产生未定义的方法调用异常。语法def metho......
Perl 简介
Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。Perl语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。Pe......
Perl 面向对象
Perl 中有两种不同地面向对象编程的实现:一是基于匿名哈希表的方式,每个对象实例的实质就是一个指向匿名哈希表的引用。在这个匿名哈希表中,存储来所有的实例属性。二是基于数组的方式,在定义一个类的时候,我们将为每一个实例属性创建一个数组,而每一个对象实例的实质就是一个指向这些数组中某一行索引的引用。在......
Python3 运算符
本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子中, 4 和 5 被称为 操 作数,”+ “ 称为运算符。Python语言支持以下类型的运算符:算术运算符比较(关系)运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级接下来让我们一个个来学习Python的......
PHP 关联数组
PHP允许在PHP中使用=>符号将名称/标签与每个数组元素相关联。使用这种方式,可以很容易记住元素,因为每个元素由标号表示一个递增的数字。定义有两种方法来定义关联数组:第一种方式:$salary=array("Hema"=>"550000",&qu......
Java rint() 方法
rint() 方法返回最接近参数的整数值。语法该方法有以下几种语法格式:double rint(double d)参数double 原始数据类型。返回值返回 double 类型数组,是最接近参数的整数值。实例实例public class Test{ public static void mai......
C# 多维数组
C# 支持多维数组。多维数组又称为矩形数组。您可以声明一个 string 变量的二维数组,如下:string [,] names;或者,您可以声明一个 int 变量的三维数组,如下:int [ , , ] m;二维数组多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。一个......
MySQL PHP语法
MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,Mysql在PHP的web开发中是应用最广泛。在本教程中我们大部分实例都采用了 PHP 语言。如果你想了解 Mysql 在 PHP 中的应用,可以访问我们的 PHP教程。PHP提供了多种方式来访问和......
C++ 指向数组的指针
您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中:double balance[50];balance 是一个指向 &balance[0] ......
Ruby 变量
/ruby/ruby-variable.html变量是持有可被任何程序使用的任何数据的存储位置。Ruby 支持五种类型的变量。一般小写字母、下划线开头:变量(Variable)。$ 开头:全局变量(Global variable)。@ 开头:实例变量(Instance variable)。@@ 开头......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!