Christian Kruse: Fieser sort

Beitrag lesen

你好 Karle,

<key>: value1 value2 ...

a: name1 neuername1/12
b: name1 neuername2/23
c: name1 neuername1/1
d: name10 neuername1/1
e: name2 neuername1/3


>   
> So und nun hätte ich das gerne so sortiert bzw. meinen print:  
>   
> ~~~perl

name1 neuername1/1 ...  

> name1 neuername1/12 ...  
> name1 neuername2/23 ...  
> name2 neuername1/3 ...  
> name10 neuername1/1 ...

Also die Sortierreihenfolge ist - erst value1 alphabetisch(und wenn möglich die Zahl numerisch) und dann value2 ebenfalls so. Der Key ist mir egal.

Da sort einen Block als Sortier-Kriterium erlaubt, kannst du das doch mit beliebig komplexem Code umsetzen. Ein Ansatz wäre:

use strict;  
use Data::Dumper;  
  
sub get_parts;  
  
my $data = {  
  a => ['name1', 'neuername1/12'],  
  b => ['name1', 'neuername2/23'],  
  c => ['name1', 'neuername1/1'],  
  d => ['name10', 'neuername1/1'],  
  e => ['name2', 'neuername1/3']  
};  
  
my @sorted_keys = sort {  
  my ($charpart_a,$digitpart_a) = get_parts($data->{$a}->[0]);  
  my ($charpart_b,$digitpart_b) = get_parts($data->{$b}->[0]);  
  
  if($charpart_a eq $charpart_b) {  
    if($digitpart_a == $digitpart_b) {  
      my ($charpart_a,$digitpart_a,$digitpart2_a) = get_parts($data->{$a}->[1]);  
      my ($charpart_b,$digitpart_b,$digitpart2_b) = get_parts($data->{$b}->[1]);  
  
      if($charpart_a eq $charpart_b) {  
        if($digitpart_a == $digitpart_b) {  
          $digitpart2_a <=> $digitpart2_b;  
        }  
        else {  
          $digitpart_a <=> $digitpart_b;  
        }  
      }  
      else {  
        $charpart_a cmp $charpart_b;  
      }  
    }  
    else {  
      $digitpart_a <=> $digitpart_b;  
    }  
  }  
  else {  
    $charpart_a cmp $charpart_b;  
  }  
  
} keys %$data;  
  
  
print join(", ",@sorted_keys),"\n";  
  
sub get_parts {  
  $_[0] =~ /^(\w+)(\d+)(?:\/(\d+))?$/;  
  
  return ($1,int($2),$3);  
}  
  
# eof

再见,
 克里斯蒂安

--
http://wwwtech.de/
IRC-Clients und Irssi-Scripting | Flyspray
<Tim> Ich bin nicht hier, um zu helfen. Mir hilft ja auch keiner. Sogar mein Brötchen muss ich mir jetzt selber schmieren.