Schrift
[thread]6648[/thread]

Liste von Objekten sortieren: nach der Eigenschaft Datum (Seite 2)



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Dubu
 2005-01-21 16:29
#51141 #51141
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Im Gegensatz zu dem, was Relais erzaehlt hat ;) , ist Perl gar nicht so tolerant bei Vergleichen. Es ist aber so, dass Perl versucht, im numerischen Kontext so viel wie moeglich aus einem String als Zahl zu nehmen (sprich: alles bis zum ersten Nicht-Ziffernzeichen) und diese Zahl dann benutzt. Ein String wie "2005-01-01" ergibt im numerischen Kontext also 2005:
Code: (dl )
1
2
3
> perl -Mwarnings -Mstrict -le 'my $x = "2005-01-21"; print($x+1);'
Argument "2005-01-21" isn't numeric in addition (+) at -e line 1.
2006

Man beachte die 2006 in der Ausgabe, hinter der Warnung.

Wenn man also <=> statt cmp benutzt, werden bei deinen Daten nur die Jahre sortiert, innerhalb eines Jahres ist die Reihenfolge zufaellig (wie sie sich im Sortierablauf ergibt):
Code: (dl )
1
2
3
4
> perl -Mwarnings -Mstrict -le 'my $x = "2005-01-21"; my $y = "2005-01-22"; print($x <=> $y);'
Argument "2005-01-22" isn't numeric in numeric comparison (<=>) at -e line 1.
Argument "2005-01-21" isn't numeric in numeric comparison (<=>) at -e line 1.
0

Wie die Ausgabe 0 zeigt, sind fuer Perl beide Werte als Zahl gleich gross.
mordur
 2005-01-21 16:37
#51142 #51142
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wäre man auf der ganz sicheren Seite, wenn ich die '-' vorher aus dem Datum extrahiere,
also "20050101" statt "2005-01-01" ?\n\n

<!--EDIT|mordur|1106318285-->
Crian
 2005-01-21 16:41
#51143 #51143
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Bei Deinen Strings dürfte er dann nur bis zum ersten - sortieren. Oder rein zufällig. Je nachdem, wie die interne Nummer aus Skalar ermitteln Methode aussieht.

Also bist Du mit cmp besser bedient, wenn die Zahlen gleich lang sind. Wären sie das nicht, würde wohl sort {(my$c=$a)=~y/-//d;(my$d=$b)=~y/-//d;$c<=>$d} @array helfen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Relais
 2005-01-21 16:42
#51144 #51144
User since
2003-08-06
2261 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=mordur,21.01.2005, 14:20]aber man muss "cmp" statt "<=>" nehmen, sonst gibt es falsche Ergebnisse![/quote][quote=Dubu,21.01.2005, 15:29]Im Gegensatz zu dem, was Relais erzaehlt hat ;) , ist Perl gar nicht so tolerant[/quote]
Hmmm, man sollte also nicht nur testen, sondern auch noch richtig testen.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
Dubu
 2005-01-21 16:57
#51145 #51145
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Nun, 0 bis 9 haben sowohl numerisch als auch alphabetisch sortiert eine wohldefinierte Reihenfolge. Ein Entfernen der Minuszeichen und Auffuellen mit Nullen waere bei alphabetischem Sortieren nur dann noetig, wenn fuehrende Nullen fehlen koennen, z.B. bei einer Angabe wie 2005-1-12. Aber da haettest du auf jeden Fall mehr Aufwand.

Ansonsten ist das alphabetische Sortieren durchaus okay. Eigentlich ist es wesentlich schwieriger, Text alphabetisch richtig zu sortieren - wenn er naemlich nicht nur aus ASCII-Zeichen besteht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl -l
use strict;
use warnings;

my @woerter = qw/Âne Anton Ärger Berta Øre Zeppelin acht ätzend billig zwei 42/;

print join ' < ', sort { $a cmp $b } @woerter;

use locale;

print join ' < ', sort { $a cmp $b } @woerter;

_ _END_ _
42 < Anton < Berta < Zeppelin < acht < billig < zwei < Âne < Ärger < Øre < ätzend
42 < acht < Âne < Anton < Ärger < ätzend < Berta < billig < Øre < Zeppelin < zwei

Also, immer schoen auf die richtige Locale achten, wenn man sie braucht. ;-)
format_c
 2005-01-21 17:13
#51146 #51146
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=Crian,21.01.2005, 15:41]Bei Deinen Strings dürfte er dann nur bis zum ersten - sortieren. Oder rein zufällig. Je nachdem, wie die interne Nummer aus Skalar ermitteln Methode aussieht.

Also bist Du mit cmp besser bedient, wenn die Zahlen gleich lang sind. Wären sie das nicht, würde wohl sort {(my$c=$a)=~y/-//d;(my$d=$b)=~y/-//d;$c<=>$d} @array helfen.[/quote]
oder man pflückt ihn einfach wieder auseinander wie ich oben bereits gemacht hab.

Gruß Alex
esskar
 2005-01-21 19:41
#51147 #51147
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=mordur,21.01.2005, 15:37]Wäre man auf der ganz sicheren Seite, wenn ich die '-' vorher aus dem Datum extrahiere,
also "20050101" statt "2005-01-01" ?[/quote]
ja; aber cmp zu benutzen ist doch viel einfacher ;)
Crian
 2005-01-22 19:41
#51148 #51148
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
sach ich doch :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-01-21 12:26.