Schrift
[thread]12352[/thread]

Zeilen einlesen und nach dritter Spalte sortieren (Seite 5)

Leser: 5


<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten
leo11
 2008-08-25 20:28
#113983 #113983
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Ronnie+2008-08-25 09:59:36--
Ein Array - und um nix anderes geht es hier, auch wenn es aufwendig dereferenziert wird - gibt im skalaren Kontext (im Gegensatz zum Listenkontext) seine Länge zurück. Solange nix drin ist, ist die Länge Null und die Bedingung wird als FALSE ausgewertet.

Jetzt ist mir klar geworden. Danke.

Beitrag nachträglich geändert.
Ronnie
 2008-08-25 23:50
#113984 #113984
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@leo11: Da dein Kriterium rein numerisch ist, kann ich dir nur empfehlen dir nochmal Gedanken zum Vorschlag von LanX- zu machen. Die Nutzung von grep ist wesentlich kompakter.
leo11
 2008-08-26 00:34
#113985 #113985
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
@Ronnie
Die Subroutine finde ich sehr intressant, mit grep werd ichs auch mal probieren, sowie einige andere Dinge. Wieso schreibst du: "Da dein Kriterium rein numerisch ist..." Was hat das damit zu tun ob ich eine Sub nehme?

VG leo
---------
Ps.:Perl gefällt mir.
Ronnie
 2008-08-26 00:48
#113986 #113986
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
leo11+2008-08-25 22:34:06--
Die Subroutine finde ich sehr intressant, mit grep werd ichs auch mal probieren, sowie einige andere Dinge. Wieso schreibst du: "Da dein Kriterium rein numerisch ist..." Was hat das damit zu tun ob ich eine Sub nehme?

Meine Überlegung war primär, dass man eine Liste hat die zu einem Teil einem Suchkriterium entspricht. Dann gibt es eine Teilliste vor dem Suchergebnis und eine Teilliste nach dem Suchergebnis. Das Suchkriterium ist aber nicht Bestandteil der Überlegung und könnte sogar als (nicht näher spezifizierte) Code-Referenz an die Funktion übergeben werden.

Wie LanX- schon angedeutet hat, ist eine andere Perspektive leichter: Man hat eine Teilliste in der das Suchkriterium kleiner als der Wert 20 ist, eine in der der Wert 20 ist und eine wo der Wert größer 20 ist. Das kann man bequem bit drei grep-Anweisungen erledigen.
LanX-
 2008-08-26 01:04
#113987 #113987
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Ronnie+2008-08-25 22:48:02--
Wie LanX- schon angedeutet hat, ist eine andere Perspektive leichter: Man hat eine Teilliste in der das Suchkriterium kleiner als der Wert 20 ist, eine in der der Wert 20 ist und eine wo der Wert größer 20 ist. Das kann man bequem bit drei grep-Anweisungen erledigen.


siehe hier http://board.perl-community.de/thread/12352/startW...
du brauchst nur das eine grep mit != in zwei aufzuspalten mit < und > !
edit: link repariert

dein Verarbeitungs-Code wird zum 3-Zeiler ...

@Ronnie: Ts ts ... Rechner aus und zurück an die Hausaufgaben! ;-)
leo11
 2008-08-31 14:21
#114151 #114151
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hallo liebe Perl-Fans,

ich tu mich mit dem sortieren schwer. Ich habe folgende Datenstruktur:

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
my  @zw1 = (
             [ 'z3;;120;;5;;;' ],
             [ 'z4;;121;;52;;;', '52' ],
             [ 'z5;;122;;5;;;' ],
           );
my  @zw2 = (
             [ 'z6;;120;;4;;;' ],
             [ 'z7;;121;;51;;;', '51' ],
             [ 'z8;;122;;5;;;' ],
           );
my  @zw3 = (
             [ 'z9;;120;;6;;;' ],
             [ 'z10;;121;;50;;;', '50' ],
           );       

my %all_zwoelfer_ref =( 
                         zwoelfer1 => \@zw1,
                         zwoelfer2 => \@zw2,
                         zwoelfer3 => \@zw3,
                      );

print Dumper \%all_zwoelfer_ref;

Ich möchte die Keys zwoelfer1, zwoelfer2, zwoelfer3 nach folgenden Inhalten numerisch sortieren:
$all_zwoelfer_ref{'zwoelfer1'}->[1][1]
$all_zwoelfer_ref{'zwoelfer2'}->[1][1]
$all_zwoelfer_ref{'zwoelfer3'}->[1][1]

Im Ergebnis soll folgende Reihenfolge sein:
zwoelfer3
zwoelfer2
zwoelfer1

Hier mein Versuch:
%all_zwoelfer_ref = sort{ $a->[1][1] <=> $b->[1][1] } keys %all_zwoelfer_ref;
Die Fehlermeldung lautet: Can't use string ("zwoelfer3") as an ARRAY ref while "strict refs" in use

VG
leo
MatthiasW
 2008-08-31 14:48
#114152 #114152
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Das muss heißen:
Code (perl): (dl )
my @sorted_keys = map { sort { $_->{$a}[1][1] <=> $_->{$b}[1][1] } keys %$_ } \%all_zw_ref;

Einen Hash als solchen kann man nicht sortieren.
Allerdings gibt es Module, die genau das erlauben. Meistens reicht es aber, wenn man die keys in sortierter Reihenfolge hat.

Der Fehler in deinem Code ist, dass du in $a und $b jeweils einen key des hashes stehen hast.
edit: Sie aber verwendest als wären es values.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
LanX-
 2008-08-31 14:52
#114153 #114153
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
leo11+2008-08-31 12:21:17--
Code (perl): (dl )
%all_zwoelfer_ref = sort{ $a->[1][1] <=> $b->[1][1] } keys %all_zwoelfer_ref;


du versuchst ja die keys zu sortieren. Das 2. Argument ist das Objekt der Sortierung, d.h. $a und $b sind keys, deswegen solltest du auch schreiben

$all_zwoelfer_ref{$a}

Code (perl): (dl )
@all_zwoelfer_ref = sort{ $all_zwoelfer_ref{$a}->[1][1] <=> $all_zwoelfer_ref{$b}->[1][1] } keys %all_zwoelfer_ref;


BEACHTE: das Ergebnis der Sortierung ist aber ein *ARRAY* kein *HASH*, die Sortierung von HASHES ist in Perl per Definition willkürlich.

und '_ref' solltest du auch nicht am Ende schreiben, dann verstehen die Leute deinen Code nicht weil sie denken es handele sich um ein $hash_ref und nicht um ein %hash.
leo11
 2008-08-31 16:06
#114157 #114157
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Quote
BEACHTE: das Ergebnis der Sortierung ist aber ein *ARRAY* kein *HASH*, die Sortierung von HASHES ist in Perl per Definition willkürlich.

D.h ich kann mit der Zeile
Code (perl): (dl )
my @sorted_zwoelfer = sort{ $all_zwoelfer{$a}->[1][1] <=> $all_zwoelfer{$b}->[1][1] } keys %all_zwoelfer;

den Hash in der sortierten Abfolge, definiert in @sorted_zwoelfer, abfragen.
Code (perl): (dl )
1
2
3
for my $x (0..2) {
    print "$all_zwoelfer{$sorted_zwoelfer[$x]}->[1][0]\n";
}

Vielen Dank.
<< |< 1 2 3 4 5 >| >> 49 Einträge, 5 Seiten



View all threads created 2008-08-14 08:06.