【问题标题】:How to sort a list of arrays of arrays如何对数组的数组列表进行排序
【发布时间】:2011-12-09 17:53:00
【问题描述】:

这是脚本

use strict;

sub sortF {
my $l1 = hex ${@$a}[0];
my $l2 = hex ${@$b}[0];
return $l1 <=> $l2;
}

my @results;

my @parsedLine = ['0x1a',"hello"];
push(@results, @parsedLine);

my @parsedLine2 = ['0x1b',"ohello"];
push(@results, @parsedLine2);

my @sortedresults = sort(sortF(@results));

我想通过列表元素指向的匿名数组的第一个元素对列表@results 进行排序

这给出了错误

Can't use string ("0") as an ARRAY ref while "strict refs" in use at ...

sortF函数应该怎么写?

【问题讨论】:

    标签: arrays perl sorting


    【解决方案1】:

    你在这里打电话给sortF

    my @sortedresults = sort(sortF(@results));
    

    当您的意思是告诉sort 使用sortF 作为比较函数时:

    my @sortedresults = sort sortF @results;
    

    您所做的是首先调用sortF(@results) 并将该函数调用的结果交给sort。但是$a$bsortF 中都是空的,因为sort 没有设置它们,这意味着$l1$l2 都将为空,而$l1 &lt;=&gt; $l2 将为零。所以你的

    my @sortedresults = sort(sortF(@results));
    

    变成:

    my @sortedresults = sort(0);
    

    这就是错误消息的来源。

    【讨论】:

      【解决方案2】:

      您在使用参考资料时犯了一些小错误,您应该查看perlrefperlsort 了解如何处理的详细信息:

      use strict;
      
      sub sortF {
          my $l1 = hex $a->[0]; # just use $arrayref->[index]
          my $l2 = hex $b->[0];
          return $l1 <=> $l2;
      }
      
      my @results;
      
      my @parsedLine = ('0x1a',"hello"); # use () to make a list
      push(@results, \@parsedLine); # but push an array ref
      
      # or create an anon array ref with [] and push it immediately
      push(@results, ['0x1b',"ohello"]); 
      
      # here use the `sort SUBNAME LIST' syntax
      my @sortedresults = sort sortF @results;
      
      print join(":", map {$_->[1]} @sortedresults), "\n";
      

      【讨论】:

        【解决方案3】:

        除了mentioned by mu is too short 的问题之外,${@$a}[0] 并没有像你想象的那样做:它尝试使用数组 @$asize 作为数组引用,生成你看到的警告。我猜你的意思是$a-&gt;[0](或者$$a[0],如果你喜欢老式的解引用语法)。

        另外,my @parsedLine = ['0x1a',"hello"]; 也没有像你想象的那样做:它创建了一个单元素数组,其中包含对两个字符串数组的引用。这在这里实际上并不重要(当您将一个数组推送到另一个数组时,所有元素都会按顺序推送),但它可能会在以后咬你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-11
          • 1970-01-01
          • 2015-01-03
          • 2018-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多