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
use v5.12; #use strict; use warnings; my @testliste = ( [1,"berta"], [20,"thomas"], [11,"walter"], [1024,"adam"] ); no warnings; # unschön ?? print "unsortiert Spalte 0\n"; for my $i (0..3){ print "$testliste[$i][0]\n"; } my $spalte = 0; @testliste = sort { $a->[$spalte] <=> $b->[$spalte] || $a->[$spalte] cmp $b->[$spalte]} @testliste; print "\nsortiert nach Spalte 0 (numerische Werte)\n"; for my $i (0..3){ print "$testliste[$i][0]\n"; } print "\n\nunsortiert Spalte 1\n"; for my $i (0..3){ print "$testliste[$i][1]\n"; } $spalte = 1; @testliste = sort { $a->[$spalte] <=> $b->[$spalte] || $a->[$spalte] cmp $b->[$spalte]} @testliste; print "\nsortiert nach Spalte 1 (String inhalt)\n"; for my $i (0..3){ print "$testliste[$i][1]\n"; } use warnings; # hier sinnlos weil Programmende
2014-01-04T12:01:40 der_thomas[.....]
Nachteilig ist nur dass ich mit use warnings beim zweiten Sortiervorgang die Warnmeldung bekomme dass ich versuche Stings numerisch zu sortieren.
Bin nun auf die Idee gekommen temporär "no warnings" für das Sortieren zu verwenden.
@testliste = sort { $a->[$spalte] <=> $b->[$spalte] || $a->[$spalte] cmp $b->[$spalte]} @testliste;
2014-01-04T19:08:44 der_thomas- Die Spalteninhalte richtig sortiert werden, egal ob String oder numerischer Inhalt.
no warnings 'numeric';
use warnings 'numeric';
use warnings;
1 2 3 4
{ # tut nix weiter, macht nur einen Block auf no warnings...; # gilt nur im aktuellen Block sort ...; } # ab hier wieder warnings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @data = (
[ 1, "berta" ],
[ 20, "thomas" ],
[ 11, "walter" ],
[ 1024, "adam" ],
[ 20, "chris" ],
);
# 1. Spalte numerisch, dann bei Gleichheit 2. Spalte lexikalisch
my @sorted = sort { $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1] } @data;
print Dumper \@sorted;
# 2. Spalte lexikalisch, dann bei Gleichheit 1. Spalte numerisch
@sorted = sort { $a->[1] cmp $b->[1] || $a->[0] <=> $b->[0] } @data;
print Dumper \@sorted;