【问题标题】:Please explain perl statement请解释perl语句
【发布时间】:2016-09-29 02:01:21
【问题描述】:

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

#!/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 在该语句中到底做了什么。

【问题讨论】:

    标签: perl sorting


    【解决方案1】:

    假设您要将字符串“x”分配到数组的第一个位置,将“y”分配到第二个位置,将“z”分配到第三个位置。你可以同时做三个作业,而不是做三个作业;

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

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

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

    相关行的右侧生成一个数字列表,该列表从 1 开始,并以表达式 @sorted_positions 返回的整数值结束(即 6,因为有 6 个事物在@sorted_positions) - 即它的相同;

    (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
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      行:

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

      该示例使用slices,记录在perldata man page中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多