Schrift
[thread]11966[/thread]

News nach Datum sortieren

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-06-03 18:50
#110686 #110686
Guten Tag,

ich selbst habe noch nie mit Perl gearbeitet, muß aber eine Website aktualisieren, die z.T. mit Perl erstellt wurde. Leider verstehe ich den Code fast gar nicht.
Es handelt sich konkret um eine News-Seite auf der die Nachrichten nach Datum sortiert werden. Im Moment funktioniert das auch, allerdings wird nur nach Monaten sortiert und die Jahreszahl dabei nicht beachtet.

Hier der Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Keys = sort_keys(@Keys);

foreach my $key (@Keys) {
open FILE, "$DIR/$key" or die "Can't open $DIR/$key: $!\n";
$Text .= "<h4>$DATA{$key}{subject}</h4>\n";
$Text .= "<b>$DATA{$key}{von}</b>\n";
$DATA{$key}{bis} and ($Text .= "&nbsp; <b>$DATA{$key}{bis}</b>\n");

$Text .= '<p>';
while (<FILE>) {
$Text .= $_;
}
($DATA{$key}{link}) and
($Text .= "<br><br><b><a href=\"$DATA{$key}{link}\">... weiter lesen</a></b>");
$Text .= "</p>\n<hr size=\"1\" width=\"80%\">\n";
}
$$CONFIG{actdata} = $Text;

my $T = Template->new({
INCLUDE_PATH => $$CONFIG{templatedir},
POST_CHOMP => 1,
});

print "Content-Type: text/html; charset=$$CONFIG{charset}

";

$T->process('aktuell.html', $CONFIG) || die $T->error();

# Keys nach Datum (von) sortieren:
sub sort_keys {
my (%sort, $sdate, @tmp);
my $i = 0;
foreach my $key (@_) {
$i++;
@tmp = split /\./, $DATA{$key}{von};
$sdate = "$tmp[-2]$tmp[-1]$tmp[0]";
$sort{"$sdate$i"} = $key;
}
@sort{sort keys %sort};
}


Wie könnte dies so erweitert werden, dass die exakte Sortierung (mit einer vierstelligen Jahreszahl) gelingt.

Für jeden Hinweis sehr dankbar!

MfG Lars
Gast Gast
 2008-06-03 20:28
#110688 #110688
Welches Format hat das Datum in "$DATA{$key}{von}" ?
etwa so "<Stunde> <Tag> <Monat>"? Oder enthält es mehr Einträge?
Gast Gast
 2008-06-03 20:48
#110689 #110689
Hallo,

das Datum hat das folgende Format: "Tag.Monat.Jahr" z.B. 08.12.2006 oder auch als von-bis also 08.12.2006-10.12.2006.

MfG Lars
Gast Gast
 2008-06-03 22:30
#110690 #110690
Inzwischen habe ich in einem anderen Forum folgenden Code für eine Datumssortierung gefunden.

Code: (dl )
1
2
3
4
@array = map { $_->[0] } sort { $a->[3] <=> $b->[3] ||
$a->[2] <=> $b->[2] ||
$a->[1] <=> $b->[1] }
map { [$_, split /\./] } @array;


Kann mir vielleicht jemand dabei helfen beides zusammenzufügen? ;-)

MfG Lars
Gast Gast
 2008-06-03 23:11
#110692 #110692
Ich habe den Fehler gefunden:
Er liegt in dieser Zeile vond er funktion "sort_keys"
Code (perl): (dl )
$sdate = "$tmp[-2]$tmp[-1]$tmp[0]";

richtig sollte es heißen:
Code (perl): (dl )
$sdate = "$tmp[2]$tmp[1]$tmp[0]";


Die Funktion ist Geschwindigkeitsoptimiert. Deine vorgeschlagenen Herangehensweise ist um vieles langsamer.


Noch etwas schneller wäre übrigens diese Variante:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub sort_keys {
my %sort;
my $i = 0;
my $d;
foreach (@_) {
$i++;
$d=$DATA{$_}{von};
$sort{substr($d,6,4).substr($d,3,2).substr($d,0,2).$i} = $_;
}
return @sort{sort keys %sort};
}
Gast Gast
 2008-06-03 23:21
#110694 #110694
Hallo,

SUPER!!! Vielen Dank! Es funktioniert!

MfG Lars
Gast Gast
 2008-06-03 23:28
#110695 #110695
Doch noch eine Frage!

Wie muss der Code angepasst werden damit die Sortierung genau anders herum erfolgt, d.h. die jüngste Nachricht ganz oben steht?

MfG Lars
topeg
 2008-06-03 23:44
#110696 #110696
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code (perl): (dl )
return @sort{sort keys %sort};

ersetzen durch:
Code (perl): (dl )
return @sort{reverse sort keys %sort};
Gast Gast
 2008-06-03 23:51
#110698 #110698
Klasse! Danke für die rasche Antwort! Jetzt bin ich voll zufrieden!

MfG Lars
<< >> 9 Einträge, 1 Seite



View all threads created 2008-06-03 18:50.