Toon posts:

[Perl] Splitten gaat niet correct door \n teken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een perl server te maken, en nu wil ik dus gaan splitten op de \0 tekens die ik na elk bericht ontvang van de server. Nu is dit geen probleem totdat er een \n in het bericht staat.

Ik krijg dus bijvoorbeeld de volgende string terug van de client:
code:
1
dit is een tekst\0en hier komt nog meer\n\0en hier een half ontvangen ber

Dit zijn dus 2 en een half bericht. Vervolgens wil ik met een loopje de berichten splitten (1 voor 1) Hiervoor had ik de volgende code bedacht:
Perl:
1
2
3
4
5
6
7
my $string = "dit is een tekst\0en hier komt nog meer\n\0en hier een half ontvangen ber";

while($string =~ m/^(.*?)\0/g)
{
    print $1."\n";
}
print "\n\nNot parsed: " . $string;


Nu verwacht ik de volgende output:
code:
1
2
3
4
5
dit is een tekst
en hier komt nog meer


Not parsed: en hier een half ontvangen ber


Nu krijg ik alleen door het \n teken in de 2e zin:
code:
1
2
3
4
5
dit is een tekst


Not parsed: dit is een tekst en hier komt nog meer
 en hier een half ontvangen ber


Mijn vraag: Hoe zorg ik ervoor dat het wel werkt en ik de verwachte output krijg? (zonder \n te replacen of uriencoden of iets anders)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

In PCRE binnen PHP betekent een . een match op elk teken, behalve een newline. Wanneer je wil dat newlines wel meetellen moet je de dotall-modifier gebruiken. Ik neem aan dat in Perl hetzelfde geldt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Tnx, na wat gegoogled te hebben op dotall zag ik dat er een s achter moest voor single line (en heb ik er maar een replace van gemaakt)...
Perl:
1
2
3
4
while($string =~ s/(.*?)\0//s)
{
    print $1."\n";
}

mocht iemand hetzelfde probleem hebben

[ Voor 13% gewijzigd door Verwijderd op 25-05-2006 15:21 ]