Toon posts:

[Perl] Berichten op alfabetische volgorde

Pagina: 1
Acties:

Verwijderd

Topicstarter
'loo. Ik ben bezig om een scriptje te maken dat nieuwsberichten plaatst en daarnaast headlines ergens apart neerzet. Nu wil ik dus die berichten ordenen naar subject, maar om de één of andere reden wil dat niet lukken...

Hij voegt nu steeds een carriage return teveel toe (2 achter elkaar), waardoor er lege velden in de databasefile ontstaan...

Dit is de code die ik gebruik...

Perl:
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
open(DIR,">$datadir/$CatFile\.dat");

flock(DIR, 2) 
   unless ( !$cgi_use_flock );

foreach $line ( sort byalphabet @data ) {
   chomp($line);
   ($date, $author, $email, $texttime, $subject, $byline, $id, $story) = split(/\|:\|/,$line);
}

sub byalphabet {
   @a = split(/\|:\|/,$a);
   @b = split(/\|:\|/,$b);
   $a[4] <=> $b[4];
}

$write = join(
   "\|:\|",
    $date,
    $author,
    $email,
    $texttime,
    $subject,
    $byline,
    $id,
    $story
);  
$write .= "\n";

print DIR "$write";
print DIR (@data);

flock(DIR, 8) 
   unless (!$cgi_use_flock);
close(DIR);


Iemand enig idee waar de fout in zit?

Sorry voor het verneuken van de layout
edit:
* drm is gelukkig de rotste niet

[ Voor 12% gewijzigd door drm op 20-01-2003 18:10 ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Verwijderd schreef op 20 januari 2003 @ 17:58:
[..]
Iemand enig idee waar de fout in zit?
[..]

Ja.

Wat heb je zelf al gedaan om het te vinden? Waar zit het in iedergeval niet in volgens jou e.d. Of wil je dat we de oplossing op een presenteerblaadje geven?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
dusty schreef op 20 January 2003 @ 18:04:

[...]

Wat heb je zelf al gedaan om het te vinden?
Zo'n beetje alles al geprobeerd. Die chomp en carriage-return-write eruit gehaald en elke combinatie daarvan, maar dat hielp dus niet.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Verwijderd schreef op 20 januari 2003 @ 18:07:
[...]

Zo'n beetje alles al geprobeerd. Die chomp en carriage-return-write eruit gehaald en elke combinatie daarvan, maar dat hielp dus niet.

Aangezien het je eigen code is, leg je code eens regel voor regel uit.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
dusty schreef op 20 January 2003 @ 18:43:

[...]

Aangezien het je eigen code is, leg je code eens regel voor regel uit.
En hoe moet mij dat verder helpen met m'n probleem?

Verwijderd

Verwijderd schreef op 20 January 2003 @ 18:48:
[...]

En hoe moet mij dat verder helpen met m'n probleem?
Als je je eigen code helemaal zou snappen zou je natuurlijk ook weten waar het probleem zit hè... dus vandaar ... :)

Verwijderd

1. je sorteert numeriek ipv alphanumeriek, cmp in plaats van <=>
2. de split binnen de foreach en de join erna lijkt me nogal onzinning. Doe gewoon zo:

Perl:
1
2
3
foreach $line ( sort byalphabet @data ) {
    print DIR "$line";
}

Verwijderd

Verwijderd schreef op 20 januari 2003 @ 19:15:
1. je sorteert numeriek ipv alphanumeriek, gebruik cmp in plaats van <=>
2. de split binnen de foreach en de join erna lijkt me nogal onzinning. Doe gewoon zo:

Perl:
1
2
3
foreach $line ( sort byalphabet @data ) {
    print DIR "$line";
}

Verwijderd

Topicstarter
Verwijderd schreef op 20 January 2003 @ 18:52:
Als je je eigen code helemaal zou snappen zou je natuurlijk ook weten waar het probleem zit hè... dus vandaar ... :)
Ja en toch zie ik het probleem niet... Maar goed.

Eerst wordt de file rewritable geopend met filelocking om ervoor te zorgen dat ie niet tegelijkertijd door een ander script bewerkt wordt. Daar zit het probleem al zeker niet want dat document opnieuw wegschrijven dat doet het.

Daarna laat ik de subroutine van het ordenen op alfabet op de data-array los en wel op elke regel, waarbij elke regel wordt ontdaan van de carriage return en de verschillende velden gesplitst worden (|:| weggehaald) en toe worden gewezen aan een variabele.

De subroutine:

Array @a definieren als de cleane regel a
Hetzelfde voor @b
Vervolgens van array a en array b de variabele met index 4 (subject) met elkaar vergelijken en daarop wordt dus gesorteerd (sort commando regel 6)

Vervolgens wordt elke array (variabele $write) weer voorzien van de |:| tags tussen de individuele variabelen van die array en met een end-write afgesloten met een carriage return.

Die regels worden stuk voor stuk in de database geschreven en vervolgens de gehele data-array.

De file weer unlocken en sluiten.
Pagina: 1