首页 > 编程语言 >无涯教程-Perl - Arrays(数组)

无涯教程-Perl - Arrays(数组)

时间:2023-08-03 12:32:29浏览次数:44  
标签:Arrays coins 无涯 Perl names 数组 print array perl

数组是一个变量,用于存储标量值的有序列表。数组变量前面有一个“ @”符号。要引用数组的单个元素,将使用带符号名称的美元符号($),后跟方括号中的元素索引,这是使用数组变量的简单示例-

#!/usr/bin/perl

@ages=(25, 30, 40);             
@names=("John Paul", "Lisa", "Kumar");

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

在这里,我们仅在$符号之前使用了转义符号(\)进行打印。其他Perl会将其理解为变量并打印其值。执行后,将产生以下输出-

$ages[0]=25
$ages[1]=30
$ages[2]=40
$names[0]=John Paul
$names[1]=Lisa
$names[2]=Kumar

在Perl中,列表和数组术语经常被使用,就好像它们是可互换的一样。但是列表是数据,而数组是变量。

数组创建

数组变量以@符号为前缀,并使用括号或qw运算符填充。如-

@array=(1, 2, 'Hello');
@array=qw/This is an array/;

第二行使用qw //运算符,该运算符返回字符串列表,并用空格分隔定界的字符串。在这个示例中,这导致了一个四元素数组。第一个元素是" this",最后一个(第四个)是" array"。这意味着您可以使用以下不同的行-

@days=qw/Monday
Tuesday
...
Sunday/;

您还可以通过如下方式分别分配每个值来填充数组-

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

访问数组

从数组访问单个元素时,必须在变量前加上一个美元符号($),然后在变量名称后的方括号内附加元素索引。如-

#!/usr/bin/perl

@days=qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";

这将产生以下输出-

Mon
Tue
Wed
Sun
Sun
Mon

数组索引从零开始,因此要访问第一个元素,您需要将0作为索引。您还可以给定一个负索引,在这种情况下,您可以从数组的结尾选择元素。

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

数组序号

Perl提供了用于连续数字和字母的快捷方式。如,当计数到100时,不必键入每个元素,而是可以执行以下操作:

#!/usr/bin/perl

@var_10=(1..10);
@var_20=(10..20);
@var_abc=(a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to 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

数组大小

数组的大小可以使用数组的scalar上下文来确定返回的值将是数组中元素的数量-

@array=(1,2,3);
print "Size: ",scalar @array,"\n";

返回的值将始终是数组的物理大小,而不是有效元素的数量。您可以演示一下,标量@array和$#array之间的区别如下-

#!/usr/bin/perl

@array=(1,2,3);
$array[50]=4;

$size=@array;
$max_index=$#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

这将产生以下输出-

Size: 51
Max Index: 50

数组中只有四个元素包含信息,但是数组的长度为51个元素,最高索引为50。

添加和删除元素

Perl提供了许多有用的函数来添加和删除数组中的元素。

Sr.No. Types & 描述
1

push @ARRAY, LIST

将列表的值压入数组的末尾。

2

pop @ARRAY

弹出并返回数组的最后一个值。

3

shift @ARRAY

将数组的第一个值移开并返回,将数组缩短1并向下移动所有内容。

4

unshift @ARRAY, LIST

将列表添加到数组的最前面,并返回新数组中的元素数。

#!/usr/bin/perl

# create a simple array
@coins=("Quarter","Dime","Nickel");
print "1.\@coins =@coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2.\@coins =@coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3.\@coins =@coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4.\@coins =@coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5.\@coins =@coins\n";

这将产生以下输出-

1. @coins=Quarter Dime Nickel
2. @coins=Quarter Dime Nickel Penny
3. @coins=Dollar Quarter Dime Nickel Penny
4. @coins=Dollar Quarter Dime Nickel
5. @coins=Quarter Dime Nickel

数组切片

您还可以从数组中提取"Slicing"-也就是说,您可以从数组中选择一个以上的项目,以产生另一个数组。

#!/usr/bin/perl

@days=qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays=@days[3,4,5];

print "@weekdays\n";

这将产生以下输出-

Thu Fri Sat

切片的规范必须具有有效索引列表,这些索引可以是正数或负数,每个索引之间都用逗号分隔。为了提高速度,您还可以使用 ... 范围运算符-

#!/usr/bin/perl

@days=qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays=@days[3..5];

print "@weekdays\n";

这将产生以下输出-

Thu Fri Sat

数组更换元素

现在,我们将介绍另一个名为 splice()的函数,该函数具有以下语法:

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

此函数将删除由OFFSET和LENGTH指定的@ARRAY元素,如果指定,则将其替换为LIST。最后,它返回从数组中删除的元素。以下是示例-

#!/usr/bin/perl

@nums=(1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

这将产生以下输出-

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

在此,实际替换从第6个数字开始,然后将5个元素从6替换为10,分别用数字21、22、23、24和25替换。

字符串转数组

让我们看看另一个名为 split()的函数,它具有以下语法-

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

此函数将字符串拆分为字符串数组,然后返回它。如果指定了LIMIT,则最多拆分为该数量的字段。如果省略PATTERN,则在空白处分割。以下是示例-

#!/usr/bin/perl

# define Strings
$var_string="Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names="Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string=split('-', $var_string);
@names =split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

这将产生以下输出-

Roses
Michael

数组转字符串

我们可以使用 join()函数重新加入数组元素并形成一个长标量字符串。此函数具有以下语法-

join EXPR, LIST

此函数将LIST的单独字符串连接成单个字符串,且字段之间用EXPR值分隔,并返回该字符串。以下是示例-

#!/usr/bin/perl

# define Strings
$var_string="Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names="Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string=split('-', $var_string);
@names =split(',', $var_names);

$string1=join( '-', @string );
$string2=join( ',', @names );

print "$string1\n";
print "$string2\n";

这将产生以下输出-

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

排序数组

sort()函数根据ASCII数值标准对数组的每个元素进行排序。此函数具有以下语法-

sort [ SUBROUTINE ] LIST

该函数对LIST排序并返回排序后的数组值。如果指定了SUBROUTINE,则在对元素进行排序时将应用SUBTROUTINE内部的指定逻辑。

#!/usr/bin/perl

# define an array
@foods=qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods=sort(@foods);
print "After: @foods\n";

这将产生以下输出-

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

请注意,排序是根据单词的ASCII数字值进行的。因此,最好的选择是首先将数组的每个元素转换为小写字母,然后执行排序函数。

特殊变量

到目前为止,您已经看到了我们在程序中定义的简单变量,并使用它们来存储和打印标量和数组值。 Perl提供了许多特殊变量,这些变量具有其预定义的含义。

我们有一个特殊的变量,写为 $[。此特殊变量是包含所有数组的第一个索引的标量。由于Perl数组具有从零开始的索引,因此$[几乎始终为0。但是,如果将$[设置为1,则所有数组都将使用基于1的索引。建议不要使用零以外的任何其他索引。但是,让我们举一个示例来说明$[变量的用法-

#!/usr/bin/perl

# define an array
@foods=qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[=1;

print "Food at\@foods[1]: $foods[1]\n";
print "Food at\@foods[2]: $foods[2]\n";

这将产生以下输出-

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

合并数组

因为数组只是逗号分隔的值序列,所以可以将它们组合在一起,如下所示:

#!/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 "value of var=$var\n"

这将产生以下输出-

value of var=1

同样,我们可以提取切片,尽管不需要前导@字符-

#!/usr/bin/perl

@list=(5,4,3,2,1)[1..3];

print "Value of list=@list\n";

这将产生以下输出-

Value of list=4 3 2

参考链接

https://www.learnfk.com/perl/perl-arrays.html

标签:Arrays,coins,无涯,Perl,names,数组,print,array,perl
From: https://blog.51cto.com/u_14033984/6948050

相关文章

  • 无涯教程-Perl - 变量声明
    解释器根据变量的类型分配内存并确定可以保留内存中存储的内容。因此,通过为变量分配不同的数据类型,可以在这些变量中存储数字或字符串。创建变量Perl变量不必显式声明以保留内存空间。为变量分配值时,声明自动发生。等号(=)用于为变量分配值。请注意,如果在程序中使用usestric......
  • 无涯教程-Lua - if语句函数
    if语句由布尔表达式组成,后跟一个或多个语句。ifstatement-语法Lua编程语言中的if语句的语法是-if(boolean_expression)then--[statement(s)willexecuteifthebooleanexpressionistrue--]end如果布尔表达式的输出为true,则将执行if语句中的代码块。如果......
  • 无涯教程-Lua - nested语句函数
    Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。nestedloops-语法Lua中嵌套for循环语句的语法如下-forinit,max/minvalue,incrementdoforinit,max/minvalue,incrementdostatement(s)endstatement(s)en......
  • 无涯教程-Lua - repeat...until 语句函数
    与for和while循环(它们在循环顶部测试循环条件)不同,Lua编程中的repeat...until循环语言在循环的底部检查其条件。repeat...until循环与while循环相似,不同之处在于,保证do...while循环至少执行一次。repeat...untilloop-语法Lua编程语言中repeat...until循......
  • 无涯教程-Lua - for语句函数
    for循环是一种重复控制结构,可让您有效地编写需要执行特定次数的循环。forloop-语法Lua编程语言中for循环的语法如下-forinit,max/minvalue,incrementdostatement(s)end这是for循环中的控制流程-首先执行init步骤,并且仅执行一次。此步骤使您可以声明和初......
  • 无涯教程-Lua - while语句函数
    只要给定条件为真,Lua编程语言中的while循环语句就会重复执行目标语句。whileloop-语法Lua编程语言中while循环的语法如下-while(condition)dostatement(s)endwhileloop-流程图在这里,需要注意的关键是while循环可能根本不执行。当测试条件并且输出为false......
  • 无涯教程-Lua - Math库
    在科学和工程计算中,无涯教程经常需要数学运算,可以使用标准的Lua库数学来进行运算。下表显示了数学库中可用的函数列表。Sr.No.Library/Method&Purpose1math.abs(x)返回x的绝对值。2math.acos(x)返回x的反余弦(以弧度为单位)。3math.asin(x)返回x的反正弦(以......
  • 无涯教程-Lua - 系统工具
    在任何应用程序中,访问操作系统级别的函数通常都是必需的,并且它随操作系统库一起提供。下表列出了可用的函数。Sr.No.Library/Method&Purpose1os.clock()返回该程序使用的CPU时间(以秒为单位)的近似值。2os.date([format[,time]])返回字符串或包含日期和时间的表,并......
  • 无涯教程-Lua - 函数声明
    函数是一起执行任务的一组语句,您可以将代码分成单独的函数。Lua语言提供了程序可以调用的许多内置方法。如方法print()打印在控制台中作为输入传递的参数。定义函数Lua编程语言中方法定义的一般形式如下-optional_function_scopefunctionfunction_name(argument1,argume......
  • 无涯教程-Lua - 条件判断
    if结构要求程序员确定一个或多个要由程序判断或测试的条件,以及要确定的条件为真的情况下要执行的一条或多条语句,如果条件为真,则执行指定语句,如果条件为假,则执行其他语句。Lua编程语言假定布尔值true和non-nil的任意组合为true,如果是布尔值false或nil,则假定为false值......