Perl 列表和数组

Perl 列表和数组,在 Perl 中,人们可以交替使用术语列表和数组,但是存在差异。 列表是数据(标量值的有序集合),数组是保存列表的变量。

如何定义数组?

数组以@符号为前缀。这就是你定义一个数组的方法:

@friends = ("Ajeet", "Chaitanya", "Rahul");

这是包含三个字符串的字符串数组。另一种做法是:

@friends = qw(Ajeet Chaitanya Rahul); #same as above

注意qw代表引用的单词,通过使用qw你可以避免引号并输入更少。

学习 Perl 时,您可能会遇到几个示例,其中您会看到以下类型的数组定义:



@friends = qw/Ajeet Chaitanya Rahul/; #same as above

这是因为 Perl 允许您选择任何标点字符作为分隔符。

以下所有语句均相同:

@friends = qw/Ajeet Chaitanya Rahul/;
@friends = qw!Ajeet Chaitanya Rahul!;
@friends = qw;
@friends = qw{Ajeet Chaitanya Rahul};
@friends = qw[Ajeet Chaitanya Rahul];

注意:开始和结束分隔符必须相同。

访问数组元素

您必须在另一个编程语言中使用过数组,如 C,C++,Java 等。数组的基本概念在这里是相同的。让我们举一个例子来了解如何定义数组以及如何访问它的元素。

#!/usr/bin/perl

@friends = ("Ajeet", "Chaitanya", "Rahul");            

print "\friends[0] =friends[0]\n";
print "\friends[1] =friends[1]\n";
print "\friends[2] =friends[2]\n";

输出:



$friends[0] = Ajeet
$friends[1] = Chaitanya
$friends[2] = Rahul

正如你在上面的程序中看到的那样,数组是用@符号进行的。因为,单个数组元素只是标量,它们是$符号的预设。

范围运算符

范围运算符由双点..表示。此运算符用于创建顺序列表。例如:

#!/usr/bin/perl

@num = (3..9);   # same as (3, 4, 5, 6,  7, 8, 9)
foreach temp (@num) {
   print "temp\n";
}

输出:

3
4
5
6
7
8
9

让我们再看几个例子来理解范围运算符:



(2.9..7.9) # same as (2, 3, 4, 5, 6, 7), values after decimal are truncated
(9..3) # empty list, only works in increasing order
(1, 3..6, 10, 12..14) # same as (1, 3, 4, 5, 6, 10, 12, 13, 14),

运算符:poppush

pop运算符从数组中删除最后一个元素并返回它。让我们举个例子来了解pop运算符的工作原理:

#!/usr/bin/perl

@num = (3..7);  # same as (3, 4, 5, 6, 7)
n1 = pop(@num); #n1 is 7, array is (3, 4, 5, 6)
n2 = pop(@num); #n2 is 6, array is (3, 4, 5)
print "\n1 is:n1\n";
print "\n2 is:n2\n";
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}
pop @num; # 5 is discarded, array is (3, 4)
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}

输出:

$n1 is: 7
$n2 is: 6
array now has:
3
4
5
array now has:
3
4

push运算符在数组末尾添加一个元素。

示例:

#!/usr/bin/perl

@num = (10..12);  # same as (10, 11, 12)
push (@num, 9); # array is (10, 11, 12, 9)
push (@num, 6); # array is (10, 11, 12, 9, 6)
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}
@num2 = (11, 22, 33);
push (@num, @num2); # adding another array to the end
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}

输出:

array now has:
10
11
12
9
6
array now has:
10
11
12
9
6
11
22
33

运算符:shiftunshift

正如我们在上面看到的那样,pushpop操作符在数组末尾添加和删除。shiftunshift在数组的开头执行操作。

shift运算符:

shift运算符的工作方式类似于pop运算符,但与pop运算符不同,它在数组的开头执行运算。

#!/usr/bin/perl

@num = (3..7);  # same as (3, 4, 5, 6, 7)
n1 = shift(@num); #n1 is 3, array is (4, 5, 6, 7)
n2 = shift(@num); #n2 is 4, array is (5, 6, 7)
print "\n1 is:n1\n";
print "\n2 is:n2\n";
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}
shift @num; # 5 is discarded, array is (6, 7)
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}

输出:

$n1 is: 3
$n2 is: 4
array now has:
5
6
7
array now has:
6
7

unshift运算符:

unshift运算符的工作方式类似于push运算符,但与push运算符不同,它在数组的开头执行运算。

#!/usr/bin/perl

@num = (10..12);  # same as (10, 11, 12)
unshift (@num, 9); # array is (9, 10, 11, 12)
unshift (@num, 6); # array is (6, 9, 10, 11, 12)
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}
@num2 = (11, 22, 33);
unshift (@num, @num2); # adding another array to the beginning
print "array now has:\n";
foreach temp (@num) {
   print "temp\n";
}

输出:

array now has:
6
9
10
11
12
array now has:
11
22
33
6
9
10
11
12

splice运算符

在上一节中,我们学习了如何在数组上执行pushpopshiftunshift操作。但是这些运算符存在限制,它们只在数组的开头或数组的末尾执行。如果我们想在数组中间执行操作怎么办?这就是splice运算符进入画面的地方。

语法:

splice @array_name, s, l, @another_array

splice运算符最多可以包含四个参数。
第一个参数是数组名,这里我们指定我们正在执行操作的数组
第二个参数是起点,如上所述,你可以在数组中间执行操作。这指定了操作的起点。
第三个参数是长度
第四个参数是另一个列表或数组。

让我们举几个例子来理解这个:

示例 1:splice中只有两个参数

@myarray = qw(Rahul, Joe, Ajeet, Tim, Lisa);
@myvar = splice @array, 2;  
# removes everything after Ajeet
# @myarray is qw(Rahul, Joe, Ajeet)
# @myvar is qw(Tim, Lisa)

splice运算符的第三和第四个参数是可选的。在上面的例子中,我们只提供了两个参数,数组和起始点。与数组类似,splice运算符的索引从 0 开始,这意味着Ajeet是上例中的起点。如果我们只提供两个参数,那么splice运算符会在起始点之后删除所有内容。

示例 2:三个参数

第三个参数指定已删除元素列表的长度。在上面的例子中,我们没有指定任何长度,这就是为什么它在起始点之后删除了所有内容。现在,让我们看看当我们提供第三个参数时会发生什么。

@myarray = qw(Rahul, Joe, Ajeet, Tim, Lisa);
@myvar = splice @array, 2, 1;  
# removes only one element after Ajeet
# @myarray is qw(Rahul, Joe, Ajeet, Lisa)
# @myvar is qw(Tim)

例 3:第四个参数

第四个参数是另一个列表或我们要插入到数组中的数组。

@myarray = qw(Rahul, Joe, Ajeet, Tim, Lisa);
@myvar = splice @array, 2, 1, qw(Harsh, Alisha);  
# removes only one element after Ajeet
# inserts the provided list at the same position
# @myarray is qw(Rahul, Joe, Ajeet, Harsh, Alisha, Lisa)
# @myvar is qw(Tim)

示例 4:如果我们不想删除任何内容,只需添加即可

如果您不想删除任何内容,只需要在数组中间添加一些元素,然后可以将长度指定为 0。

@myarray = qw(Rahul, Joe, Ajeet, Tim, Lisa);
@myvar = splice @array, 2, 0, qw(Harsh, Alisha); 
# removes nothing
# inserts the provided list at the starting point
# @myarray is qw(Rahul, Joe, Ajeet, Harsh, Alisha, Tim, Lisa)
# @myvar is qw()

reverse运算符

reverse运算符将一个元素(或列表)数组作为输入,并以相反的顺序返回。例如:

@myarray = 10..15;    # same as (10, 11, 12, 13, 14, 15)
@myarray2 = reverse @myarray;   # @myarray2 has (15, 14, 13, 12, 11, 10)
@myarray3 = reverse 5..9; # @myarray3 has (9, 8, 7, 6, 5)

假设您想要反转数组的元素并将其存储到同一个数组中:

@myarray = 10..15;
@myarray = reverse @myarray;

注意:如果你只是写下面的语句那么它就不行了。

reverse @myarray;

这不会做任何事情,因为反向运算符不会更改数组元素的顺序,它只是以相反的顺序返回需要分配给数组的列表。


Perl 教程
Perl 教程Perl 安装配置第一个 Perl 程序Perl 语法Perl 中的数据类型Perl 变量Perl 局部和全局变量Perl 中的标量Perl use strict和use warningsPerl 列表和数组Perl 中的哈希Perl 运算符Perl 中的条件语句Perl 中的if语句Perl 中的if-else语句perl 中的if-elsif-else语句Perl 中的unless语句Perl 中的unless-else语句Perl 中的 Switch CasePerl 中的 given-when-default 语句Perl 中的循环和循环控制语句Perl 中的 for 循环Perl while 循环Perl do-while 循环Perl foreach 循环Perl 中的until循环Perl 中的子程序Perl 字符串Perl 字符串转义序列Perl BarewordsPerl 比较文件的内容Perl 根据行号显示文件内容Perl 加密和解密Perl 错误处理Perl 格式Perl 函数签名Perl Hello World程序Perl 简介编写Perl代码的模式使用Perl的数字猜测游戏Perl 面向对象的编程(OOPs)Perl 包Perl abs()函数Perl 使用文件全局访问一个目录Perl Regex中的锚点Perl 向文件追加内容Perl 数组 pop() 函数Perl 数组切片Perl 数组 (push、pop、shift、unshift)Perl 数组Perl Regex中的断言Perl atan2() 函数Perl 自动加载(AUTOLOAD)功能Perl 字符串到数字的自动转换或铸造Perl 引用中的自生现象Perl 正则表达式中的回溯操作Perl Perl程序的基本语法Perl 布尔值Perl 调试器的中断点Perl CGI编程Perl chomp()函数Perl chop()函数Perl chr()函数Perl OOP中的类Perl cmp 操作符Perl 比较标量Perl 构造函数和析构函数Perl cos()函数Perl 计算文本中单词的频率Perl 创建Excel文件Perl 数据类型Perl 日期和时间Perl DBI(数据库独立接口)模块集Perl 分支 (if, if-else, Nested-if, if-elsif ladder, unless, unless-else, unless-elsif)Perl defined()函数Perl delete()函数Perl 带有CRUD操作的目录Perl 用调试器显示变量值Perl each() 函数Perl 正则表达式中的'e'修改器Perl 正则表达式中的'ee'修改器Perl OOPs中的封装Perl eq运算符Perl exists() 函数Perl 从脚本中退出Perl exp函数Perl 使用Regex从一个字符串中提取IP地址Perl 文件处理简介Perl 文件输入输出功能Perl 文件锁定Perl 文件测试运算符Perl CGI中的文件上传Perl 查找文件和目录Perl ge运算符Perl CGI中的GET与POSTPerl getc函数Perl 获取一个数组的元素数Perl given-when 语句Perl glob()函数Perl goto 语句Perl grep()函数Perl Regex中的分组和交替法Perl gt运算符Perl 标量和列表背景下的哈希值Perl 哈希操作Perl HashPerl 哈希值Perl hex函数Perl 实现一个队列Perl 实现一个堆栈Perl index() 函数Perl OOPs中的继承性Perl 在Windows、Linux和MacOS中的安装和环境设置Perl int()函数Perl join()函数Perl keys() 函数Perl 循环中的lastPerl lc()函数用于小写转换Perl lcfirst()函数Perl le运算符Perl length()函数Perl 调试器中的行操作命令Perl 列表及其类型Perl 列表的上下文敏感度Perl 列表函数Perl log() 函数Perl 循环 for, foreach, while, do...while, until, 嵌套循环Perl lt运算符Perl 匹配运算符
Perl 基础教程
Perl 简介Perl 环境安装Perl 基础语法Perl 数据类型Perl 变量Perl 标量Perl 数组Perl 哈希Perl 条件语句Perl 循环Perl 运算符Perl 时间日期Perl 子程序(函数)Perl 引用Perl 格式化输出Perl 文件操作Perl 目录操作Perl 错误处理Perl 特殊变量Perl 正则表达式Perl Socket 编程Perl 面向对象Perl 包和模块Perl 进程管理Perl POD 文档Perl while 循环Perl until 循环Perl for 循环Perl foreach 循环Perl do…while 循环Perl 循环嵌套Perl next 语句Perl last 语句Perl continue 语句Perl redo 语句Perl goto 语句Perl IF 语句Perl IF…ELSE 语句Perl IF…ELSIF 语句Perl UNLESS 语句Perl UNLESS…ELSE 语句Perl UNLESS…ELSIF 语句Perl switch 语句
Perl 问答
Perl 和 Ruby 的区别