跨多列排序(Perl)

7
我该如何对以下代码中的多列进行排序?
目前,代码的步骤如下:
1. 获取目录$directory中文件的列表@list
2. 使用正则表达式获取@list中每个元素的$fileName$fileLocation$fileSize
3. 将(2)中的三个值以固定宽度的形式打印在三列中。
4. 然后打印出文件总数和目录大小。
我希望输出按以下方式排序:
1. 先按$fileName排序
2. 再按$fileLocation排序
3. 最后按$fileSize排序。
$directory = '/shared/tmp';
$count = 0;

@list = qx{du -ahc $directory};

printf ("%-60s %-140s %-5s\n", "Filename", "Location", "Size");

foreach(@list) {
  chop($_);                                                     # remove newline at end
  if (/^(.+?K)\s+(.+\/)(.+\.[A-Za-z0-9]{2,4})$/) {              # store lines with valid filename into new array
#    push(@files,$1);
    $fileSize = $1;
    $fileLocation = $2;
    $fileName = $3;
    if ($fileName =~ /^\./) {
      next; }
    printf ("%-60s %-140s %-5s\n", $fileName, $fileLocation, $fileSize);
    $count++;
  }
  else {
    next;
  }
}

print "Total number of files: $count\n";

$total = "$list[$#list]";
$total =~ s/^(.+?)\s.+/$1/;
print "Total directory size: $total\n";
1个回答

18

你可以指定自己的排序算法,并将其传递给 sort


一个示例实现

将结果(以哈希引用的形式)推入名为 @entries 的数组,并使用类似以下内容的代码。

my @entries;

...

# inside your loop

  push @entries, {
    'filename' => $fileName,
    'location' => $fileLocation,
    'size'     => $fileSize
  };

...

my @sorted_entries = sort {
  $a->{'filename'} cmp $b->{'filename'} || # use 'cmp' for strings
  $a->{'location'} cmp $b->{'location'} ||
  $a->{'size'}     <=> $b->{'size'}        # use '<=>' for numbers
} @entries;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接