Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7615[/thread]

sort Funktion



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Andreas
 2006-01-12 15:02
#61836 #61836
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hallo an alle,
ich will den Inhalt eines Arrays(aus einer Datei):
nach der 2.Spalte aufsteigend sortieren, verucht hab ich das so:
input:
R43              R0402            14662         2387
C35              C0402            19424         475
C36              C0402            19552         3092
R42              R0402            14800         2685
C38              C0402            20046         4633
R36              R0402            13720         1817
R34              R0402            13228         948
C41              C0402            20449         2142
C42              C0402            20667         3807
R27              R0402            11992         2528

aoutput soll so sein:
C35              C0402            19424         475
C36              C0402            19552         3092
C38              C0402            20046         4633
C41              C0402            20449         2142
C42              C0402            20667         3807
R43              R0402            14662         2387
R42              R0402            14800         2685
R36              R0402            13720         1817
R34              R0402            13228         948
R27              R0402            11992         2528

so hab ichs versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
                  map chomp, @eingang;
                 map $_=[ split(/ +/, $_) ], @eingang;
               
                 push (@eingang2,join(" ",@{$_})) for sort vergl @eingang;

                 
                 sub vergl {
                      return -1 if $$a[1] lt $$b[1];
                     return 1 if $$a[1] gt $$b[1];
                 }


kann mir jemand sagen warum das nicht funzt?

Danke schon mal
Gruß
Andreas
Taulmarill
 2006-01-12 15:08
#61837 #61837
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
my @eingang2 = sort { $a->[1] cmp $b->[1] } @eingang;
das sollte funktionieren und ist sehr viel übersichtlicher.

deine subroutine gibt übrigens kein 0 zurück, wenn die werte gleich sind, ausserdem benutzt du map im "void-kontext", also du verwendest die ausgabe von map nicht. ich würde hier lieber for verwenden:
chomp for @eingang
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Andreas
 2006-01-12 15:18
#61838 #61838
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hi, erst mal Danke für deine Antwort,
bin aber leider ein totaler Anfänger, kannst du das in mein Codeschnippsel einbauen?
Danke
Gruß

andreas
Strat
 2006-01-12 15:23
#61839 #61839
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
warum das nicht funzt? hast du es schon mal mit use strict; und use warnings; ausgefuehrt?

map zu verwenden ohne rueckgabewert finden etwa 95% der guten perl-programmierer sehr schlechten stil, vor allem, wenn es voellig unnoetig ist. wenn es doch mal noetig ist, dann besser for(each)-schleifen verwenden.

Code: (dl )
1
2
3
4
5
6
7
my @lines = <FILE>;
chomp @lines; # chomp kann auch mit listen arbeiten => map unnoetig

my @sorted = map { $_->[1] } # ganze zeile zurueckgeben
sort {$a->[0] cmp $b->[0] } # sortieren nach 2. spalte
map { [ ( split(/ +/) )[1], $_ ] } # 2dim Array bilden: [2.spalte, ganze zeile ]
@lines;

auf meiner HP steht unter perl -> Sortierungen was zur Schwartzian Transform (das ist das map-sort-map-konstrukt)\n\n

<!--EDIT|Strat|1137072338-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2006-01-12 15:31
#61840 #61840
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,12.01.2006, 14:23]map zu verwenden ohne rueckgabewert finden etwa 95% der guten perl-programmierer sehr schlechten stil[/quote]
also ich nicht =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Andreas
 2006-01-12 15:46
#61841 #61841
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hallo Strat,
hab ja nicht behauptet das ich ein guter Programmierer bin;-)
hab deinen Code eingebaut, und es funzt.

Dankeschön

Gruß
andreas
Taulmarill
 2006-01-12 17:27
#61842 #61842
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=pq,12.01.2006, 14:31][quote=Strat,12.01.2006, 14:23]map zu verwenden ohne rueckgabewert finden etwa 95% der guten perl-programmierer sehr schlechten stil[/quote]
also ich nicht =)[/quote]
ernsthaft?

map ist imho genau so wie grep ein sonderfall von for(each). ich versuche diese beiden funktionen eigendlich immer nur dann zu benutzen, wenn sie sich lohnen, also wenn ich die rückgabewerte haben/verarbeiten will. das macht den code imho leichter verständlich.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2006-01-12 17:51
#61843 #61843
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=pq,12.01.2006, 14:31][quote=Strat,12.01.2006, 14:23]map zu verwenden ohne rueckgabewert finden etwa 95% der guten perl-programmierer sehr schlechten stil[/quote]
also ich nicht =)[/quote]
wie sagte schon mein schwiegervater in spe? 5% verlust gibt's immer ;-)

warum verwendest du in einem solchen fall kein for(each)? das finde ich einfacher zu durchschauen und besser ans problem angepasst. Und wenn jemand ein map-in-void-context als letzte zeile einer subroutine verwendet, dann wird's voellig obskur, weil man nicht mehr sagen kann, ob jetzt damit wirklich ein return gemeint ist oder nicht.\n\n

<!--EDIT|Strat|1137081531-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2006-01-12 17:55
#61844 #61844
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Andreas,12.01.2006, 14:46]hab ja nicht behauptet das ich ein guter Programmierer bin;-)[/quote]
aber du hast die chance, ein guter Perl-Programmierer zu werden. Und mit Hilfe von anderen geht's einfach leichter, besser zu werden. Und das ist ja eins der Ziele dieses Forums.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2006-01-12 19:52
#61845 #61845
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Taulmarill,12.01.2006, 16:27][quote=pq,12.01.2006, 14:31][quote=Strat,12.01.2006, 14:23]map zu verwenden ohne rueckgabewert finden etwa 95% der guten perl-programmierer sehr schlechten stil[/quote]
also ich nicht =)[/quote]
ernsthaft?[/quote]
also ich kann mir situationen vorstellen, in denen ich ein map im void
kontext schöner finden würde als ein for.
nicht, dass ich dauernd map im void kontext schreibe, aber ich verteufele
es nicht generell, noch dazu, wo die performance-nachteile wohl in neueren
perls eliminiert sind.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-01-12 15:02.