Gegevenstypen in perl. Push- en pop-functies. De afdrukfunctie gebruiken

Met Perl kunt u schrijven krachtige programma's vanaf het allereerste begin, of je nu een beginnende programmeur of een expert bent. Perl-aanbiedingen standaard gereedschap programmeren - vergelijkingsoperatoren, patroonvergelijkende kwantoren, lijstfuncties - en heeft snelkoppelingen voor het invoeren van tekenbereiken. Perl biedt ook bestandstests, zodat u snel kunt vinden wat u zoekt.

De nuttigste bestandstests in Perl

Programmeren met Perl is vrij eenvoudig, dit geldt ook voor de letters die u gebruikt om bestanden te controleren. Bijvoorbeeld, R controleert of het bestand dat kan R eed, een T op zoek naar een bestand T ext. Hier zijn de meeste nuttige testen bestanden in Perl:

Speciale tekens in Perl

Zoals elke programmeertaal gebruikt Perl speciale elftallen Voor speciale karakters, zoals omgekeerde of verticale tabbladen. Dus als u een oproep moet programmeren of piep of alleen een regelterugloop, controleer de volgende tabel voor het teken dat dit teken zal produceren:

Perl Waar-onwaar-vergelijkingsoperatoren

Wanneer u in Perl of een andere taal programmeert, gebruikt u voortdurend vergelijkingsoperatoren. De volgende tabel laat zien algemene vergelijkingen voor Perl in zowel wiskundige als stringvorm:

push (@r, @s)

splitsing(@r, $#r + 1, 0, @s)

Elk nummer

Match 1 of meerdere keren

*

Match 0 of meer keer >?

Dit artikel is geschreven voor mensen die vanwege overmacht voelde dringend de drang om Pearl te bestuderen. Voor mij was deze omstandigheid dat mijn computer een WEB-server werd, en ik dus een WEB-master. Het is gebruikelijk om te leren van de fouten en ervaringen van anderen, daarom breng ik mijn ervaring met het bestuderen van Pearl onder uw aandacht.

Het is onmiddellijk nodig om uit te leggen voor wie dit allemaal is geschreven. Als uw server actief is UNIX-platform, dan zou ik je artikel moeten lezen. Ik heb Windows NT werkstation 4.0 (RUS) plus geïnstalleerd Servicepakket 3. Toen het tijd werd om van mijn computer een WEB-server te maken, haastte ik me naar de ingebouwde Services WEB-knooppunt, maar besefte al snel dat ik het niet leuk vond (waarom?). En toen adviseerde een vriendelijke persoon om Xitami te installeren WEB-server van iMatix Corporation (), dat nog steeds bestaat.

Wat Pearl zelf betreft, het is iets ingewikkelder. Nadat ik verschillende Perl-servers had doorzocht (www.perl.org, www.perl.com), kwam ik erachter dat er zoveel versies van Perl zijn dat het behoorlijk moeilijk is om iets specifieks te kiezen. Tegelijkertijd zijn er geen begrijpelijke aanbevelingen met betrekking tot de keuze voor de ene of de andere versie. Nadat ik bijna alle versies voor Windows had geprobeerd, koos ik voor Active Perl().

Voor iemand die verwend is met allerlei soorten Windows en Delphi is het schrijven van programma's in Perl nogal ongebruikelijk, dus ik raad ten zeerste aan om Perl Builder meteen te installeren. Je kunt het verkrijgen op www.solutionsoft.com. Er was daar een demoversie van dertig dagen.

Welnu, ik denk dat het tijd is om meteen ter zake te komen. Over het algemeen werkt een Pearl-script, net als elk ander programma, als volgt:

  1. ontvangt gegevens
  2. verwerkt gegevens
  3. geeft resultaat

U kunt gegevens op twee manieren naar het script overbrengen: GET en POST. Het verschil tussen hen is dat wanneer met behulp van GET gegevens hangen voortdurend in de adresbalk van de browser, bijvoorbeeld:

http://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta

In dit geval neemt het script B_price.pl de gegevens over omgevingsvariabele QUERY-STRING.

$data=$ENV("QUERY_STRING");

Bij gebruik van de methode POST-gegevens doorgegeven aan standaard invoer script. De lengte van het datablok wordt overgenomen in de CONTENT_LENGTH variabele:

Lezen(STDIN,$data,$ENV("CONTENT_LENGTH"));

Nu moeten deze gegevens worden vertaald in een verteerbare vorm, omdat ze gecodeerd zijn.

De standaardconventie is om spaties te vervangen door plustekens en vervolgens de resterende ongeldige tekens te coderen met behulp van ASCII-codes in hexadecimaal, voorafgegaan door een (%) teken. Voorbeeld:

Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl\?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3

Dit betekent:

Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?\ Category=Video&Description=abvg

Het is beter om de queryreeks voor de eerste keer zelf te decoderen. Op de vraag “hoe?” Er zijn veel antwoorden die geen zin hebben om te herschrijven. Ik zal u slechts een kort voorbeeld geven:

Vervang (+) tekens door spaties

$query = ~ s/\+/ /g;

Vervolgens vervangen we alle combinaties van het (%) teken, gevolgd door hexadecimale cijfers, door de overeenkomstige ASCII-teken

$query =~ s/%((2))/pack("C", hex($1))/eg;

Ik gebruik wat Perl Builder biedt:

#! E:\perl5\bin\perl # roep de routine voor het ophalen van gegevens aan $Category = $field("Category"); # haal gegevens op uit het Categorieveld $Description = $field("Description"); # haal gegevens op uit het beschrijvingsveld $Page = $field("Pagina"); # haal gegevens op uit het paginaveld

Aan het einde van het script plaatsen we een subroutine voor het “transparant” lezen van gegevens.

Sub GetFormInput ( (*fval) = @_ if @_ ; lokaal ($buf); if ($ENV("REQUEST_METHOD") eq "POST") ( read(STDIN,$buf,$ENV("CONTENT_LENGTH")) ; ) else ( $buf=$ENV("QUERY_STRING"); ) if ($buf eq "") (retourneert 0;) else ( @fval=split(/&/,$buf); foreach $i (0 . . $#fval)( ($naam,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(.. )/pack("c",hex($1))/ge; $naam=~tr/+/ / $naam=~ s/%(..)/pack("c",hex($1))/ ge; if (!defined($field($name))) ( $field($name)=$val; ) else ( $field($name) .= ",$val"; #if je meerdere selecties wilt om naar een array te gaan, verander naar: #$field($name) .= "\0$val" ) return 1;

De tweede fase van het script – gegevensverwerking – is geheel naar eigen goeddunken. Controleer de ontvangen gegevens op nauwkeurigheid, schrijf ze naar een bestand, doe wat je wilt.

Ten slotte moet u enkele resultaten aan de browser van de klant doorgeven, zodat de browser deze correct weergeeft. Dat wil zeggen dat u de resultaten in HTML moet weergeven. Dat gaat eenvoudig: (kan ook op verschillende manieren)

Afdrukken "Inhoudstype: tekst/html", "/n/n"; #vereiste regelafdruk "

In het veld Categorie heeft u het volgende ingevoerd: ", $Category, "

Dit geldt allemaal voor scripts die gegevens ontvangen van een formulier op een HTML-pagina. In dit geval is de pagina met het formulier afzonderlijk, het script is afzonderlijk. Je kunt het mooier en handiger maken: combineer de pagina en het script tot één geheel. Om dit te doen, is het script geschreven volgens het volgende schema:

  1. Wanneer het voor het eerst wordt gelanceerd, wordt het script getekend HTML-pagina met een formulier en een link in de ACTION-tag naar zichzelf. De eerste run wordt bepaald door het ontbreken van invoergegevens.
  2. Als er inputgegevens zijn, dan ontvangen wij deze, verwerken deze en produceren resultaten.

#! E:\perl5\bin\perl if (($ENV("QUERY_STRING") eq "") of ($ENV(CONTENT_LENGTH)=0)) ( # een pagina genereren met het formulier ) else (# gegevens ontvangen, verwerken en voer het resultaat uit)

Gastenboek

Het algemene algoritme voor het gastenboek is als volgt:

1. Als een bezoeker een aantekening in het boek wil maken, dan
1.1 Gegevens verkrijgen
1.2 Schrijf ze naar een bestand of database
1.3 Wij bedanken HTML en stellen voor om andere artikelen te lezen
2. Als de bezoeker de vermeldingen in het boek wil lezen, dan
2.1 Records uitlezen uit een bestand of uit een database
2.2 We geven ze prachtig weer in HTML

Voor het gemak van de waarneming heb ik de punten 1 en 2 geformatteerd met afzonderlijke scripts respectievelijk add_guestbook.pl en read_guestbook.pl. Gastenboekberichten worden opgeslagen in tekstbestand regel voor regel, d.w.z. voor elk record is er een regel. Dit wordt gedaan om dit bestand gemakkelijker leesbaar te maken. Voorbeeld van één invoer:

Za 5 december 13:31:20 1998&Natasha&student&Goed&Goed om te beginnen. Ik wens je succes op dit gebied, Alexander!&no@yet&194.226.60.34

Hier vindt u een beschrijving van de velden in het betreffende gastenboek.

  • Naam - voornaam, achternaam, patroniem, bijnaam - naar goeddunken van de bezoeker
  • Werk - beroep, beroep
  • RadioButton - drie knoppen: ik vond het leuk (goed), ik vond het niet leuk (slecht), het kan me niet schelen (anders)
  • Tekst - tekstvak met opmerkingen en notities
  • E-mail - retouradres

Toevallig ken ik minstens twee mensen die Perl zouden willen leren. Ik besloot dit bericht speciaal voor hen te schrijven.

  • Deel 1: Typen variabelen (je leest dit deel)

Daar vindt u voorbeelden eenvoudige programma's uit de serie “printnummers van 1 t/m 5” en dergelijke. Ik heb altijd graag van voorbeelden geleerd - het is interessanter en sneller dan uit boeken of seminars. Je kunt ook de berichten op deze blog bekijken, de kans is groot dat je daar meer voorbeelden vindt.

Ik neem aan dat je op school/instituut Pascal/Delphi, C of in ieder geval Basic hebt gestudeerd, en het is niet nodig om uit te leggen wat een functie en loops zijn. Als dit niet het geval is, is het oké, alleen om erachter te komen, zul je moeten uitgeven extra tijd voor het lezen van Wikipedia. Als je niet weet hoe je een bash-script moet uitvoeren, of waarom je in de eerste regel van het script zoiets zou moeten schrijven als #!/bin/sh, je zult een beetje moeten googlen om erachter te komen.

Speciaal voor degenen die geïnteresseerd zijn in de vragen “is het waar dat Perl erg ingewikkeld is”, “welke boeken over Perl kun je aanbevelen” en zelfs “uh... is het nog steeds in Perl geschreven?”, schreef ik een Mini- Veelgestelde vragen over Perl, die u kunt lezen op HabraHabr. En voor degenen die versterkte niet veel letters Hier geef ik er een korte samenvatting van:

  • Perl- moderne taal programmeren waarin ze schrijven en nog heel lang zullen blijven schrijven.
  • Perl heeft, net als elke andere programmeertaal, zijn voordelen, nadelen en toepassingen. Bestaat echt groot klasse van problemen die Perl oplost met 5+.
  • De Perl-syntaxis is niet complexer dan de C++- of Java-syntaxis. Je kunt dit verifiëren door dit bericht tot het einde te lezen.
  • Er zijn goede, maar toch goedkope Perl-tutorials. U kunt ook gemakkelijk online een gemeenschap van Perl-programmeurs vinden die uw moedertaal spreken.
  • Perl werkt goed onder beide besturingssystemen UNIX-familie, en onder Evil Windows.

Toevoeging: Ik raad je ook aan om de artikelen Perl vs Python vs Ruby vs PHP en Priests of Programming te lezen. De eerste gaat over de prestaties van verschillende scripttalen, de tweede over PHP-verschillen uit andere talen. Voor Python-fans raad ik je aan het artikel Python-scriptprestatietest te lezen. Ik hoop dat dit materiaal je zal helpen het antwoord te vinden op de vraag “wat is er goed aan Perl.”

Hallo %gebruikersnaam%!

Laten we dus alvast ons eerste Perl-script schrijven!

#!/usr/bin/perl

$naam = shift() ;
print("Hallo, $naam! \N") ;

Laten we het script uitvoeren:

$ chmod u+x 1 .pl
$ ./ 1 .pl afiskon
Hallo afiskon!

Alles is hier heel eenvoudig:

  • De namen van scalaire variabelen (dat wil zeggen, niet matrices of hashes, wat ze zijn - zie hieronder) beginnen met een dollarteken.
  • De shift-functie retourneert het volgende scriptargument. Met andere woorden: de eerste aanroep van shift() retourneert het eerste argument, de tweede aanroep retourneert het tweede argument, enzovoort.
  • De functie print() drukt de als argument doorgegeven tekenreeks af.
  • U kunt variabele waarden in de regel vervangen (zie regel 4). Voor meer informatie over snaren, zie hieronder.

Als het nog niet helemaal duidelijk is, is dat geen probleem. Misschien zal een beetje theorie wat meer duidelijkheid brengen.

Variabele typen

Er zijn drie hoofdtypen variabelen in Perl: scalairen(cijfers en tekenreeksen), arrays- vergelijkbaar met die gebruikt in Pascal of C (soms worden arrays ook vectoren genoemd), en hasj (associatieve arrays).

Scalairen die we al in het vorige voorbeeld gebruikten. Hier volgen nog enkele voorbeelden van het specificeren van scalairen.

#!/usr/bin/perl

$a = 123 ;
$b = - 7,496;
$c = 0xABC; # is gelijk aan 2748, ja, het is een opmerking :)
$d = ($a + $b) / $c;
$d *= $a; # hetzelfde als $d = $d * $a;

$str1 = "hallo";
$str2 = "$str1, wereld" ; # $str2 bevat "hallo, wereld"
$str3 = $een. " \N". $str2;
$str4 = "$str1" ; # $str4 bevat "$str1", niet "hallo"

Hier stellen we positief en negatief, geheel getal en in fractionele getallen, stel het getal in hexadecimale codering in, optellen, vermenigvuldigen en delen - alles is zoals in C of Java. Naast de bovenstaande bewerkingen ondersteunt Perl ook de machtsverheffingsbewerking:

$a = 2 ** 8 ;

# resultaat: 256 Met strings is alles ongeveer hetzelfde als in sommige PHP. De punt betekent de aaneenschakelingsbewerking (dat wil zeggen, het aan elkaar plakken van strings); de string bevat variabelenamen, waarden worden op hun plaats vervangen; symbolen kunnen worden ingevoegd met behulp van een backslash(\n), tabs (\t), aanhalingstekens (\"), de backslash zelf (\\), het dollarteken zonder enige vervanging van variabelen (\$) en nog veel meer. Als de string in enkele aanhalingstekens, worden de symbolen daarin geïnterpreteerd “zoals ze zijn”, zonder vervanging van variabelen, enz.

Net als PHP interpreteert Perl scalaire waarden als getallen of tekenreeksen, afhankelijk van de bewerking. Het is eenvoudig:

$int1 = "11" + 22;
# ^ de string "11" wordt omgezet in een getal,
# waarna optelling wordt uitgevoerd, resultaat: 33.
$str1 = "11" .
22;
# ^ het getal 22 wordt omgezet in een string,

# waarna aaneenschakeling wordt uitgevoerd, is het resultaat "1122".

De regels voor het converteren van een string naar een getal en omgekeerd zijn dezelfde als in PHP:
$str1 = 0 .
"abc";
# ^ het resultaat is "abc", het getal nul wordt geconverteerd naar de lege string
$int1 = "aaa" + 1;
# ^ resultaat is 1, er staan ​​geen getallen in de string "aaa"

$int2 = "12aaa" + 1; # ^ resultaat is 13, alleen de eerste cijfers van de string worden in aanmerking genomen Trouwens, voor de aankondiging

lange rijen
Er zijn speciale operatoren - q en qq:
# vergelijkbaar met enkele aanhalingstekens
} ;
$tekst = q (
Heb je $15?
# vergelijkbaar met dubbele aanhalingstekens
$bericht = qq (
} ;

Hallo, $gebruikersnaam! Hoe is het met je?

#!/usr/bin/perl

Werken met arrays
gebeurt als volgt: $scalair = "bebebebe" ;
($a, $b) = (1, 2);
# hetzelfde als $a = 1; $ b = 2; \N";
@arr = ("aaa" , 123 , $scalar , $a + $b ) ;
print $arr[1] . " \N";

druk op @arr, $a; printpop (@arr) . " Hier maken we een array @arr bestaande uit 4 elementen (regel 5). Vervolgens voeren we het tweede element uit (regel 6). De nummering van de elementen begint vanaf nul, dus index 1 wordt gebruikt om het tweede element weer te geven. Vervolgens plaatsen we de waarde van de variabele $a aan het einde van de array (push-functie, regel 7), en halen deze onmiddellijk op en geven deze weer (().

pop-functie

, regel 8). Houd er rekening mee dat arraynamen beginnen met "dog" en niet met dollar (het is niet moeilijk te onthouden - de overeenkomstige symbolen zijn vergelijkbaar met de eerste letters van Engelse typenamen: $ - scalair, @ - array). Bij toegang tot het tweede array-element (regel 6) werd het dollarteken gebruikt omdat het array-element scalair is. In eerste instantie zorgt dit voor veel verwarring, maar over het algemeen is alles logisch. Ook in dit script noemen we

printfuncties

en druk zonder haakjes. In Perl kunnen bij het aanroepen van een functie, waar deze geen dubbelzinnigheid veroorzaakt, de haakjes worden weggelaten.
Om een ​​array te declareren waarvan de elementen strings zonder spaties zijn, is er een speciale operator - qw:

@arr = qw/aaa bbb ccc/ ; zijn vergelijkbaar met arrays, maar de elementen in de hash zijn niet geordend. In dit geval kunnen strings worden gebruikt als sleutel waarmee toegang wordt verkregen tot een element.

#!/usr/bin/perl

%hash = ( # bij het declareren van hashes en arrays kan dat
"x" => 12, # gebruik regeleinden
y => 53 , # als er geen speciale tekens in de sleutel voorkomen, zijn aanhalingstekens niet nodig
"z" => - 10,5, # Je kunt aan het einde een komma achterlaten
) ;

$hash("x"++); # x-coördinaat is nu 13
$hash (y) --; # y-coördinaat is nu 52

# weergavecoördinaten
afdrukken "x = $hash(x), y = $hash(y), z = $hash(z)\n ";

Hash-namen beginnen met een procentteken en worden gebruikt om naar een element te verwijzen. beugel(niet vierkant, zoals het geval is bij arrays). Als de sleutelnaam vooraf bekend is, kunt u deze zonder aanhalingstekens opgeven (regel 10).

Overigens zijn de variabelen $test, @test en %test volledig onafhankelijke variabelen van verschillende typen.

Op dit punt wilde ik naar toe voorwaardelijke uitspraken en for/while loops, maar ik realiseerde me dat er al te veel tekst is voor één bericht. Ondertussen blijven er achter de schermen veel vragen bestaan:

  • Voorwaardelijke verklaringen;
  • For- en while-lussen;
  • Verklaring van functies;
  • Werken met streams en bestanden;
  • Strikte syntaxis;
  • Met behulp van kant-en-klare modules en lessen.

Ik zal hierover schrijven in een van de volgende berichten. Ik zou graag op zijn minst een paar reacties op dit bericht willen ontvangen: interessant/oninteressant, begrijpelijk/onbegrijpelijk, enzovoort. Trouwens, als je vragen hebt over Perl (niet noodzakelijkerwijs gerelateerd aan dit bericht), stel ze dan gerust in de reacties!

Ik hoop dat deze reeks berichten over programmeren in Perl je zal helpen bij het schrijven van je eerste eenvoudige scripts. In de loop van de tijd zullen scripts complexer worden en nieuwe technologieën gebruiken (OOP, reguliere expressies) en na een tijdje zult u merken dat u genoeg over Perl weet om uw ervaringen met anderen te delen.

Het voorwoord zou naar onze mening de lezer informatie moeten geven op basis waarvan hij beslist of hij dit boek nodig heeft.

Waar gaat ons boek over? Het gaat natuurlijk over de Perl-taal, want dat staat in de titel. Wie heeft het nodig, deze Perl? Degenen die CGI-scripts maken, het systeem beheren door scripts te schrijven in plaats van op de linkermuisknop te klikken, teksten verwerken en vele andere taken oplossen gerelateerde gebieden en heeft tegelijkertijd een krachtige, maar gebruiksvriendelijke tool nodig waarmee je kunt creëren grote programma's en kleine programma's en probeer ze snel uit. Het is ook nuttig voor degenen die programmeerles geven om deze taal te begrijpen, omdat het interessante eigenschappen heeft die ontbreken in traditionele programmeertalen die in het leerproces worden gebruikt.

We houden van enkele kenmerken van de taal: de afhankelijkheid van het resultaat van de context, associatieve arrays, het typeglob-gegevenstype, pakketten, de implementatie van objectgeoriënteerd programmeren en, natuurlijk, tekstverwerkingsfaciliteiten. Als je er niet in geïnteresseerd bent om er tenminste achter te komen wat het allemaal betekent, dan kun je het boek wegleggen. Als je alles wat hierboven staat al weet, kun je het ook terzijde leggen, want dit boek is bedoeld voor lezers die net op eigen kracht Perl beginnen te leren.

Perl-taal gemaakt systeem programmeur Larry Wall als een UNIX-tool waarmee je grote scripts van programma's die individuele functies uitvoeren aan elkaar kunt lijmen om een ​​reeks problemen op te lossen die verband houden met administratie, tekstverwerking, enz. Later ging het verder dan dit raamwerk en veranderde het in een echte programmeertaal. taal die veel van de trends weerspiegelt die de afgelopen tien jaar in de programmeertechnologie zijn ontstaan ​​en die in verband met de ontwikkeling van internet wijdverspreid is geworden. Perl is het belangrijkste hulpmiddel voor het maken van CGI-applicaties, handig voor het oplossen van problemen bij het beheren van webservers, e-mail en andere systemen. Dankzij de snelheid en het gemak waarmee scripts in deze taal kunnen worden geschreven, heeft het zich naar andere platforms verspreid: DOS, Windows, OS/2, Mac, VMS, enz. Een van de belangrijkste voordelen van de Perl-taal is de openheid en toegankelijkheid ervan. IN Internetnetwerken je kunt het volledig gratis krijgen bronteksten de perl-interpreter (Perl is een geïnterpreteerde taal, wat in sommige gevallen een voordeel is) en de uitbreidingsmodules ervan.

Dit boek is een zelfinstructiehandleiding voor de Perl-taal, die, zoals ze zeggen, helemaal opnieuw wordt bestudeerd, d.w.z. er wordt aangenomen dat de lezer niet bekend is met deze taal - hij zal alles leren wat hij nodig heeft door de onderwerpen consequent te bestuderen en het consolideren van de behandelde stof, het beantwoorden van vragen en het uitvoeren van oefeningen, gegeven aan het einde van elk hoofdstuk. Laten we herhalen dat het voorgestelde materiaal alleen de basisprincipes van de Perl-taal vertegenwoordigt. Dit boek is op geen enkele wijze bedoeld als leerboek over Perl-programmeren. Daarin vind je geen programmeermethodiek of kant-en-klare recepten voor het oplossen van problemen, dat is ook niet het geval gedetailleerde beschrijving de meest gebruikte modules en het oplossen van problemen met hun hulp, maar na het lezen van het boek zul je het verwerven basiskennis, waarmee u elk Perl-script kunt begrijpen.