上一节:
下一节:

  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';
    
    
  • 访问数组元素

    从数组访问单个元素时,必须在变量前加一个美元符号($),然后在变量名称后的方括号内附加元素索引。例如-
    
    @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时,不必键入每个元素,而是可以执行以下操作:
    
    @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
    
    
  • 数组大小

    数组的大小可以使用数组的标量上下文来确定-返回的值将是数组中元素的数量-
    
    @array = (1,2,3);
    print "Size: ",array @array,"\n";
    
    
    返回的值将始终是数组的物理大小,而不是有效元素的数量。您可以演示一下,使用此片段,标量@array和$#array之间的区别如下-
    
    @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提供了许多有用的功能来添加和删除数组中的元素。您可能有一个问题是什么功能?到目前为止,您已经使用打印功能来打印各种值。类似地,还有其他各种功能或有时称为子例程的子例程,可用于各种其他功能。
    类型 描述
    push @ARRAY, LIST 将列表的值压入数组的末尾。
    pop @ARRAY 弹出并返回数组的最后一个值。
    shift @ARRAY 将数组的第一个值移开并返回,将数组缩短1并向下移动所有内容。
    unshift @ARRAY, LIST 将列表添加到数组的最前面,并返回新数组中的元素数。
    
    # 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
    
    
  • 切片数组元素

    您还可以从数组中提取“切片”-也就是说,您可以从数组中选择多个项以生成另一个数组。
    
    @days = qw/Mon Tue Wed Thu Fri Sat Sun/;
    
    @weekdays = @days[3,4,5];
    
    print "@weekdays\n";
    
    
    尝试一下
    这将产生以下结果-
    
    Thu Fri Sat
    
    
    切片的规范必须具有有效索引列表,这些索引可以是正数或负数,每个索引之间都用逗号分隔。为了提高速度,您还可以使用.. range运算符-
    
    @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。最后,它返回从数组中删除的元素。以下是示例-
    
    @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个数字开始,然后用数字21、22、23、24和25将5个元素从6替换为10。
  • 将字符串转换为数组

    让我们看看另一个名为split()的函数,它具有以下语法-
    
    split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
    
    
    此函数将字符串拆分为字符串数组,然后将其返回。如果指定了LIMIT,则最多拆分为该数量的字段。如果省略PATTERN,则在空白处分割。以下是示例-
    
    # 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值分隔,然后返回该字符串。以下是示例-
    
    # 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内部的指定逻辑。
    
    # 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,则所有数组都将使用基于on的索引。建议不要使用零以外的任何其他索引。但是,让我们举一个例子来说明 $[ 变量的用法-
    
    # 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
    
    
  • 合并数组

    由于数组只是一个逗号分隔的值序列,因此可以将它们组合在一起,如下所示:
    
    @numbers = (1,3,(4,5,6));
    
    print "numbers = @numbers\n";
    
    
    尝试一下
    这将产生以下结果-
    
    numbers = 1 3 4 5 6
    
    
    嵌入式数组仅成为主数组的一部分,如下所示-
    
    @odd = (1,3,5);
    @even = (2, 4, 6);
    
    @numbers = (@odd, @even);
    
    print "numbers = @numbers\n";
    
    
    尝试一下
    这将产生以下结果-
    
    numbers = 1 3 5 2 4 6
    
    
  • 从列表中选择元素

    列表符号与数组相同。您可以通过在列表中添加方括号并给出一个或多个索引来从数组中提取元素-
    
    $var = (5,4,3,2,1)[4];
    
    print "value of var = $var\n"
    
    
    尝试一下
    这将产生以下结果-
    
    value of var = 1
    
    
    同样,我们可以提取切片,尽管不需要前导@字符-
    
    @list = (5,4,3,2,1)[1..3];
    
    print "Value of list = @list\n";
    
    
    尝试一下
    这将产生以下结果-
    
    Value of list = 4 3 2
    
    
上一节:
下一节: