Thread Zeilen einlesen und nach dritter Spalte sortieren (48 answers)
Opened by leo11 at 2008-08-14 08:06

leo11
 2008-08-25 01:34
#113962 #113962
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Ich habe nun den Code von Ronnie etwas abgewandelt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
my @datei_to_sort = map {chomp; $_} (<DATA>);
my $level_to_sort = 20;
my $spalte_to_sort = 5;

print Dumper in_three_chunks(\@datei_to_sort, $level_to_sort, $spalte_to_sort);

sub in_three_chunks {
    my $datei_ts = shift;
    my $level_ts = shift;
    my $spalte_ts = (shift)-1;

    return unless ref $datei_ts or not $level_ts =~ /^\d+$/;

    my %parted = ( before => [], matching => [], after => [] );

    for my $zeile (@$datei_ts) {
        my $spalte = [split /;/, $zeile];

        push @{$parted{'matching'}}, $zeile, $spalte->[$spalte_ts] and next if $spalte->[2] == $level_ts;

        unless (@{$parted{'matching'}}) {
            push @{$parted{'before'}}, $zeile;
        } else {
            push @{$parted{'after'}}, $zeile;
        }
    }
    #print $parted{'matching'}->[1];
    sort { $a->($parted{'matching'}->[1]) <=> $b->($parted{'matching'}->[1])} %parted;
    return \%parted;
}

__DATA__
Zeile1;;10;;;;
Zeile2;;11;;;;
Zeile3;;20;;600;;
Zeile4;;20;;500;;
Zeile5;;20;;800;;
Zeile6;;20;;700;;
Zeile7;;30;;;;
Zeile8;;40;;;;

1.)Die sort-Zeile geht noch nicht. Was muss man schreiben, damit ich folgendem Ergebnis ein Stück näher komme?
Zeile1;;10;;;;
Zeile2;;11;;;;
Zeile4;;20;;500;;
Zeile3;;20;;600;;
Zeile6;;20;;700;;
Zeile5;;20;;800;;
Zeile7;;30;;;;
Zeile8;;40;;;;

2.)Was bewirkt
return unless ref $datei_ts or not $level_ts =~ /^\d+$/;

3.)wie funktioniert
unless (@{$parted{'matching'}}) {
push @{$parted{'before'}}, $zeile;
} else {
push @{$parted{'after'}}, $zeile;
}
Das push verstehe ich, aber die Bedingung für unless ist mir unklar. Was gibt die den zurück? True/false o.ä.? Und wieso?

View full thread Zeilen einlesen und nach dritter Spalte sortieren