|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Sort mit Referenzen
|
Seitenanfang |
| Hallo, ich komme an dieser Stelle nochmal auf eine Antwort von dash vor einigen Wochen zurück, der mir bei der unten stehenden Sortier-Routine unter die Arme gegriffen. Ich bin dabei mein Skript etwas anzupassen und komme an folgender Stelle nicht weiter. Ich übergebe einer Subroutine ein Array, in dem Array-Referenzen gespeichert sind und sortiere nach den Daten der ersten Referenz.
sub sort{ @class = @_; print "@{$_}\n" for sort { $a->[0] <=> $b->[0] } @class; }
Eigentlich will ich jedoch nur auf das jeweils erste Elemente zurückgreifen, also auf
@{$_}[0]
Aber
my @sorted = sort { $a->[0] <=> $b->[0] } @class;
liefert kein Ergebnis. Auch hatte ich keinen Erfolg @{$_}in ein Array zu pushen - müsste doch eigentlich gehen, oder!?Danke für eure Hilfe, LarsVegas
Datum: 15.06.2007-18:38

|
re: Sort mit Referenzen
|
Seitenanfang |
Was benoetigst du letztendlich, das zweite Codestueck, ein Array @sorted? Die ersten Elemente der sortierten Arrayreferenzen in einen Array? Geht nicht so richtig aus obiger Frage hervor. #!/usr/bin/perl use strict; use warnings; my @class = ([qw(bba bbb bbc)], [qw(cca ccb ccc)], [qw(aaa aab aac)]); my @sorted = sort { $a->[0] cmp $b->[0] } @class; print $_->[0], "\n" for @sorted;
sortiert das Array class nach der ersten Spalte und dann nur diese aus.
Datum: 15.06.2007-19:03

|
re: Sort mit Referenzen
|
Seitenanfang |
| Hallo dash, danke für deine schnelle Antwort. Ich benötige letztendlich nur das erste Element des Arrays @sorted. Ich sortiere in der Subroutine nach der geringsten Distanz und will dann nur dieses Element auslesen. Also im Grunde $sorted[0]. Da hier mit Referenzen gearbeitet wird dachte ich ich, könnte so auf das Element zugreifen:
@{$sorted}[0]
Aber das klappt nicht. Wo liegt der Fehler? Nochmal kurz zusammengefasst: Nicht die erste Spalte ausgeben, sondern das erste Element der ersten Spalte ausgeben. Danke! LarsVegas
Datum: 16.06.2007-17:15

|
re: Sort mit Referenzen
|
Seitenanfang |
Weil..., wenn @sorted so deklariert ist wie im Code oben, also
my @sorted = sort { $a->[0] cmp $b->[0] } @class
dann ist @sorted ein Array (bzw. in diesen Fall ein AoA) und keine Arrayreferenz. Und so greift man auf "die erste ZEILE" und davon das erste Element ("die erste Spalte") zu
$sorted[0]->[0]; # oder kuerzer $sorted[0][0];
Das Konstrukt
@{$sorted}[0];
dereferenziert $sorted als Array und holt von diesen Array das erste Element. $sorted ist hier eine Skalarvariable, die eine Arrayreferenz enthalten muss, oben haben wir aber keine Skalarvariable sondern ein Array namens 'sorted' ('strict' und 'warnings' geben Aufschluss).In den folgenden print-Anweisungen werden die gleichen Elemente ausgegeben, einmal vom Array und einmal von der Arrayreferenz
my @sorted = ([ '...', ], [ '...' ], ); my $sorted = \@sorted;print $sorted[0], "\n"; print @{$sorted}[0], "\n";
Datum: 16.06.2007-19:13

|
re: Sort mit Referenzen
|
Seitenanfang |
| Hallo, danke für die gute Erklärung! Dass @sorted ein Array ist, war auch meine ursprüngliche Grundannahme! Also habe ich versucht das erste Element auch so auszugeben wie du es vorschlägst:
print $sorted[0]->[0];
Use of uninitialized value...bekomme ich in diesem Fall als Fehlermeldung. Eine korrekte Ausgabe erhalte ich nur, wenn ich zusätzlich
,"\n"
notiere. Was hat es damit auf sich!??Greets, LarsVegas
Datum: 18.06.2007-10:18

|
re: Sort mit Referenzen
|
Seitenanfang |
Wenn die Fehlermeldung auftritt dann ist der Wert der Variablen die du ausgibst undefiniert. Wichtig ist du hast 'strict' und 'warnings' an
use strict; use warnings;
sollte es naemlich sein dass du auf eine nicht existierende Variable zugreifst (falsche Syntax beim Dereferenzieren) kommt entsprechend eine Meldung.Dann binde einmal das Modul Data::Dumper ein und gib die Ergebnisse von sort damit aus
use Data::Dumper; my @sorted = sort { $a->[0] <=> $b->[0] } @class; print Dumper \@sorted;
poste dann hier die Ausgabe, bzw. wenn da nichts vernuenftiges bei rauskommt, dann poste die Ausgabe von
print Dumper \@class;
Ohne diesen Ausgaben kommen wir naemlich sonst hier nicht weiter, weil deine Datenstruktur vermutlich eine andere ist als bislang angenommen.
Datum: 18.06.2007-18:29

|
re: Sort mit Referenzen
|
Seitenanfang |
>> Use of uninitialized value...bekomme ich in diesem Fall als Fehlermeldung. Eine korrekte Ausgabe erhalte ich nur, wenn ich zusätzlich >> >> >> ,"\n" >> >> notiere. Was hat es damit auf sich!??Es ist moeglich dass nur manche Arrayelemente einen undefinierten Wert haben, deshalb ist generell bei der Ausgabe darauf zu pruefen 'if(defined $var)' und ggf. einen Standardwert (Leerstring) zu setzten.
Datum: 18.06.2007-18:32

|
re: Sort mit Referenzen
|
Seitenanfang |
| Hallo, ich hatte zunächst nicht bedacht, dass einige @class-Arrays, die ich der Subroutine übergebe leer sein könnten. Das variert von Datensatz zu Datensatz. Auf den Trichter bin ich dann aber auch gekommen und habe
my $len = @class; if ($len == 0){return;}
in die Subroutine angebaut, worauf das Skript nun ohne Fehlermeldung läuft. Vielen Dank in jedem Fall für die zahl- und hilfreichen Hinweise!Gruß, LarsVegas
Datum: 19.06.2007-11:59

|
re: Sort mit Referenzen
|
Seitenanfang |
| Gern geschehen
Datum: 19.06.2007-13:55

|
|

|

|

|
 |

|

|
|