Perle

Perle
Utvikler(e)
Larry Wall
https://www.perl.org/ og https://dev.perl.org/perl5/
Generell informasjon
Vanlige utvidelser pl og pm
Paradigme multi-paradigme , funksjonell , imperativ , objektorientert ( klassebasert ), refleksiv , prosedyremessig , hendelser , generisk
Dukket opp i 18. desember 1987 (34 år, 9 måneder og 28 dager)
Designet av Larry Wall
Siste stabile versjon

5.36.0 [ 1 ]​ / 28. mai 2022 (4 måneder og 18 dager)

5.34.1 [ 2 ]​ / 13. mars 2022 (7 måneder og 2 dager)
Siste versjon i tester 5.37.0 [ 3 ] ​( 28. mai 2022 (4 måneder og 18 dager))
type system dynamisk
implementeringer Perl, mod_perl, embperl
dialekter Pearl 5, Raku
påvirket av AWK , Smalltalk 80 , Lisp , C , C++ , Pascal , sed , Unix shell
har påvirket Python , PHP , Ruby , ECMAScript , LPC , Windows PowerShell , JavaScript , Falcon
Operativsystem På tvers av plattformer , mange (over 100)
Tillatelse GPL , kunstnerisk lisens

Perl er et programmeringsspråk designet av Larry Wall i 1987 . Perl låner funksjoner fra C -språket, Bourne shell ( sh ) tolket språk , AWK , sed , Lisp , og i mindre grad mange andre programmeringsspråk.

Strukturelt sett er Perl basert på en blokkaktig stil som C eller AWK, og ble bredt tatt i bruk for sin tekstbehandlingsdyktighet og har ingen av begrensningene til andre skriptspråk .

Historikk

Larry Wall begynte å jobbe på Perl i 1987 mens han jobbet som programmerer hos Unisys [ 4 ] og annonserte versjon 1.0 på comp.sources.misc-nyhetsgruppen 18. desember 1987. Språket ekspanderte raskt i løpet av de neste årene. Perl 2, utgitt i 1988 , brakte en bedre motor for regulært uttrykk. Perl 3, utgitt i 1989 , la til støtte for binære data.

Fram til 1991 var den eneste dokumentasjonen for Perl en enkelt (og stadig lengre) Unix-man-side. I 1991 ble Programmering Perl ( kamelboken ) utgitt og ble de facto referansen for språket. Samtidig hoppet Perls versjonsnummer til 4, ikke for å markere en stor endring i språket, men for å identifisere versjonen som var dokumentert i boken.

Perl 4 brakte med seg en rekke vedlikeholdsutgivelser, som kulminerte i Perl 4036 i 1993. På dette tidspunktet forlot Larry Wall Perl 4 for å starte arbeidet med Perl 5. Perl 4 ville forbli på den versjonen til i dag.

Perl 5-utviklingen fortsatte i 1994 . Perl5 -porters postliste ble etablert i mai 1994 for å koordinere arbeidet med å portere Perl 5 til forskjellige plattformer. Det er det fremste forumet for Perl 5-utvikling, vedlikehold og portering.

Perl 5 ble utgitt 17. oktober 1994. Det var en nesten fullstendig omskrivning av tolken og la til mange nye funksjoner til språket, inkludert objekter, referanser, pakker og moduler. Viktigere, moduler gir en mekanisme for å utvide språket uten å endre tolken. Dette gjorde at hovedkjernen ble stabilisert, i tillegg til at Perl-programmerere kunne legge til nye funksjoner til den.

Versjon [ 5 ] Oppdatering [ 6 ]
Gammel versjon, uten teknisk støtte:5.4 1999-04-29
Gammel versjon, uten teknisk støtte:5.5 2004-02-23
Gammel versjon, uten teknisk støtte:5.6 2003-11-15
Gammel versjon, uten teknisk støtte:5.8 2008-12-14
Gammel versjon, uten teknisk støtte:5.10 2009-08-22
Gammel versjon, uten teknisk støtte:5.12 2012-11-10
Gammel versjon, uten teknisk støtte:5.14 2013-03-10
Gammel versjon, uten teknisk støtte:5.16 2013-03-11
Gammel versjon, uten teknisk støtte:5.18 2014-10-02
Gammel versjon, uten teknisk støtte:5.20 2015-09-12
Gammel versjon, uten teknisk støtte:5.22 2017-07-15
Gammel versjon, uten teknisk støtte:5.24 2018-04-14
Gammel versjon, uten teknisk støtte:5,26 2018-11-29
Gammel versjon, uten teknisk støtte:5,28 2020-06-01
Gammel versjon, uten teknisk støtte:5.30 2020-06-01
Gammel versjon, uten teknisk støtte:5,32 2021-01-23
Gammel versjon, med teknisk støtte:5,34 2022-03-13
Nåværende stabil versjon: 5,36 2022-05-27
Siste versjon planlagt for utgivelse:5,37 2022-05-27
Fremtidig utgivelse:7.0 2023?
Legende:
Gammel
versjon Gammel versjon,
Støttet Gjeldende versjon
Siste versjon Planlagt
fremtidig utgivelse

Den 26. oktober 1995 ble Comprehensive Perl Archive Network (CPAN) opprettet . CPAN er en samling nettsteder som er vert for og distribuerer Perl-kilder, binærfiler, dokumentasjon, skript og moduler. Opprinnelig måtte hvert CPAN-nettsted nås via sin egen URL; i dag omdirigerer http://www.cpan.org automatisk til en av CPANs hundrevis av speillager.

Fra og med 2008 fortsetter Perl 5 å opprettholdes. Viktige funksjoner og noen viktige konstruksjoner er lagt til, inkludert Unicode -støtte , tråder , sterk støtte for objektorientert programmering og andre forbedringer.

Navn

Perl ble opprinnelig kalt "Pearl". Larry Wall ønsket å gi språket et kort navn med positive konnotasjoner; Han hevder at han så på (og avviste) alle kombinasjonene av tre og fire bokstaver i ordboken. Han vurderte også å navngi ham etter kona Gloria. Wall oppdaget før den offisielle utgivelsen at et programmeringsspråk kalt PEARL allerede eksisterte og endret stavemåten til navnet.

Navnet begynner vanligvis med store bokstaver ( Perl ) når det refereres til språket og med små bokstaver ( perl ) når det refereres til selve tolkeprogrammet fordi Unix-filsystemer er store og små bokstaver. Før utgivelsen av den første utgaven av Programmering Perl var det vanlig å referere til språket som perl ; Randal L. Schwartz tvang imidlertid navnet til å skrives med stor bokstav i boken slik at det skulle skille seg bedre ut når det ble skrevet ut. Skillet ble deretter vedtatt av samfunnet.

Navnet blir av og til beskrevet som " PERL " ( for praktisk utvinning og rapportspråk ) . Selv om denne utvidelsen har vært utbredt i mange gjeldende manualer, inkludert Perl-man-siden, er det et retro-akronym og offisielt betyr navnet ingenting. PERL-stavingen med stor bokstav brukes derfor som sjargong for å oppdage individer utenfor fellesskapet. Imidlertid har flere retro-akronymer blitt foreslått, inkludert den komiske Pathologically Eclectic Rubbish Lister .

Kamelsymbolet

Perl er generelt symbolisert av en en-pukkel kamel (arabisk eller dromedar kamel ), som var bildet valgt av utgiveren O'Reilly for forsiden av Programmering Perl , som følgelig fikk navnet The Book of the Camel . [ 4 ] O'Reilly eier dette symbolet som et varemerke, men sier at det bruker sine juridiske rettigheter kun for å beskytte "integriteten og virkningen av dette symbolet" . [ 7 ] O'Reilly tillater ikke-kommersiell bruk av symbolet, og tilbyr programmeringsrepublikken Perl -logoer og Powered by Perl - knapper .

I noen år, og for å unngå denne typen problemer med den kommersielle lisensen, har Perl Foundation utviklet nye logoer basert på en løk, som et resultat av de årlige konferansene som Larry Wall tilbyr med tittelen: State of the Onion (« State of la Cebolla") Onion uttales veldig lik Union , så det høres ut som State of the Union (" State of the Union "), en begivenhet der USAs president informerer innbyggerne i staten i som finner ditt land

Beskrivelse

Unix -manualsiden perlintro (1) sier:

Perl er et generellt språk som opprinnelig ble utviklet for tekstmanipulering og brukes nå til et bredt spekter av oppgaver, inkludert systemadministrasjon , webutvikling , nettverksprogrammering, GUI -utvikling og mer.


Den ble sett for å være praktisk (brukervennlig, effektiv, omfattende) i stedet for vakker (liten, elegant, minimal). Hovedfunksjonene er at den er enkel å bruke, støtter strukturert programmering så vel som objektorientert programmering og funksjonell programmering (se Higher-Order Perl: Transforming Programs with Programs), har et kraftig innebygd tekstbehandlingssystem og et enormt samling av tilgjengelige moduler.

Funksjoner

Hele strukturen til Perl er i stor grad avledet fra C -språket . Perl er et imperativt språk , med variabler , uttrykk , tildelinger , avgrensede kodeblokker , kontrollstrukturer og subrutiner .

Perl låner også funksjoner fra shell- programmering . Alle variabler er merket med en foregående Sigil ( Sigil , på engelsk). Sigils identifiserer variabelnavn unikt, slik at Perl har en rik syntaks. Spesielt tillater sigils variabler å bli interpolert direkte inn i tegnstrenger ( streng ). I likhet med skjell har Perl mange innebygde funksjoner for vanlige oppgaver og for tilgang til systemressurser.

Perl tar lister fra Lisp , hashes (assosiativt minne) fra AWK , og regulære uttrykk fra sed . Alt dette forenkler og letter alle former for analysering , teksthåndtering og databehandlingsoppgaver.

I Perl 5 ble funksjoner lagt til for å støtte komplekse datastrukturer , første-ordens funksjoner (f.eks . nedleggelser som verdier) og en objektorientert programmeringsmodell . Disse inkluderer referanser, pakker og klassebasert metodeutførelse og introduksjonen av variabler med leksikalt omfang, som gjorde det lettere å skrive robust kode (sammen med den strenge pragmaen ). En viktig funksjon introdusert i Perl 5 var muligheten til å pakke gjenbrukbar kode som moduler . Larry Wall uttalte senere at "Perl 5-modulsystemet var ment å støtte veksten av Perl-kulturen i stedet for kjernen til Perl." [ 8 ]

Alle versjoner av Perl utfører automatisk dataskriving og minneadministrasjon . Tolken kjenner typen og lagringskravene til hvert objekt i programmet; reservere og frigjøre plass til dem etter behov. Konverteringer av juridisk type gjøres automatisk under kjøring; ulovlige konverteringer regnes som fatale feil.

Design

Perls design kan forstås som et svar på tre brede trender i dataindustrien: fallende maskinvarekostnader, økende lønnskostnader og forbedringer i kompilatorteknologi. Tidligere ble mange dataspråk, som Fortran og C, designet for å gjøre effektiv bruk av dyr maskinvare. Derimot er Perl designet for å gjøre effektiv bruk av dyre dataprogrammerere.

Perl har mange funksjoner som gjør det enklere for programmereren på bekostning av høyere CPU- og minnekrav. Disse inkluderer automatisk minnebehandling; dynamisk datatype ; strenger , lister og hashes ; vanlig uttrykk; introspeksjon og en funksjon eval().

Larry Wall ble utdannet lingvist, og Perls design har blitt mye instruert i språklige prinsipper. Eksempler inkluderer Huffman-koding (de vanligste konstruksjonene bør være kortest), god layout (viktig informasjon bør komme først), og en stor samling språkprimitiver. Perl favoriserer språkkonstruksjoner som er like naturlige som lesing og skriving for mennesker, selv om det gjør Perl-tolken mer komplisert.

Perls syntaks gjenspeiler ideen om at "ting som er annerledes skal se annerledes ut." For eksempel har skalarer, arrays og hashes forskjellige sigiler. Matriseindekser og hash- nøkler bruker forskjellige typer parenteser. Strenger og regulære uttrykk har forskjellige standardskilletegn. Denne tilnærmingen kan kontrasteres med språk som Lisp , der samme S-uttrykkskonstruksjon og grunnleggende syntaks brukes til mange forskjellige formål.

Perl har funksjoner som støtter en rekke programmeringsparadigmer, for eksempel imperativ , funksjonell og objektorientert . Samtidig tvinger ikke Perl noe spesielt paradigme til å følges, og tvinger heller ikke programmereren til å velge noen av dem.

Det er en bred følelse av praktisk, både i Perl-språket og i samfunnet og kulturen som omgir det. Programmering av Perls forord begynner med "Perl er et språk for å få arbeidet gjort." En konsekvens av dette er at Perl ikke er et ryddig språk. Den inkluderer funksjoner hvis folk bruker dem, tolererer unntak fra regler og bruker heuristikk for å løse syntaktiske tvetydigheter. På grunn av kompilatorens tilgivende natur, kan feil noen ganger være vanskelig å finne. Når vi snakker om den ulike oppførselen til indre funksjoner i liste- og skalarsammenheng, perlfunc(1)sier man-siden for "Generelt gjør de hva du vil, så lenge du vil ha konsistens."

Perl har flere lemmas som formidler aspekter ved design og bruk. Den ene er Det er mer enn én måte å gjøre det på (TMTOWTDI, vanligvis uttalt "Tim Toady"). Andre er "Perl: The Swiss Army Chainsaw of Programming Languages" og "Fuzzy Limits" . Et uttalt mål med Perl er å gjøre enkle ting enkle og vanskelige oppgaver mulig. Perl har også blitt kalt "The Band-Aid of the Internet" .

Applikasjoner

Perl har mange og varierte applikasjoner, takket være tilgjengeligheten av mange standard- og tredjepartsmoduler.

Det har blitt brukt siden de første dagene av nettet til å skrive CGI - skript . Det er en av de "tre P-ene" (Perl, Python og PHP), som er de mest populære språkene for å bygge webapplikasjoner, og er en integrert komponent i den populære LAMP-løsningen for webutvikling. Store prosjekter skrevet i Perl er Slash , IMDb [ 9 ] og UseModWiki , en Wiki -motor . Mange nettsteder med høy trafikk, som Amazon.com og Ticketmaster.com , bruker Perl mye.

Perl brukes ofte som et " limspråk ", som binder sammen systemer og grensesnitt som ikke er spesielt utviklet for å fungere sammen; og for "data mining", konvertering eller behandling av store datamengder for oppgaver som å lage rapporter. Faktisk er disse styrkene nært knyttet. Kombinasjonen deres gjør Perl til et populært generell verktøy for systemadministratorer , spesielt for små programmer som kan skrives og kjøres på en enkelt kommandolinje.

Perl er også mye brukt innen finans og bioinformatikk , hvor det er verdsatt for sin raske utvikling , både av applikasjoner og distribusjon, samt evnen til å håndtere store datamengder.

Implementering

Perl er implementert som en tolk , skrevet i C, sammen med en stor samling av moduler, skrevet i Perl og C. Kildedistribusjonen er fra og med 2005 12 MB når den er pakket og komprimert til en tar -fil . Tolken har 150 000 linjer med C-kode og kompilerer til en 1MB kjørbar fil på de fleste typiske maskinvarearkitekturer . Alternativt kan tolken settes sammen som et bibliotek og bygges inn i andre programmer. Det er rundt 500 moduler i distribusjonen, totalt 200 000 linjer med Perl og ytterligere 350 000 linjer med C-kode. Mye av C-koden i modulene består av tegnkodingstabeller .

Tolken har en objektorientert arkitektur. Alle elementer i Perl-språket— skalarer , lister , hasher , kodereferanser, filhåndtak—er representert i tolken som C-strukturer. Operasjoner på disse strukturene er definert som en stor samling av makroer, typedefs og funksjoner; dette utgjør Perls C API . Perl API kan være forvirrende for uinnvidde, men inngangspunktene følger et konsekvent navneskjema, som hjelper de som ønsker å bruke det.

Utførelsen av et Perl-program kan sjenerøst deles inn i to faser: kompileringstid og kjøretid . [ 10 ] Ved kompilering analyserer tolken programteksten til et syntakstre . Ved kjøretid kjører den programmet etter treet. Teksten analyseres bare én gang og syntakstreet er optimalisert før det kjøres, slik at utførelsesfasen er relativt effektiv . Syntakstreoptimaliseringer ved kompilering inkluderer konstant uttrykksforenkling , kontekstutbredelse og optimalisering på enkeltbiter med kode . Bygge- og kjøringsfasene kan imidlertid nestes : en blokk BEGINutføres på kompileringstidspunktet, mens en funksjon evalstarter en bygging under en kjøring. Begge disse operasjonene er implisitte i hverandre - spesielt, klausulen usesom laster inn biblioteker, kjent i Perl som moduler, innebærer en BEGIN.

Perl er et dynamisk språk og har en kontekstsensitiv grammatikk som kan påvirkes av kode utført under en mellomliggende utførelsesfase (Se eksempler. [ 11 ] ). Det er derfor Perl ikke kan analyseres ved en direkte applikasjon av Lex / Yacc-parsere / parsere . I stedet implementerer tolken sin egen leksikalske analysator, som, i koordinering med en modifisert GNU bison -parser, løser språkuklarheter. Det har blitt sagt at "bare perl kan analysere Perl", noe som betyr at bare Perl-tolken ( perl ) kan analysere Perl-språket ( Perl ). Årsaken til dette attesteres av de vedvarende ufullkommenhetene til andre programmer som påtar seg oppgaven med å analysere Perl, for eksempel kodeanalysatorer og auto-indentere, som ikke bare må håndtere de mange måtene å entydig uttrykke syntaktiske konstruksjoner på, men også med det faktum at også Perl generelt ikke kan analyseres uten først å bli utført.

Å vedlikeholde Perl-tolken har gjennom årene blitt stadig vanskeligere . Kjernen har vært i kontinuerlig utvikling siden 1994 . Koden er optimert for ytelse på bekostning av enkelhet, klarhet og sterkere interne grensesnitt. Nye funksjoner er lagt til, samtidig som de opprettholder praktisk talt fullstendig bakoverkompatibilitet med tidligere versjoner. Størrelsen og kompleksiteten til tolken er en barriere for utviklere som ønsker å jobbe med den.

Perl er distribuert med ca 120 000 funksjonstester. Disse kjører som en del av den normale byggeprosessen og tester tolken og dens hovedmoduler omfattende. Perl-utviklere er avhengige av funksjonstester for å sikre at endringer i tolken ikke introduserer feil; Motsatt kan Perl-brukere som ser tolken bestå funksjonstester på systemet deres ha en høy grad av tillit til at det fungerer som det skal.

Det er ingen skriftlig spesifikasjon eller standard for Perl-språket, og det er ingen planer om å lage en for den nåværende versjonen av Perl. Det har alltid vært bare én implementering av tolken. Denne tolken utgjør sammen med funksjonstestene de facto spesifikasjonen av språket.

Tilgjengelighet

Perl er gratis programvare og er lisensiert under Artistic License og GNU General Public License . Det er distribusjoner tilgjengelig for de fleste operativsystemer . Det er spesielt utbredt på Unix og lignende systemer , men har blitt overført til nyere (og eldre) plattformer. Med bare seks bekreftede unntak, kan den kompileres fra kildekoden på alle Unix-, POSIX -kompatible eller andre Unix-kompatible plattformer. Dette er imidlertid normalt ikke nødvendig, fordi Perl er inkludert som standard i installasjonen av de fleste populære operativsystemene. [ 12 ]

På grunn av de spesielle endringene som kreves for å støtte Mac OS Classic , er det en spesiell port kalt MacPerl . [ 13 ]

GNU/Linux

Perl er forhåndsinstallert på de fleste populære GNU/Linux-distribusjonene inkludert Gentoo , Slackware , Mandriva , Debian , RedHat og SUSE .

Windows

Microsoft Windows- brukere installerer vanligvis en binær distribusjon av Perl. [ 14 ] Å kompilere Perl fra kilden under Windows er mulig, men de fleste installasjoner har ikke den nødvendige C-kompilatoren.

Cygwin- emuleringslaget gir en annen måte å kjøre Perl under Windows. Cygwin gir et Unix-lignende miljø på Windows som inkluderer gcc , så kompilering av Perl fra kode er et rimelig alternativ for brukere som foretrekker dette alternativet.

I juni 2006 ble win32.perl.org lansert av Adam Kennedy på vegne av Perl Foundation . Det er et nettsamfunn "for alt Windows og Perl". [ 15 ]

Språkstruktur

Eksempelprogram

I Perl er det kanoniske " Hello world "-programmet:

#!/usr/bin/perl print "Hei verden!\n" ;

Den første linjen inneholder shebang (et par tegn som identifiserer teksten som følger), som forteller operativsystemet hvor det skal finne Perl-tolken. Den andre skriver ut strengen Hello world! og et linjeskifttegn .

Shebang er den normale måten å påkalle tolken på Unix-systemer. Windows-systemer kan fortsette å bruke den, eller kan knytte .pl -filtypen til Perl-tolken. Noen tekstredigerere bruker også shebang -linjen som et hint om hvilken arbeidsmåte de bør operere i. Hvis programmet kjøres av perl og ikke påkalles av skallet, analyseres linjen som begynner med shebang for å analysere alternativene. Ellers ignoreres det. For detaljer om dette, se perlrun man-siden .

Datatyper

Perl har tre datatyper : skalarer , lister og hasher :

  • En skalar er en enkelt verdi; kan være et tall, en streng (tegnstreng) eller en referanse
  • En liste er en ordnet samling av skalarer (en variabel som lagrer en liste kalles en matrise )
  • En hash , eller assosiativt minne , er en kartlegging fra strenger til skalarer; strenger kalles nøkler og skalarer kalles verdier .

Alle variabler innledes med en sigil, som identifiserer typen data som er tilgjengelig (ikke datatypen til selve variabelen). Det samme navnet kan brukes for variabler av forskjellige typer uten konflikt.

$var # en skalar @var # en matrise %var # en hash

Tall skrives på vanlig måte; strenger er omgitt av sitater fra ulike klasser.

$n = 42 ; $navn = "john" ; $color = 'rød' ;

Perl vil konvertere strenger til tall og omvendt avhengig av konteksten de brukes i. I følgende eksempel behandles strengene $n og $msom tall når de er argumenter for addisjonsoperatoren. Denne koden skriver ut tallet '5', forkaster all ikke-numerisk informasjon fra operasjonen og lar verdiene til variablene være intakte. (Konkateneringsoperatoren er ikke +, men ..)

$n = "3 epler" ; $m = "2 appelsiner" ; skriv ut $n + $m ;

Perl har også en boolsk kontekst som den bruker til å evaluere betingede utsagn. Følgende verdier i Perl evalueres alle til falske:

$false = 0 ; # tallet null $false = 0,0 ; # tallet null som en flyte $false = '0' ; # nullstrengen $false = "" ; # den tomme strengen $false = undef ; # verdien returnert av undef

Alle andre verdier vurderes til sanne. Dette inkluderer den nysgjerrige selvbeskrivende strengen"0 pero verdadero" , som faktisk er 0 som et tall, men sant som en boolsk. (Enhver ikke-numerisk streng vil også ha denne egenskapen, men denne spesielle strengen ignoreres av Perl i numeriske sammenhenger.) Evaluerte boolske uttrykk returnerer også skalarverdier. Selv om dokumentasjonen ikke indikerer hvilken bestemt verdi som returneres som sann eller usann (og dermed upålitelig), returnerer mange boolske operatorer 1 for sann og den tomme strengen for usann (som evalueres til null i numerisk kontekst). Funksjonen defined() forteller deg om variabelen har noen verdi. I eksemplet ovenfor vil definert ($false) være sant med hver av verdiene ovenfor unntatt undef . Hvis du spesifikt vil forsikre deg om at du har et 1/0-resultat (som i C), må du utføre følgende beregning:

min $real_result = $boolean_result ? 1 : 0 ;

En liste defineres ved å liste opp elementene, atskilt med komma og omgitt av parenteser der det kreves av operatørprioritet.

@scores = ( 32 , 45 , 16 , 5 );

En hash kan initialiseres fra en liste med nøkkel/verdi-par.

%favoritt = ( joe => 'rød' , sam => 'blå' , );

Individuelle elementer i en liste er tilgjengelig ved hjelp av en numerisk indeks, innenfor firkantede parenteser. Individuelle verdier i en hash er tilgjengelig ved å bruke den tilsvarende nøkkelen, inne i krøllete klammeparenteser. $ -sigilet identifiserer at elementet du får tilgang til er en skalar.

$scores [ 2 ] # et element av @scores $favorite { joe } # en verdi av %favorite

Flere elementer kan nås ved å bruke @ sigil i stedet (identifiserer resultatet som en liste).

@scores [ 2 , 3 , 1 ] # tre elementer fra @scores @favorite { 'joe' , 'sam' } # to verdier av %favorite

Antall elementer i en matrise kan oppnås ved å evaluere matrisen i skalarkontekst eller ved hjelp av $# stealth . Sistnevnte gir indeksen til det siste elementet i matrisen , ikke antall elementer.

$nummer = @venner ; $#venner ; # indeksen for det siste elementet i @friends $#friends + 1 ; # vanligvis antall elementer i @venner, # som er én mer enn $#venner fordi det første elementet har indeks 0, ikke 1

Det er noen få funksjoner som opererer på heltalls -hasher .

@customer_names = nøkler %adresser ; # lagre i @customer_names alle nøklene til %addresses @email_addresses = verdier %adresser ; # lagre i @email_addresses alle verdiene til %adresser

Kontrollstrukturer

Perl har flere typer kontrollstrukturer.

Den har blokkorienterte kontrollstrukturer, som ligner på programmeringsspråkene C og Java. Betingelsene er omgitt av parenteser og underordnede blokker av klammeparenteser:

'' tag '' while ( '' condition '' ) { ... } '' tag '' while ( '' condition '' ) { ... } fortsett { ... } '' tag '' for ( ' ' initial uttrykk '' ; '' betinget uttrykk '' ; '' inkrementelt uttrykk '' ) { ... } '' etikett '' foreach '' var '' ( '' liste '' ) { ... } '' label '' foreach '' var '' ( '' liste '' ) { ... } fortsett { ... } if ( '' betingelse '' ) { ... } if ( '' betingelse '' ) { . .. } else { ... } if ( '' condition '' ) { ... } elsif ( '' condition '' ) { ... } else { ... }

Når du kontrollerer til en enkelt deklarasjon, gir deklarasjonsmodifikatorer en lettere syntaks:

'' statement '' if '' betingelse '' ; '' setning '' med mindre '' betingelse '' ; '' setning '' mens '' betingelse '' ; '' setning '' til '' betingelse '' ; '' setning '' for hver '' liste '' ;

Kortslutningslogiske operatorer brukes normalt til å kontrollere programflyten på uttrykksnivået:

'' expr '' og '' expr '' '' expr '' eller '' expr ''

Flytkontrollnøkkelordene next, lastog returner redouttrykk, slik at de kan brukes med kortslutningsoperatorene.

Perl har også to implisitte konstruksjoner for løkker:

'' resultater '' = grep { ... } '' liste '' '' resultater '' = kart { ... } '' liste ''

grepreturnerer alle listeelementer der den underordnede blokken evalueres til sann. mapevaluerer den underordnede blokken for hvert listeelement og returnerer en liste over de resulterende verdiene. Disse konstruksjonene tillater en enkel stil med funksjonell programmering.

Switch-setningen ( kalt "gitt"/"når") eksisterer siden versjon 5.10:

bruk 5.10.1 ; # eller senere gitt ( $variable ) { when ( '' condition '' ) { ... } when ( '' condition '' ) { ... } default { ... } }

Perl inkluderer en erklæring , men den brukes sjelden. Situasjoner der det brukes på andre språk forekommer ikke så ofte i Perl på grunn av dets omfattende flytkontrollalternativer. goto etiquetagoto

Det er også en uttalelse som gjør en "endelig" samtale. Avslutter gjeldende subrutine og ringer umiddelbart opp den angitte. Dette brukes i situasjoner der en ny subrutine kan utføre mer effektiv stabeladministrasjon enn Perl selv (fordi det vanligvis ikke kreves noen endring av gjeldende stabel), og i svært dype rekursjoner kan disse typene anrop ha en betydelig positiv innvirkning på ytelsen fordi den unngår kontekst-/stabeladministrasjonskostnader ved retur. goto &subsub

Subrutiner

Subrutiner er definert med nøkkelordet subog påberopes ganske enkelt ved å navngi dem. Hvis den aktuelle underrutinen ikke er deklarert ennå, er det nødvendig, for parsingsprosessen, å sette parentesene.

foo (); # parentes nødvendig her... sub foo { ... } foo ; #... men ikke her

En liste med argumenter kan angis etter navnet på subrutinen. Argumentene kan være skalarer, lister eller hashes .

foo $x , @y , %z ;

Parametrene til en subrutine trenger ikke å deklareres, verken i antall eller type; faktisk kan de variere fra samtale til samtale. Matriser utvides til elementene sine, hashes til en liste med nøkkel/verdi-par, og hele settet sendes til subrutinen som en udifferensiert liste over skalarer.

Alle de beståtte argumentene er tilgjengelige for subrutinen i den spesielle matrisen@_ . Elementene i @_er assosiert med gjeldende argumenter; endre et element av @_endrer det tilsvarende argumentet.

Elementene i @_kan nås med abonnementene på vanlig måte.

$_ [ 0 ], $_ [ 1 ]

Imidlertid kan den resulterende koden være vanskelig å lese, og parameterne har pass-by-referanse-semantikk, noe som kan være uønsket.

Et vanlig formspråk er å tilordne @_en liste med navngitte variabler.

min ( $x , $y , $z ) = @_ ;

Dette påvirker både mnemonikken til parameternavn og semantikken til verdier som passeres av verdi. Nøkkelordet myindikerer at følgende variabler er leksikalsk innebygd i blokken som inneholder dem.

Et annet formspråk er å ta parametrene ut av @_. Dette er veldig vanlig når subrutinen tar bare ett argument.

min $x = skift ; # Hvis ingenting er sagt, henviser vi til @_

Subrutiner kan returnere verdier.

returner 42 , $x , @y , %z ;

Hvis subrutinen ikke avsluttes via deklarasjon return, returnerer den det siste uttrykket som ble evaluert i hoveddelen av subrutinen. Matriser og hashes i returverdien utvides til en liste over skalarer, akkurat som om de var argumenter til en funksjon.

Det returnerte uttrykket blir evaluert i konteksten av subrutineanropet; dette kan overraske intetanende.

underliste { ( 4 , 5 , 6 ) } undermatrise { @x = ( 4 , 5 , 6 ) ; _ @x } $x = liste ; # returnerer 6 - siste element i listen $x = array ; # returnerer 3 - antall elementer i listen @x = liste ; # returnerer (4, 5, 6) @x = matrise ; # returer (4, 5, 6)

En subrutine kan oppdage sin kallekontekst med wantarray.

sub any { wantarray ? ( 1 , 2 ) : "Appelsiner" } $x = hvilken som helst ; # returnerer "appelsiner" @x = hvilken som helst ; # returer (1, 2)

Regelmessige uttrykk

Perl-språket inkluderer en spesialisert syntaks for å skrive regulære uttrykk, og tolken inneholder en motor for å matche strenger til regulære uttrykk. Den regulære uttrykksmotoren bruker en tilbakesporingsalgoritme , og utvider funksjonene fra enkel mønstertilpasning til strengfanging og erstatning . Den regulære uttrykksmotoren er avledet fra regex , skrevet av Henry Spencer .

Syntaksen for regulære uttrykk ble opprinnelig hentet fra Unix versjon 8. Den ble imidlertid differensiert allerede før den første utgivelsen av Perl og har siden inkorporert mange flere funksjoner. Andre språk og applikasjoner tar i bruk Perl regulære uttrykk (PCRE) i stedet for POSIX regulære uttrykk , inkludert PHP, Ruby, Java og Apache HTTP Server .

Operatoren (samsvar) m//lar deg sjekke et samsvar ved hjelp av et regulært uttrykk. (For korthets skyld kan det foregående mutelates.) I det enkleste tilfellet kan et uttrykk som:

$x =~ m/abc/

evalueres til sann hvis og bare hvis strengen samsvarer med det regulære uttrykket . $xabc

Deler av det regulære uttrykket kan omsluttes i parentes: de tilsvarende delene av en samsvarende streng fanges opp . De fangede strengene blir sekvensielt tilordnet interne variabler $1, $2, $3,..., og en liste over fangede strenger returneres som verdien av samsvaret.

$x =~ m/a(.)c/ ; # fanger opp tegnet mellom 'a' og 'c' og lagrer det i $1

Operatoren (erstatt) s///spesifiserer en søk og erstatt-operasjon:

$x =~ s/abc/aBc/ ; # Gjør b stor

Regulære uttrykk i Perl kan ta noen få modifikatorer . De er enkeltbokstavssuffikser som endrer betydningen av uttrykket:

$x =~ m/abc/i ; # samsvar uavhengig av tilfelle $x =~ s/abc/aBc/g ; # globalt søk og erstatt (over hele ''strengen'')

Regelmessige uttrykk kan være tette og kryptiske. Dette er fordi syntaksen til regulære uttrykk er ekstremt kompakt, og bruker vanligvis enkelttegn eller tegnpar for å representere operasjonene deres. Perl lindrer dette problemet noe med modifikatoren /xsom lar programmerere sette mellomrom og kommentarer i vanlige uttrykk:

$x =~ m/a # samsvarer med en 'a' . # matcher et hvilket som helst tegn c # matcher en 'c' /x ;

En vanlig bruk av regulære uttrykk er å spesifisere feltavgrensere til operatoren split:

@words = delt m/,/ , $line ; # del $linjen med kommaseparerte verdier

Operatøren splitutfyller strengfangsten. Strengefangsten returnerer delene av en streng som samsvarer med et regulært uttrykk; splitreturnerer delene som ikke samsvarer.

Grensesnitt med databaser

Perl er mye foretrukket for databaseapplikasjoner . Teksthåndteringsfasilitetene er gode for å generere SQL -spørringer ; arrays , hashes og automatisk minnebehandling gjør det enkelt å samle inn og behandle de returnerte dataene.

I tidlige versjoner av Perl ble databasegrensesnitt opprettet ved å koble tolken til et databasebibliotek på klientsiden. Dette var litt klønete; et spesielt problem var at den resulterende kjørbare filen perlvar begrenset til å bruke bare ett databasegrensesnitt, det som var bundet. Også gjenbinding av tolken var vanskelig nok til at det bare ble gjort for noen av de mest kjente og viktige databasene.

I Perl 5 implementeres databasegrensesnitt av Perl DBI -modulen . Modulen DBIpresenterer ett enkelt grensesnitt til Perl-applikasjoner, uavhengig av databaser, mens modulene DBD::(Database Driver) håndterer tilgangsdetaljer til rundt 50 forskjellige databaser. Drivere finnes DBD::for de fleste ANSI SQL-databaser.

Ytelsessammenligning

" Computer Language Shootout Benchmarks" sammenligner ytelsen til implementeringer av typiske programmeringsproblemer, på forskjellige språk. Perl-implementeringene deres tar vanligvis mer minne enn implementeringer på andre språk, og dette varierer hastighetsresultatene. Perls funksjoner ligner på andre språk som Python, PHP eller Ruby, men tregere enn de fleste kompilerte språk.

Perl kan være tregere enn andre språk som gjør det samme fordi det må kompilere kildekoden hver gang programmet kjøres. I "A Timely Start" fant Jean-Louis Leroy ut at Perl-skriptene hans tok mye lengre tid å kjøre enn han forventet fordi perl-tolken brukte mesteparten av tiden på å søke etter og kompilere moduler. Fordi Perl ikke kan lagre sin mellombygg som Java, Python og Ruby kan, bærer Perl-skript dette overhead ved hver kjøring. Overhead er ikke et problem når utførelsesfasen er veldig lang, men den kan skjeve betydelig ved svært korte utførelsestider, slik man ofte finner i benchmarks. Når perl går inn i utførelsesfasen, kan den imidlertid være veldig rask og utkonkurrerer vanligvis andre dynamiske språk. Teknologier som mod perl overvinner dette ved å lagre det kompilerte programmet i minnet mellom kjøringer, eller Class::Autouse som forsinker kompileringen av deler av programmet til de trengs.

Optimaliserer

Nicholas Clark, en kjerneutvikler av Perl, diskuterer noen designforbedringer med Perl og andre løsninger i "Når perl ikke er ganske raskt nok" . De mest kritiske rutinene i et Perl-program kan skrives i C eller til og med assemblerspråk med XS eller Inline .

Optimalisering av Perl kan kreve inngående kunnskap om dets virkemåte i stedet for ferdigheter med språket og dets syntaks, noe som betyr at problemet ligger i Perl-implementeringen i stedet for språket i seg selv. Raku , den neste versjonen, vil ta noen av disse ideene som leksjoner, som andre språk allerede har lært.

Fremtidig

I år 2000, på Perl-konferansen , kom Jon Orwant med en forespørsel om en ny versjon av språket. [ 16 ] Dette førte til en beslutning om å starte arbeidet med en redesign av språket, som skal hete Perl 6. Perl-fellesskapet ble bedt om forslag til nye funksjoner i språket, og mer enn 300 Request For Proposals (RFC) ble mottatt. Kommentarer , forespørsel om kommentarer).

Larry Wall brukte de neste årene på å fordøye RFC-ene og syntetisere dem til et sammenhengende rammeverk for Perl 6. Han presenterte designet sitt for Perl 6 i en serie dokumenter kalt Apocalypse , som er nummerert for å samsvare med kapitlene i Programmering Perl . Den nåværende, uferdige Perl 6-spesifikasjonen er oppsummert i designdokumenter kalt Synopses, som er nummerert for å tilsvare Apocalypses.

Perl 6 er ikke ment å være bakoverkompatibel, selv om en kompatibilitetsmodus vil eksistere.

I 2001 ble det bestemt at Perl 6 skulle kjøres på en virtuell maskin kalt Parrot . Dette betyr at andre språk som bruker Parrot vil kunne få innfødt tilgang til CPAN og vil tillate et visst nivå av kryssutvikling.

I 2005 opprettet Audrey Tang pugs -prosjektet , en Haskell -implementering av Perl 6 . Det var og er en testplattform for Perl 6-språket (atskilt fra den faktiske utviklingen av implementeringen) som lar designere utforske. Pugs-prosjektet skapte et aktivt Perl/Haskell-samfunn sentrert rundt #perl6 irc-kanalen på Freenode .

En rekke funksjoner i Perl 6-språket viser likheter med Haskell, og Perl 6 har blitt omfavnet av Haskell-samfunnet som et potensielt skriptspråk.

Fra og med 2006 er Perl 6, Parrot og pugs fortsatt under utvikling, og en ny modul for Perl 5 kalt v6 lar noe Perl 6-kode kjøre direkte på toppen av Perl 5.

I oktober 2019, gitt bevisene for at Perl 6 er et veldig forskjellig språk fra Perl 5, og for å unngå forvirring mellom de to språkene, ble det besluttet å gi det nytt navn til Raku .

Moro med Perl

Som i C, er obfuskerte kodekonkurranser et populært trekk ved Perl-kulturen. Obfuscated Perl-konkurransen feirer dyden til Perls syntaktiske fleksibilitet. Følgende program skriver ut teksten "Just another Perl / Unix hacker", ved hjelp av 32 parallelle prosesser koordinert med pipes. Den fullstendige forklaringen er tilgjengelig på forfatterens nettside .

@P = delt // , ".URRUU\c8R" ; @d = split // , "\nrekcah xinU / lreP rehtona tsuJ" ; sub p { @p { "r$p" , "u$p" } = ( P , P ); pipe "r$p" , "u$p" ; ++ $p ;( $q *= 2 ) += $f =! gafler ; kart { $P = $P [ $f ^ ord ( $p { $_ }) & 6 ]; $p { $_ } = / ^$P/ix ? $P:close$_ } tastene %p } p ; p ; p ; p ; p ; kart { $p { $_ } =~ /^[P.]/ && lukk $_ } %p ; vent til $? ; kart { /^r/ && <$_> } %p ; $_ = $d [ $q ]; sove rand ( 2 ) hvis /\S/ ; skrive ut

I likhet med obfuskert kode, men med et annet formål, er "Perl Poetry" praksisen med å skrive dikt som kan settes sammen til juridisk (om enn generelt meningsløs) Perl-kode. Denne hobbyen er mer eller mindre unik for Perl på grunn av det store antallet vanlige engelske ord som språket bruker. Nye dikt legges regelmessig ut på Perl Monks -nettstedet , i Perl Poetry -delen . Noe av Perls historie er i Black Perl , et beryktet eksempel på Perls poetikk.

En annen hobby er "Perl Golf". Som med den virkelige sporten , er målet å redusere antall slag som kreves for å fullføre et mål, men her refererer "slag" til tastetrykk i stedet for runder på en golfkølle. Det gis en oppgave, for eksempel «skann en inndatastreng og returner det største palindromet den inneholder» og deltakerne prøver å slå motstanderne ved å skrive løsninger som krever færre og færre tegn i Perl-kildekoden.

En annen tradisjon blant Perl- hackere er å skrive JAPH, som er et slags tilslørt lite program som skriver ut uttrykket «Just another Perl hacker,». Den "kanoniske" JAPH inkluderer det etterfølgende kommaet, selv om det ofte er utelatt, og mange andre varianter har blitt laget (f.eks. [ 17 ] som skriver ut "Just Another Perl Pirate!").

En interessant Perl-modul er Lingua::Romana::Perligata (på CPAN ). Denne modulen oversetter kildekoden til et skript skrevet på latin til Perl, slik at programmereren kan skrive kjørbare programmer på latin .

Perl-fellesskapet har reservert " Acme " -navneområdet for moduler som er morsomme eller eksperimentelle. Noen av Acme-modulene er implementert på svært underholdende måter. Noen eksempler:

  • Acme::Bleach , en av de første modulene i Acme:: , lar et programs kildekode "blekes" (dvs. alle tegn erstattes av mellomrom) og fortsatt fungere. Det er et eksempel på et kildekodefilter . Det finnes også en rekke andre fontfiltre i Acme-navneområdet.
  • Acme::Hello forenkler prosessen med å skrive en "Hello, World!"
  • Acme::Currency gjør det mulig å endre "$"-prefikset til skalarvariabler til et annet tegn (som standard bruker den euroen "€")
  • Acme::ProgressBar er, helt med vilje, en fryktelig og ineffektiv måte å indikere fremdriften til en oppgave
  • Acme::VerySign lampoons VeriSigns lenge kritiserte Site Finder -tjeneste
  • Acme::Ikke implementerer den logiske motsatte av nøkkelordet do— — don't, som ikke utfører den underordnede kodeblokken .

Relaterte lenker

Perl-fellesskapet

Perl-fellesskapet består av grupper som igjen utgjør Perl Mongers . [ 18 ]

I Spania er det tre grupper:

Se også

  • Portal: Gratis programvare . Innhold relatert til fri programvare .
  • Perl Foundation (på engelsk Wikipedia)
  • POE: Perl Object Environment (på Wikipedia på engelsk)
  • Perl Data Language (på engelsk Wikipedia)
  • dokumentasjonsverktøy for Perl (på engelsk Wikipedia)
  • Bare en annen Perl-hacker (på engelsk Wikipedia)
  • Obfuscated Perl-konkurranse (på engelsk Wikipedia)
  • Perl Mongers (på engelsk Wikipedia)
  • PerlScript (på engelsk Wikipedia)
  • Sammenligning av programmeringsspråk (på engelsk Wikipedia)
  • Programmering Perl (på Wikipedia på engelsk)
  • Lære Perl (på Wikipedia på engelsk)
  • Perl Cookbook (på engelsk Wikipedia)

Referanser

  1. ^ "perl 5.36.0 er nå tilgjengelig" . www.nntp.perl.org . Hentet 30. mai 2022 . 
  2. "Perl 5.34.1 er nå tilgjengelig!" . www.nntp.perl.org . Hentet 13. mars 2022 . 
  3. ^ "perl 5.37.0 er nå tilgjengelig" . perl.org . Hentet 30. mai 2022 . 
  4. ^ a b "Larry Wall" . Arkivert fra originalen 15. august 2006 . Hentet 20. august 2006 .  (Engelsk)
  5. ^ "perlhist - Perl-historieregistreringene" . www.cpan.org . Hentet 21. juli 2020 . 
  6. "Perl-kilde" . www.cpan.org . Hentet 21. juli 2020 . 
  7. ^ "Perl - O'Reilly Media" . 
  8. Usenet-innlegg, 10. mai 1997, med ID [email protected].
  9. "Hvilken programvare/maskinvare bruker du for å kjøre nettstedet?" . 
  10. En beskrivelse av Perl 5-tolken finnes i Programmering Perl , 3. utgave, kapittel 18 (engelsk)
  11. ^ "Om parsing av Perl" . 
  12. Hietaniemi, Jarko (1998). CPAN.org, red. "Perl-porter (binære distribusjoner)" . 
  13. Prime Time Freeware, red. (1997). "MacPerl-sidene" . Arkivert fra originalen 18. januar 2006. 
  14. Win32 Perl Wiki (red.). "Win32-distribusjoner" . 
  15. Kennedy, Adam (2006). "Win32 Perl Wiki" . 
  16. Transkripsjon av Larrys tale . Kommentert 28. september 2006. (engelsk)
  17. "Aharrr!" . 
  18. ^ "Perl Mongers" . Hentet 14. mars 2016 . 
  19. ^ "Grenade Perl Mongers" . Hentet 14. mars 2016 . 

Eksterne lenker

Distribusjoner