Toon posts:

[Perl]Regeleinden herkennen van Linux/Windows/Mac

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een perlscriptje geschreven dat verschillende typen text-files moet analyseren.
Deze files zijn gemaakt in verschillende omgevingen.
Linux, Windows en Mac.
Perl leest deze files regel voor regel in middels een WHILE-lusje.

Het vervelende is dat Perl afhankelijk van het systeem waar het op draait de regeleinden herkent.

Een regeleinde in een 'linuxfile' is hex 0a.
Een regeleinde in een 'windowsfile' is hex 0d 0a.
En onder MacOS is het hex 0d.

Als ik Perl onder MacOS draai herkent ie alleen de regeleinden die hex 0d zijn.
Onder Windows, 0d 0a. En onder linux 0a.
In het ergste geval kan dit dus resulteren in dat ie een hele file als 1 regel leest.

Is er een functie, een module of een slimme truc zodat Perl weet dat dit allemaal 'regeleinden' zijn?

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

dusty

Celebrate Life!

Wat dacht je van zelf een routine ervoor te schrijven?

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


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
Perl splitst regels op bij de waarde die in $/ staat; die wordt onder verschillende platforms blijkbaar anders geïnitialiseerd, maar je kunt 'm zelf gewoon aanpassen als je weet met wat voor bestanden je te maken hebt (je kan er in theorie ook iets heel anders van maken; een puntkomma om C statements in te lezen bijvoorbeeld).

Als alternatief zou je het hele bestand in een scalar kunnen lezen en dan handmatig splitten met een geschikte regexp (denk aan iets van /(\r)|(\n)|(\r\n)/ ). Als je bestanden daarvoor te groot zijn, kun je nog wel een variant verzinnen die wat met buffering doet, maar dan wordt het wel weer wat ingewikkelder. Probleem is ook dat je je af moet vragen wat er gebeurt wanneer er in een bestand afwisselend verschillende regeleindes voor kunnen komen (in een UNIX file kan bijvoorbeeld wel '\r\n' voorkomen; is dat één regeleinde of is dat een \r-karakter gevolgd door een regeleinde; met andere woorden: komt die \r wel of niet in de regel te staan?) Dit zijn allemaal dingen die je zelf moet maken omdat de beslissing hoe het precies moet werken door jou gemaakt moet worden.

Verwijderd

Topicstarter
dusty schreef op 06 januari 2004 @ 17:00:
Wat dacht je van zelf een routine ervoor te schrijven?
Daar heb ik idd aan gedacht :), maar het leek me akelig als ik achteraf tot de conclusie zou komen, dat er gewoon een functie voor is in Perl.

Maar vooralsnog blijkt die er dus niet te zijn, dus ik ga wel coden. :)

Verwijderd

apt-get install flip

Kan je unix/dos snel mee omzetten, is al 1 probleem verholpen.

Verwijderd

Topicstarter
Verwijderd schreef op 06 januari 2004 @ 18:20:
apt-get install flip

Kan je unix/dos snel mee omzetten, is al 1 probleem verholpen.
apt-get zegt mij niet zoveel. dat is toch 'gewoon' shell-scripting? (even gegoogled)
Ik wil graag in Perl blijven. Anders zou ik bijvoorbeeld ook gsar kunnen gebruiken, maar ik vind dat niet zo'n elegante oplossing.

Maar iig bedankt.

N.B. Het scrippie is trouwens ook bedoeld om onder windows te gaan draaien.
(niet mijn keuze ;) )

Verwijderd

Ik heb ooit voor een soort degelijk iets aparte executable geschreven in delphi, die in 1x de boel (dus alle cr/lf's) omzet naar of dos of unix. Is toch het makkelijkst, mocht het naderhand niet meer nodig zijn, sloop je gewoon de aanroep uit je script.
Pagina: 1