perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5310
davon online: 1
weitere User: 18
Click for quality!




10.09.2010 / 05:14

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragSort 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: Sort mit Referenzen
Seitenanfang
Gern geschehen

Datum: 19.06.2007-13:55

-






-
-