请解释perl声明

时间:2016-05-31 07:17:36

标签: perl sorting

我正在阅读Intermediate Perl书,在Chapt10中有这段代码。我添加了一些打印语句,但核心逻辑没有改变。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @input = qw(Gilligan Skipper Professor Ginger Mary Ann);
my @sorted_positions = sort { $input[$a] cmp $input[$b] } 0 .. $#input;
print Dumper( \@sorted_positions );
my @ranks;
@ranks[@sorted_positions] = ( 1 .. @sorted_positions );
print Dumper( \@ranks );
foreach ( 0 .. $#ranks ) {
    print "$input[$_] sorts into position $ranks[$_]\n";
}

当我检查Dumper输出然后检查@sorted_positions数组时,它正在打印

$VAR1 = [
          5,
          0,
          3,
          4,
          2,
          1
        ];

这对我有意义,但对于@ranks数组,它正在打印

$VAR1 = [
          2,
          6,
          5,
          3,
          4,
          1
        ];

我无法理解这条线的作用。

@ranks[@sorted_positions] = ( 1 .. @sorted_positions );

我能够理解输出对程序的意义,但是不能理解输出是如何产生的,即perl在该语句中究竟做了什么。

2 个答案:

答案 0 :(得分:9)

该行:

@ranks[@sorted_positions] = ( 1 .. @sorted_positions );

相当于:

@ranks[5,0,3,4,2,1] = (1,2,3,4,5,6);

相当于:

$ranks[5] = 1;
$ranks[0] = 2;
$ranks[3] = 3;
$ranks[4] = 4;
$ranks[2] = 5;
$ranks[1] = 6;

示例正在使用perldata man page中记录的slices

答案 1 :(得分:3)

假设你想要分配字符串' x'进入阵列的第一个位置,' y'进入第二个位置' z'进入第三个位置。您可以同时执行三项任务,而不是执行三项任务;

@array[0,1,2] = ("x", "y", "z");

您不必按顺序执行这些操作;

@array[2,0,1] = ("z", "x", "y");    # same result

相关行的右侧会生成一个以1开头的数字列表,并以表达式@sorted_positions返回的整数值结束(因为它有6个@sorted_positions中的6件事 - 即它的相同到;

(1,2,3,4,5,6)

所以,整个陈述与:

相同
@ranks[5,0,3,4,2] = (1,2,3,4,5,6) ;

所以,如果我们只进行一次迭代:

foreach ( 0 .. $#ranks ) {
    print "$input[$_] sorts into position $ranks[$_]\n";
}

我们得到;

print "$input[0] sorts into position $ranks[0]\n" 
# ie: Gilligan sorts into position 2

希望有所帮助。