Wij Mac-gebruikers zijn er al lang trots op dat we geen commando's hoeven in te typen om onze machines optimaal te benutten. Dat is nog steeds waar, maar nu Mac OS X de Unix-opdrachtregel heeft geopend, hebben we alle tools die nodig zijn om profiteer van enkele krachtige programmeer- en scriptmogelijkheden, zodat onze Macs meer van onze verfoeilijke dingen kunnen doen werk. En is dat tenslotte niet het hele punt van een computer?
Programmeren lijkt veel op koken: een categorie activiteiten die een breed spectrum omvat, van de complexiteit van Ijzeren baas tot de culinaire aanfluiting van een hotdog in de magnetron. Programmeren en koken kunnen beide op veel verschillende vaardigheidsniveaus worden gedaan, maar zelfs amateurkoks kunnen lekker eten maken, net zoals beginnende programmeurs handige scripts kunnen maken. En net als leren koken, kan het leren schrijven van scripts in het begin ontmoedigend lijken.
In deze kolom, de eerste van een serie waarin de geekierde ingewanden van OS X worden onderzocht, leer je hoe je de populaire scripttaal Perl gebruikt, die is ingebouwd in OS X. We laten u zien hoe u een script bouwt dat de regeleinden van een Mac-tekstbestand converteert naar regeleinden die Unix kan interpreteren. (Hierdoor kunnen op Unix gebaseerde tekstverwerkingstools worden gebruikt voor de inhoud van het bestand.) Hoewel het script wordt ontwikkeld lijkt misschien nogal wat moeite, maar de resultaten zullen erg handig zijn als je ooit meerdere tekst moet converteren bestanden. (Voor meer informatie over het specificeren van meerdere bestanden op de opdrachtregel, zie "Beheersing van Mac OS X",
Hoe .) We hopen dat dit voorbeeld zal dienen als een smakelijk voorproefje van de rijke smaken van OS X.Hoe een Perl-script te schrijven
Eerst moet je een teksteditor starten, zoals OS X's TextEdit, BBEdit, of, als je al bekend bent met de opdrachtregel, een van de traditionele Unix-teksteditors zoals pico of vi. Spring er dan meteen in door de volgende regel te typen:
#!/usr/bin/perl -w
Deze eerste regel kondigt aan het besturingssysteem aan dat het te maken heeft met een Perl-script. De -w aan het einde van de regel vertelt Perl dat het bijzonder streng moet zijn in de interpretatie van het script en waarschuwingen moet weergeven als het code tegenkomt die het als verdacht beschouwt. Maak er een gewoonte van om toe te voegen -w aan uw scripts: hierdoor kunt u vaak scriptingproblemen ontdekken en oplossen voordat ze een pijn in de nek worden.
# linebreak-tekens: x0d – Mac, x0a – Unix
In deze lijn, # geeft een opmerking aan voor gebruik door de auteur van het script of iemand anders die het leest, dus Perl negeert de rest van de regel. Deze opmerking legt de codes uit voor de Mac- en Unix-regeleindetekens. Later, buiten de opmerking, de X notatie vertelt Perl dat we hexadecimale getallen gebruiken om regeleinden weer te geven.
{
Perl gebruikt accolades (ook wel accolades genoemd) om stukjes code te groeperen. Deze buitenste set accolades in dit script is een optionele visuele indicator van waar het hoofdgedeelte van het script begint en eindigt.
foreach $inBestandsnaam (@ARGV) {
Het script maakt hier gebruik van voor elk lus om alle namen van bestanden te doorlopen die het script zal converteren naar Unix-leesbare tekst. Elke individuele bestandsnaam wordt opgeslagen in een afzonderlijk element van een array, een verzameling variabelen, genaamd @ARGV, die Perl maakt.
Deze regel vertaalt zich naar "Neem een bestandsnaam van de @ARGV array, zet het in de variabele genaamd $inBestandsnaam, en voer de code uit die tussen de volgende accolades staat; blijf dit doen totdat je geen bestandsnamen meer hebt @ARGV.” In Perl beginnen alle variabelen met de $ karakter behalve arrays (die worden voorafgegaan door @, leuk vinden @ARGV ) en hashes.
open (INTEXTFILE, $inFileName);
Deze regel vertelt Perl om het bestand te openen waarvan het de naam heeft geplukt @ARGV, en maak er een verwijzing naar, die we hebben genoemd INTEXTFIEL. We zullen deze referentie elke keer gebruiken als we uit dit bestand moeten lezen; Perl zou niet weten naar welk bestand we verwezen als we het niet expliciet een naam zouden geven.
open (OUTTEXTFILE, ">". $inBestandsnaam. ".geconverteerd");
Deze regel maakt het nieuwe bestand aan dat onze geconverteerde tekst zal bevatten, en een verwijzing genaamd OUTTEXTFILE. De rest van de regel bevat de naam van het bestand; de > karakter is een afkorting voor "maak het bestand" en heeft eigenlijk geen invloed op de naam van het bestand. De variabele $inBestandsnaam bevat de naam van het originele bestand en het script zal toevoegen .omgezet tot het einde van de naam (zodat het origineel niet wordt overschreven). De punten tussen de elementen van de bestandsnaam vertellen Perl om ze te combineren tot een enkele tekstreeks.
$tekstbestand =;
Deze instructie vertelt Perl om het volledige tekstbestand uit te lezen INTEXTFIEL en zet het in de variabele $ tekstbestand. Zorg ervoor dat het bestand niet te groot is (groter dan ongeveer 100K); hoewel OS X virtueel geheugen in Unix-stijl heeft, kun je er niet van uitgaan dat er exorbitante hoeveelheden geheugen beschikbaar zijn.
Nu voor het zware werk
Deze regel doet al het echte werk in het script en is daarom nogal compact:
$tekstbestand =~ s/x0d/x0a/;
Perl heeft een ingebouwde zoek-en-vervangfunctie, vertegenwoordigd door S. Wanneer u deze functie aanroept, specificeert u waar deze naar moet zoeken en waarmee moet worden vervangen; deze twee strings worden begrensd door / karakters. We willen Mac-eindtekens vervangen door Unix-tekens, dus dat zijn de twee strings die we hebben gebruikt in de zoek- en vervangvelden. Gebruik makend van =~ vertelt Perl om te zoeken en te vervangen op de inhoud van $ tekstbestand en zet het resultaat er dan weer in $ tekstbestand.
print OUTTEXTFILE $textFile;
Zodra de conversie is voltooid, gebruikt u de afdrukfunctie om de inhoud van te schrijven $ tekstbestand naar uw uitvoerbestand.
sluiten (INTEXTFILE);sluiten (OUTTEXTFILE);
Deze eindafrekeningen sluiten de invoer- en uitvoerbestanden af, om de boel netjes te houden. Voeg twee sluithaken toe om uw stukjes code tussen haakjes te beëindigen, en dat is alles.
Als u klaar bent, slaat u dit script op in een bestand met de naam "lineconvert.pl" - zorg ervoor dat u dit bestand Unix-regeleinden geeft. Gebruik vervolgens de opdracht chmod van de opdrachtregel om de kenmerken van het script in te stellen, zodat het besturingssysteem weet dat het een uitvoerbaar script is. Typ hiervoor chmod 744 lineconvert.pl in de opdrachtregel. (Om meer te weten te komen over de chmod commando, voer in man chmod achter de opdrachtregelprompt.)
Uw Perl-script gebruiken
Stel dat u een Mac-tekstbestand met de naam "mac.txt" hebt en dat u wilt dat de inhoud Unix-regeleinden heeft. U roept uw script op door te typen ./lineconvert.pl mac.txt in de opdrachtregel en voert de conversie uit. Je eindigt met een bestand met de naam "mac.txt.converted", met inhoud die Unix-regeleinden heeft. Ta-da! Nu kunt u het script aanpassen om bijvoorbeeld een Unix-naar-Mac-versie te maken.
Een van de vele functies die u aan uw script kunt toevoegen, is verbeterde foutafhandeling. Dit is vooral belangrijk omdat er fouten optreden waar u geen controle over heeft en u niet wilt dat ze uw gegevens vernietigen.
Voorwaarts
Ons voorbeeld introduceert enkele ingrediënten in de grote en goed gevulde keuken die Perl-programmering is. En Perl heeft talloze toepassingen behalve het wijzigen van tekstbestanden: het kan de gaten tussen databases en webservers opvullen om u te helpen dynamische websites te maken. U kunt het zelfs gebruiken om uw MP3-archief te catalogiseren.
Om Perl verder te verkennen, bladert u door CPAN, het Comprehensive Perl Archive Network ( www.cpan.org ). Als u pakketten vindt die nuttig lijken, wilt u misschien aan de slag Perl leren, tweede editie, door Randal L. Schwartz en Tom Christiansen (O'Reilly & Associates, 1997). Als je het als je kookboek voor beginners gebruikt, zul je binnenkort Perl-scripts verzinnen die je tijd en moeite besparen.
Bijdragend redacteur STEPHAN SOMOGYI, een oude MacPerl-gebruiker, is niet langer bang voor reguliere expressies.
Perls of Wisdom: Het schrijven van een Perl-script in de opdrachtregel van OS X kan eenvoudiger zijn dan het lijkt als u onze instructies volgt.