Perl

De WikiLingua.net

Perl
Paradigma: multiparadigma
Va aparèixer en: 1987
Dissenyat per: Larry Wall
Desarrollador: Rafael Garcia-Suarez i la comunitat Perl
Última versió: 5.10.0 (18 de desembre de 2007)
Tipus de dada: dinàmic
Implementaciones: Perl
mod_perl
embperl
Dialectes: Perl 5
Perl 6
Influït per: AWK, BASIC, BASIC-PLUS, C, C++, Lisp, Pascal, sigueu, Unix shell
Ha influït: Python, PHP, Ruby, ECMAScript
Sistema operatiu: molts (més de 100)
Llicència de programari: Llicència Artística
Web: www.perl.org

Perl, Llenguatge Pràctic per a l'Extracció i Informe (veure a baix) és un llenguatge de programació dissenyat per Larry Wall creat en 1987. Perl pren característiques del C, del llenguatge interpretat shell (sh), AWK, sigueu, Lisp i, en un grau inferior, de molts altres llenguatges de programació.

Estructuralmente, Perl està basat en un estil de blocs com els de el C o AWK, i va anar àmpliament adoptat per la seva destresa en el processat de text i no tenir cap de les limitacions dels altres llenguatges de script.

Taula de continguts

[editar] Història

Larry Wall va començar a treballar en Perl en 1987 mentre treballava com programador en Unisys[1] i va anunciar la versió 1.0 en el grup de notícies comp.sources.misc el 18 de desembre de 1987. El llenguatge es va expandir ràpidament en els següents anys. Perl 2, publicat en 1988, va aportar un millor motor d'expressions regulars. Perl 3, publicat en 1989, va afegir suporti per a dades binarios.

Fins a 1991 l'única documentació de Perl era una simple (i cada vegada més llarga) pàgina de manual Unix. En 1991 es va publicar Programming Perl (el llibre del dromedario) i es va convertir en la referència de facto del llenguatge. Al mateix temps, el nombre de versió de Perl va saltar a 4, no per marcar un gran canvi en el llenguatge, sinó per identificar a la versió que estava documentada en el llibre.

Perl 4 va portar amb si una sèrie de llançaments de manteniment, culminant en Perl 4.036 en 1993. En aquest punt, Larry Wall va abandonar Perl 4 per a començar a treballar en Perl 5. Perl 4 es quedaria en aquesta versió fins a avui.

El desenvolupament de Perl 5 va continuar en 1994. La llista de correu perl5-porters es va establir al maig de 1994 per a coordinar el treball d'adaptació de Perl 5 a diferents plataformes. És el primer fòrum per a desenvolupament, manteniment i adaptació de Perl 5.

Perl 5 va ser publicat el 17 d'octubre de 1994. Va ser gairebé una completa reescritura de l'intèrpret i va afegir moltes noves característiques al llenguatge, incloent objectes, referències, paquets i mòduls. A destacar, els mòduls proveeixen d'un mecanisme per a estendre el llenguatge sense modificar l'intèrpret. Això va permetre estabilizar el seu nucli principal, a més de permetre als programadores de Perl afegir-li noves característiques.

El 26 d'octubre de 1995, es va crear el Comprehensive Perl Arxivi Network (CPAN). CPAN és una col·lecció de llocs web que emmagatzemen i distribueixen fonts en Perl, binarios, documentació, scripts i mòduls. Originalmente, cada lloc CPAN havia de ser accedit a través de la seva propi URL; avui dia, http://www.cpan.org redirecciona automàticament a un dels centenars de repositorios mirall de CPAN.

En 2008, Perl 5 contínua sent mantingut. Característiques importants i algunes construccions essencials han estat afegides, incloent suporti Unicode, Fils (threads), un suporti important per a la programació orientada a objectes i altres millores. L'última versió estable publicada és Perl 5.10.0.

[editar] Nom

Perl es va cridar originalmente "Pearl", per la Parábola de la Perla. Larry Wall volia donar-li al llenguatge un nom curt amb connotaciones positives; assegura que va mirar (i va rebutjar) totes les combinacions de tres i quatre lletres del diccionari. També va considerar nomenar-ho com la seva esposa Glòria. Wall va descobrir abans del llançament oficial que ja existia un llenguatge de programació anomenat PEARL i va canviar l'ortografia del nom.

El nom normalment comença amb majúscules (Perl) quan es refereix al llenguatge i amb minúscules (perl) quan es refereix al propi programa intèrpret a causa de que els sistemes de fitxers Unix distingeixen majúscules i minúscules. Abans del llançament de la primera edició de Programming Perl era comuna referir-se al llenguatge com perl; Randal L. Schwartz, no obstant això, va forçar el nom en majúscula en el llibre perquè destaqués millor quan fos imprès. La distinció va ser subsiguientemente adoptada per la comunitat.

El nom és descrit ocasionalment com "PERL" (per P ractical Ixtraction and Report Language). Encara que aquesta expansió ha prevalgut en molts manuals actuals, incloent la pàgina de manual de Perl, és un retroacrónimo i oficialment el nom no vol dir gens. L'ortografia de PERL en majúscules és per això usada com argot per a detectar a individus aliens a la comunitat. No obstant això, s'han suggerit diversos retroacrónimos, incloent el còmic Pathologically Eclectic Rubbish Lister (Contabilizador d'Escombraries Patológicamente Eclèctic).

[editar] El símbol del dromedario

Perl se simbolitza generalment per un dromedario (camello arábigo), que va ser la imatge triada per l'editor [[O'Reilly & Associates|O'Reilly] per a la coberta de Programming Perl, que per tant va adquirir el nom del Llibre del Dromedario.[1] O'Reilly és propietari d'aquest símbol com marca registrada, però diu que usa els seus drets legals només per a protegir la "integritat i impacte d'aquest símbol" [1]. O'Reilly permet l'ús no comercial del símbol, i ofereix logos Programming Republic of Perl i botons Powered by Perl.

[editar] Descripció

La pàgina de manual Unix perlintro(1) diu:

Perl és un llenguatge de propòsit general originalmente desenvolupat per a la manipulació de text i que ara és utilitzat per a un ampli rang de tasques incloent administració de sistemes, desenvolupo web, programació en xarxa, desenvolupament de GUI i més.
Es va preveure que fos pràctic (facilitat d'ús, eficient, complet) en lloc de bell (petit, elegant, mínim). Les seves principals característiques són que és fàcil d'usar, suporta tant la programació estructurada com la programació orientada a objectes i la programació funcional, té incorporat un poderós sistema de processament de text i una enorme col·lecció de mòduls disponibles.

[editar] Característiques

L'estructura completa de Perl deriva àmpliament del llenguatge C. Perl és un llenguatge imperatiu, amb variables, expressions, assignacions, blocs de codi delimitados per claus, estructures de control i subrutinas.

Perl també pren característiques de la programació shell. Totes les variables són marcades amb un signe precedent (sigil). Els sigil identifiquen inequívocament els noms de les variables, permetent a Perl tenir una rica sintaxis. Notablement, els sigil permeten interpolar variables directament dintre de les cadenes de caràcters (strings). Com en els shell, Perl té moltes funcions integrades per a tasques comunes i per a accedir als recursos del sistema.

Perl pren les llistes del Lisp, hash (memòria asociativa) de l'AWK i expressions regulars del sigueu. Tot això simplifica i facilita totes les formes de l'anàlisi sintáctico, maneig de text i tasques de gestió de dades.

En Perl 5, es van afegir característiques per a suportar estructures de dades complexes, funcions de primer ordre (p. i. clausures com valors) i un model de programació orientada a objectes. Aquests inclouen referències, paquets i una execució de mètodes basada en classes i la introducció de variables d'àmbit lèxic, que va fer més fàcil escriure codi robusto (juntament amb el pragma strict). Una característica principal introduïda en Perl 5 va ser l'habilitat d'empaquetar codi reutilizable com mòduls. Larry Wall va indicar més avanci que "la intenció del sistema de mòduls de Perl 5 era recolzar el creixement de la cultura Perl en comptes del nucli de Perl".[2]

Totes les versions de Perl fan el tipificado automàtic de dades i la gestió de memòria. L'intèrpret coneix el tipus i requeriments d'emmagatzematge de cada objecte en el programa; reserva i allibera espai per a ells segons sigui necessari. Les conversions legals de tipus es fan de forma automàtica en temps d'execució; les conversions il·legals són considerades errors fatals.

[editar] Disseny

El disseny de Perl pot ser entès com una resposta a tres àmplies tendències de la indústria informàtica: rebaixa dels costos en el maquinari, augment dels costos laborals i les millores en la tecnologia de compiladores. Anteriorment, molts llenguatges d'ordinador com el Fortran i C, van ser dissenyats per a fer un ús eficient d'un maquinari car. En contrast, Perl és dissenyat per a fer un ús eficient dels costosos programadores d'ordinador.

Perl té moltes característiques que faciliten la tasca del programador a costa d'uns requeriments de CPU i memòria majors. Aquestes inclouen gestió de memòria automàtica; tipus de dada dinàmica; strings, llestes i hashes; expressions regulars; introspección i una funció eval().

Larry Wall va ser adiestrado com un lingüista i el disseny de Perl ha estat molt aleccionado amb principis lingüístics. Exemples inclouen la Codificació Huffman (les construccions més comunes han de ser les més curtes), bona distribució (la informació important ha d'anar primer) i una llarga col·lecció de primitives del llenguatge. Perl afavoreix les construccions del llenguatge, tan naturals, com per als humans són la lectura i l'escriptura, fins i tot si això fa més complicat a l'intèrpret Perl.

La sintaxis de Perl reflecteix la idea que "coses que són diferents han de semblar diferents". Per exemple, escalessis, arrays i hashes tenen diferent sigil. Índexs d'array i claus hash usen diferents classes de parèntesis. Strings i expressions regulars tenen diferents delimitadores estàndard. Aquesta aproximació pot contrastar-se amb llenguatges com Lisp, on la mateixa construcció S-expressió i sintaxis bàsica s'usa per a molts i variats propòsits.

Perl té característiques que suporten una varietat de paradigmes de programació, com la imperativa, funcional i l'orientada a objectes. Al mateix temps, Perl no obliga a seguir cap paradigma en particular, ni obliga al programador a triar alguna d'elles.

Hi ha un ampli sentit del pràctic, tant en el llenguatge Perl com en la comunitat i la cultura que ho envolten. El prefacio de Programming Perl comença amb, "Perl és un llenguatge per a tenir el teu treball acabat". Una conseqüència d'això és que Perl no és un llenguatge ordenat. Inclou característiques si la gent les usa, tolera excepcions a les regles i empra l'heurística per a resoldre ambigüitats sintácticas. A causa de la naturalesa indulgente del compilador, de vegades els errors poden ser difícils de trobar. Parlant del variat comportament de les funcions internes en els contextos de llista i escalar, la pàgina de manual de perlfunc(1) diu "En general, fan el que el teu vulguis, sempre que vulguis la coherència."

Perl té diversos lemes que transmeten aspectes del seu disseny i ús. Un és There's habiti than one way to do it (Hi ha més d'una forma de fer-ho) (TMTOWTDI, usualmente pronunciat 'Tim Toady'). Uns altres són "Perl: la motosierra de l'exèrcit Suís dels llenguatges de programació" i "Límits imprecisos". Una meta prefixada de Perl és fer les coses fàcils de forma fàcil i les tasques difícils, possibles. A Perl també se li ha cridat "L'esparadrapo d'Internet".

[editar] Aplicacions

Perl té moltes i variades aplicacions, gràcies a la disponibilitat de molts mòduls estàndards i de terceres parts.

S'ha usat des dels primers dies del Web per a escriure guions (scripts) CGI. És una de les "tres Pes" (Perl, Python i PHP), que són els llenguatges més populars per a la creació d'aplicacions Web, i és un component integral de la popular solució LAMP per al desenvolupament web. Grans projectes escrits en Perl són Slash, IMDb[2] i UseModWiki, un motor de Wiki. Molts llocs web amb alt tràfic, com Amazon.com i Ticketmaster.com usen Perl extensamente.

Perl s'usa sovint com un "llenguatge cola", lligant sistemes i interfaces que no van ser dissenyats específicament per a interoperar; i per al "escarbado de dades", convertint o processant grans quantitats de dades per a tasques com per exemple crear informes. De fet, aquestes fortaleses estan íntimamente unides. La seva combinació fa a Perl una popular eina de propòsit general per als administradors de sistemes, especialment en programes petits que poden ser escrits i executats en una sola línia de comandos.

Perl és també àmpliament usat en finanzas i bioinformática, on és apreciat pel seu desenvolupament ràpid, tant d'aplicacions com de desplegui, així com l'habilitat de manejar grans volums de dades.

[editar] Implementación

Perl està implementado com un intèrpret, escrit en C, juntament amb una gran col·lecció de mòduls, escrits en Perl i C. La distribució font té, en 2005, 12 MB quan s'empaqueta i comprimeix en un fitxer tar. L'intèrpret té 150.000 línies de codi C i es compila en un ejecutable d'1 MB en les arquitectures de maquinari més típiques. De forma alternativa, l'intèrpret pot ser compilado com una biblioteca i ser embebida en altres programes. Hi ha a prop de 500 mòduls en la distribució, sumant 200.000 línies de Perl i unes 350.000 línies addicionals de codi C. Molt del codi C en els mòduls consisteix en taules de codificació de caràcters.

L'intèrpret té una arquitectura orientada a objectes. Tots els elements del llenguatge Perl —escalessis, llestes, hashes, referències a codi, manejadores d'arxiu— estan representats en l'intèrpret com estructures C. Les operacions sobre aquestes estructures estan definides com una nombrosa col·lecció de macros, typedef i funcions; això constitueix l'API C de Perl. L'API Perl pot ser desconcertante per al no iniciat, però els seus punts d'entrada segueixen un esquema de noms coherent, que ajuda als quals vulguin utilitzar-la.

L'execució d'un programa Perl es pot dividir, generosamente, en dues fases: temps de compilació i temps d'execució.[3] En temps de compilació l'intèrpret parsea el text del programa en un arbre sintáctico. En temps d'execució, executa el programa seguint l'arbre. El text és parseado només una vegada i l'arbre sintáctico és optimitzat abans de ser executat, perquè la fase d'execució sigui relativament eficient. Les optimizaciones de l'arbre sintáctico en temps de compilació inclouen simplificació d'expressions constants, propagació del context i optimización en trossos solts de codi. No obstant això, les fases de compilació i execució poden anidarse: un bloc BEGIN s'executa en temps de compilació, mentre que una funció eval inicia una compilació durant una execució. Ambdues operacions estan implícitas en altres -de forma notable, la clàusula usi que carrega biblioteques, conegudes en Perl com mòduls, implica un bloc BEGIN.

Perl és un llenguatge dinàmic i té una gramática sensible al context que pot quedar afectada pel codi executat durant una fase d'execució intermèdia (Veure exemples. [3]). Per això Perl no pot ser parseado mitjançant una aplicació directa d'analizadores lèxics/parseador Lex/Yacc. En canvi, l'intèrpret implementa el seu propi analizador lèxic, que coordinat amb un parseador modificat GNU bison resol les ambigüitats del llenguatge. S'ha dit que "només perl pot parsear Perl", volent dir que només l'intèrpret Perl (perl) pot parsear el llenguatge Perl (Perl). La raó d'això es testifica per les persistents imperfecciones d'altres programes que emprenen la tasca de parsear Perl, com els analizadores de codi i els acte-indentadores, que han de veure-les-hi no només amb les moltes formes d'expressar inequívocament construccions sintácticas, sinó també amb el fet que també Perl no pot, en general, ser parseado sense abans ser executat.

El manteniment de l'intèrpret Perl, al llarg dels anys, s'ha tornat cada vegada més difícil. El nucli ha estat en continu desenvolupament des de 1994. El codi ha estat optimitzat en rendiment a costa de la simplicidad, claredat i unes interfaces internes més fortes. Noves característiques han estat afegides, mantenint encara, compatibilidad virtualment completa cap a enrere amb les primeres versions. La grandària i la complexitat de l'intèrpret són una barrera per als desarrolladores que desitgen treballar en ell.

Perl és distribuït amb uns 120.000 test funcionals. Aquests s'executen com part del procés normal de construcció i comproven extensamente a l'intèrpret i als seus mòduls principals. Els desarrolladores Perl confien en els test funcionals per a assegurar-se que els canvis en l'intèrpret no introdueixen errors; recíprocamente, els usuaris Perl que vegin a l'intèrpret passar els test funcionals en el seu sistema poden tenir un alt grau de confiança que està funcionant adequadament.

No hi ha una especificació o estàndard escrit per al llenguatge Perl i no hi ha plans de crear un per a la versió actual de Perl. Sempre ha existit només una implementación de l'intèrpret. Aquest intèrpret, juntament amb els test funcionals, formen l'especificació de facto del llenguatge.

[editar] Disponibilitat

Perl és programari lliure i està llicenciat sota la Llicència Artística i la GNU General Public License. Existeixen distribucions disponibles per a la majoria de sistemes operatius. Està especialment estès en Unix i en sistemes similars, però ha estat portat a les plataformes més modernes (i altres més obsoletes). Amb només sis excepcions confirmades, pot ser compilado des del codi font en tots els Unix, compatibles POSIX o qualsevol altra plataforma Unix compatible. No obstant això, això no és normalment necessari, perquè Perl està inclòs per defecte en la instal·lació dels sistemes operatius més populars.[4]

A causa dels canvis especials necessaris per a suportar al Mac US Classic, existeix una adaptació especial cridada MacPerl.[5]

[editar] GNU/Linux

Perl està instal·lat per defecte en les distribucions més populars de GNU/Linux incloent Gentoo, Mandriva, Debian, RedHat i SUSE.

[editar] Windows

Els usuaris de Microsoft Windows normalment instal·len una distribució binaria de Perl.[6] Compilar Perl des del font sota Windows és possible, però la majoria de les instal·lacions no disposen del necessari compilador de C.

La capa d'emulación Cygwin proporciona una altra forma de córrer Perl baix Windows. Cygwin proporciona en entorn semblat a l'Unix en Windows que inclou gcc, pel que compilar Perl des del codi és una opció accessible per als usuaris que prefereixen aquesta opció.

Al juny de 2006, win32.perl.org va ser llançat per Adam Kennedy en nom de la Fundació Perl. És una comunitat web "per a tot el relacionat amb Windows i Perl".[7]

[editar] Estructura del llenguatge

[editar] Programa exemple

En Perl, el programa canónico "Hola món" és:

#!/usr/bin/perl
usi 5.010;
say 'Hola món!';

La primera línia conté el shebang (parell de caràcters que identifica el text que segueix), que li indica al sistema operatiu on trobar l'intèrpret de Perl. La segona línia introdueix el pragma strict que s'usa en grans projectes de programari per al control de qualitat. La tercera imprimeix el string Hola món! i un caràcter de nova línia.

El shebang és la forma normal per a invocar a l'intèrpret en els sistemes Unix. Els sistemes Windows poden seguir utilitzant-ho o poden associar l'extensió d'arxiu .pl amb l'intèrpret Perl. Alguns editors de text també usen la línia shebang com una pista sobre la manera de treball en què han d'operar. Si el programa és executat per perl i no invocat pel shell, la línia que comença pel shebang és parseada per a interpretar les opcions. En un altre cas, és ignorada. Per a veure els detalls d'això, consultar la pàgina de manual perlrun.

[editar] Tipus de dades

Perl té tres tipus de dades: escalessis, llestes i hashes:

  • Un escalar és un sol valor; pot ser un nombre, un string (cadena de caràcters) o una referència
  • Una llista és una col·lecció ordenada d'escalessis (una variable que emmagatzema una llista es diu array)
  • Un hash, o memòria asociativa, és un mapeo de strings a escalessis; els strings es diuen claus i els escalessis valors.

Totes les variables estan precedides per un sigil, que identifica el tipus de dada que és accedit (no el tipus de dada de la mateixa variable). Es pot usar el mateix nom per a variables de diferents tipus, sense que tinguin conflictes.

$var   # un escalar
@var   # un array
%var   # un hash

Els nombres s'escriuen de la forma usual; els strings estan envoltats entre comillas de diverses classes.

$n      = 42;
$nom = "juan";
$color  = 'vermell';

Perl convertirà els strings en nombres i viceversa depenent del context en què siguin usats. En el següent exemple els strings $n i $m són tractats com nombres quan són arguments de l'operador suma. Aquest codi imprimeix el nombre '5', desechando qualsevol informació no numèrica de l'operació i deixant els valors de les variables intactes. (L'operador de concatenación no és +, sinó ..)

$n     = "3 pomes";
$m     = "2 taronges";
print $n + $m;

Perl també té un context booleano que utilitza en l'avaluació de declaracions condicionales. Els següents valors en Perl avaluen tots com fals:

$fals = 0;     # el nombre zero
$fals = 0.0;   # el nombre zero com flotant
$fals = '0';   # el string zero
$fals = "";    # el string buit
$fals = undef; # el valor retornat per undef

Tots els altres valors s'avaluen a veritable. Això inclou el curiós string acte-descriptivo "0 però veritable", que de fet és 0 com nombre, però veritable com booleano. (Qualsevol string no numèric també tindrà aquesta propietat, però aquest string en particular és ignorat per Perl en contextos numèrics). Les expressions booleanas avaluades també retornen valors escalessis. Encara que la documentació no indica quin valor particular es retorna com veritable o fals (i per tant no fiable), molts operadors booleanos retornen 1 per veritable i el string buit per a fals (que avalua a zero en context numèric). La funció defined() li diu si la variable té algun valor. En l'exemple anterior defined($fals) serà veritable amb cadascun dels valors anteriors, excepte undef. Si, específicament, vol assegurar-se de tenir un resultat 1/0 (com en C), necessita realitzar el càlcul següent:

my $resultat_real = $resultat_booleano ? 1 : 0;

Una llista es defineix llistant els seus elements, separats per mengis i envoltats per parèntesis on així sigui requerit per la precedencia dels operadors.

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

Un hash pot ser inicializado des d'una llista de parells clau/valor.

%favorit = (
      joe => 'vermell',
      sam => 'blau',
);

Els elements individuals d'una llista són accedits utilitzant un índex numèric, dintre de corchetes. Valors individuals en un hash són accedits utilitzant la corresponent clau, dintre de claus. El sigil $ identifica que l'element accedit és un escalar.

$puntuacions[2]  # un element de \@puntuacions
$favorit{joe}    # un valor de %favorit

Múltiples elements poden ser accedits usant en el seu lloc el sigil @ (identificant el resultat com una llista).

@puntuacions[2, 3, 1]   # tres elements de \@puntuacions
@favorit{'joe', 'sam'}  # dos valors de %favorit

El nombre d'elements en un array pot ser obtingut avaluant l'array en context escalar o amb l'ajuda del sigil $#. Aquest últim dóna l'índex de l'últim element dintre de l'array , no el nombre d'elements.

$numero = @amics;
$#amics;      # l'índex de l'últim element en @amics
$#amics+1;    # normalment el nombre d'elements en @amics,
               # que és un més que $#amics perquè el primer element té l'índex 0, no 1

Hi ha unes poques funcions que operen sobre hashes sencers.

@noms_de_clients  = keys   %adreces;   # guarda en @noms_de_clients  totes les claus  de %adreces
@adrecis_de_email = values %adreces;   # guarda en @adreces_de_email tots els valors de %adreces

[editar] Estructures de control

Perl té diverses classes d'estructures de control.

Té estructures de control orientat al bloc, similar als dels llenguatges de programació C i Java. Les condicions estan envoltades per parèntesis i els blocs subordinats per claus:

etiqueta while ( condició ) {... }
etiqueta while ( condició ) {... } continue {... }
etiqueta for ( expressió inicial; expressió condicional; expressió incremental ) {... }
etiqueta foreach var ( llista ) {... }
etiqueta foreach var ( llista ) {... } continue {... }
if ( condició ) {... }
if ( condició ) {... } else {... } 
if ( condició ) {... } elsif ( condició ) {... } else {... } 

Quan es controla a una sola declaració, els modificadores de declaració proporcionen una sintaxis més lleugera:

declaració if      condició;
declaració unless  condició;
declaració while   condició;
declaració until   condició;
declaració foreach llista;

Els operadors lògics curtcircuit són normalment usats per a controlar el fluix del programa a nivell d'expressió:

expr and expr
expr or  expr

Les paraules clau de control de fluix next, last, return i redo són expressions, pel que poden ser usades amb els operadors curtcircuit.

Perl també té dues construccions implícitas per a bucles:

resultats = grep {... } llista
resultats = map  {... } llista

grep retorna tots els elements de llista en què el bloc subordinat avalua a veritable. map avalua el bloc subordinat per cada element de llista i retorna una llista dels valors resultants. Aquestes construccions permeten un estil simple de programació funcional.

No hi ha declaració switch (salt multi-camí) en Perl 5. La documentació Perl descriu mitja dotzena de formes d'aconseguir el mateix efecte usant altres estructures de control. Existeix no obstant això un mòdul Switch, que proporciona la funcionalitat modelada per al pròxim Perl 6.

Perl inclou una declaració goto etiqueta, però és usada rarament. Les situacions on en altres llenguatges s'utilitza goto no ocorren tan sovint en Perl a causa de les seves àmplies opcions de control de fluix.

Existeix també una declaració goto &sub que realitza una trucada 'final'. Acaba la subrutina actual i immediatament crida a la sub especificada. Això s'usa en situacions on una nova subrutina pot realitzar una gestió de la pila més eficient que el propi Perl (perquè típicament no es requereix cap canvi en la pila actual), i en una recursión molt profunda aquest tipus de trucades pot tenir un substancial impacte positiu en el funcionament perquè evita la sobrecàrrega de la gestió context/pila en el moment de retornar.

[editar] Subrutinas

Les subrutinas es defineixen amb la paraula clau sub i invocades simplement nomenant-les. Si la subrutina en qüestió no ha estat encara declarada, és necessari, per al procés de parseo, posar els parèntesis.

foo();           # parèntesis necessaris aquí...
sub foo {... }
foo;             #... però no aquí

Una llista d'arguments poden ser indicats després del nom de la subrutina. Els arguments poden ser escalessis, llestes o hashes.

foo $x, @i, %z;

Els paràmetres d'una subrutina no necessiten ser declarats, ni en nombre ni en tipus; de fet, poden variar en cada trucada. Els arrays són expandits als seus elements, els hashes a una llista de parells clau/valor i tot el conjunt és passat a la subrutina com una indiferenciada llesta d'escalessis.

Qualssevol dels arguments passats estan disponibles per a la subrutina en l'array especial @_. Els elements de \@_ so associats als arguments actuals; canviant un element de \@_ canvia l'argument corresponent.

Els elements de \@_ poden ser accedits amb els subíndices de la forma normal.

$_[0], $_[1]

No obstant això, el codi resultant pot ser difícil de llegir i els paràmetres tenir una semàntica de passada per referència, que pot resultar alguna cosa no desitjable.

Un modismo comú és assignar @_ a una llista de variables amb noms.

my($x, $i, $z) = @_;

Això afecta tant a la mnemónica dels noms dels paràmetres com a la semàntica dels valors passats per valor. La paraula clau my indica que les següents variables estan léxicamente embebidas en el bloc que les contenen.

Un altre modismo és treure els paràmetres de \@_ . Això és molt comú quan la subrutina pren un només argument.

my $x = shift;  # Si no es diu gens, ens referim a \@_

Les subrutinas poden retornar valors.

return 42, $x, @i, %z;

Si la subrutina no surt via declaració return, llavors retorna l'última expressió avaluada en el cos de la subrutina. Arrays i hashes en el valor de tornada són expandits a una llista d'escalessis, igual que si fossin arguments d'una funció.

L'expressió retornada és avaluada en el context de la trucada de la subrutina; això pot sorprendre al desprevenido.

sub llesta {      (4, 5, 6)     }
sub array { @x = (4, 5, 6); @x }
 
$x = llesta;  # retorna 6 - últim element de la llesta
$x = array;  # retorna 3 - nombre d'elements de la llesta
@x = llesta;  # retorna (4, 5, 6)
@x = array;  # retorna (4, 5, 6)

Una subrutina pot descobrir el seu context de trucada amb la funció wantarray.

sub qualsevol { wantarray ? (1, 2) : "Taronges" }
 
$x = qualsevol;    # retorna "Taronges"
@x = qualsevol;    # retorna (1, 2)

[editar] Expressions regulars

El llenguatge Perl inclou una sintaxis especialitzada per a escriure expressions regulars i l'intèrpret conté un motor per a aparellar strings amb expressions regulars. El motor d'expressions regulars usa un algoritmo de Volta Enrere (backtracking), estenent les seves capacitats des del simple emparejamiento de patrons simples amb la captura i substitució de strings. El motor d'expressions regulars es deriva de regex, escrit per Henry Spencer.

La sintaxis d'expressions regulars va ser originalmente presa de les expressions regulars d'Unix Versió 8. No obstant això, es va diferenciar ja abans del primer llançament de Perl i des de llavors ha anat incorporant moltes més característiques. Altres llenguatges i aplicacions estan adoptant les expressions regulars de Perl (PCRE) en comptes de les expressions regulars POSIX, incloent PHP, Ruby, Java i el Servidor HTTP Apache.

L'operador m// (aparella) permet comprovar un emparejamiento per mitjà d'una expressió regular. (Per a abreviar, el precedent m pot ser omès.) En el cas més simple, una expressió com:

$x = m/abc/

avalua a veritable si i només si el string $x aparella amb l'expressió regular abc.

Parts de l'expressió regular poden ser incloses entre parèntesi: les parts corresponents d'un string aparellat són capturades. Els strings capturats són assignats de forma secuencial a les variables internes $1, $2, $3,... i una llista de strings capturats es retorna com valor de l'emparejamiento.

$x = m/a(.)c/;  # captura el caràcter entri 'a' i 'c' i ho guarda en $1

L'operador s/// (substitució) especifica una operació de recerca i reemplaço:

$x = s/abc/aBc/;   # Converteix la b en majúscula

Les expressions regulars en Perl poden prendre uns modificadores. Són sufixos d'una sola lletra que modifiquen el significat de l'expressió:

$x = m/abc/i;      # emparejamiento independentment de si estan en majúscula o minúscula
$x = s/abc/aBc/g;  # recerca i reemplaço global (al llarg de tot el string)

Les expressions regulars poden ser denses i crípticas. Això és perquè la sintaxis de les expressions regulars és extremadament compacta, generalment usant caràcters solts o parells de caràcters que representen les seves operacions. Perl alleuja una mica aquest problema amb el modificador /x que permet als programadores posar espai en blanc i comentaris dintre de les expressions regulars:

$x = m/a     # aparella una 'a'
       .     # aparella qualsevol caràcter
        c     # aparella una 'c'
         /x;

Un ús comú de les expressions regulars és el d'especificar delimitadores de camps a l'operador split:

@paraules = split m/,/, $línia;   # divideix la $línia de valors separats per mengis

L'operador split complementa la captura de string. La captura de string retorna les parts d'un string que aparellen amb una expressió regular; split retorna les parts que no aparellen.

[editar] Interfaz amb bases de dades

Perl està àmpliament afavorit per a les aplicacions de bases de dades. Les seves facilitats de maneig de text són bones per a generar consultes SQL; arrays, hashes i la gestió de memòria automàtica fa fàcil recollir i processar les dades retornades.

En les primeres versions de Perl, les interfaces de bases de dades van ser creades enllaçant l'intèrpret amb una biblioteca de base de dades des del costat del client. Això era alguna cosa maldestre; un problema en particular va ser que l'ejecutable perl resultant estava restringit a usar només una interfaz de base de dades, la qual havia estat enllaçada. També, reenlazar l'intèrpret era el suficientment dificultoso que només va ser realitzat per a algunes de les més famoses i importants bases de dades.

En Perl 5, les interfaces de bases de dades estan implementadas pel mòdul Perl DBI. El mòdul DBI presenta una única interfaz a les aplicacions Perl, independent de les bases de dades, mentre que els mòduls DBD:: (Controlador de base de dades) manegen els detalls d'accés a unes 50 bases de dades diferents. Existeixen controladors DBD:: per a la major part de les bases de dades ANSI SQL.

[editar] Comparativa de funcionament

El "Computer Language Shootout Benchmarks" compara el funcionament d'implementaciones de problemes de programació típics, en diversos llenguatges. Els seus implementaciones Perl normalment prenen més memòria que les implementaciones en altres llenguatges, i això varia els resultats de velocitat. Les prestacions de Perl són similars a les d'altres llenguatges com Python, PHP o Ruby, però més lent que la major part de llenguatges compilados.

Perl pot ser més lent que altres llenguatges fent el mateix perquè ha de compilar el font cada vegada que corre el programa. En "A Timely Start", Jean-Louis Leroy va trobar que els seus scripts en Perl trigaven molt més temps a córrer que el que ell esperava perquè l'intèrpret perl perdia la major part del temps buscant i compilando els mòduls. Com Perl no pot salvar la seva compilació intermèdia com ho fan Java, Python i Ruby, els scripts Perl comporten aquesta sobrecàrrega en cada execució. La sobrecàrrega no és un problema quan la fase d'execució és molt llarga, però pot sesgar significativamente en temps d'execució molt curts, com es troba sovint en els benchmarks. Una vegada que perl inicia la fase d'execució, no obstant això, pot ser molt ràpid i típicament supera a altres llenguatges dinàmics. Tecnologies com mod perl superen això guardant el programa compilado en memòria entre execucions, o Class::Autouse que retarda la compilació de parts del programa fins que són necessàries.

[editar] Optimitzant

Nicholas Clark, un desarrollador principal de Perl, diserta sobre algunes millores en el disseny amb Perl i altres solucions en "When perl is not llevi fast enough". Les rutines més crítiques d'un programa Perl poden escriure's en C o fins i tot en llenguatge ensamblador amb XS o Inline.

Optimitzar Perl pot requerir un coneixement íntim del seu funcionament en lloc de la destresa amb el llenguatge i el seu sintaxis, significant que el problema està amb la implementación de Perl en lloc d'amb el llenguatge mateix. Perl 6, la següent versió, prendrà algunes d'aquestes idees com lliçons, que altres llenguatges ja han après.

[editar] Futur

Article principal: Perl 6

En l'any 2000, en la conferència Perl, Jon Orwant va fer una petició per a una nova versió del llenguatge.[8] Això va conduir a una decisió per a començar el treball del rediseño del llenguatge, que es cridaria Perl 6. Es van demanar proposades a la comunitat Perl per a les noves característiques del llenguatge, i es van rebre més de 300 RFC (de l'anglès Request For Comments, petició de comentaris).

Larry Wall va estar els següents anys digerint els RFC i sintetitzant-los en un entorn de treball coherent per a Perl 6. Va presentar el seu disseny de Perl 6 en una sèrie de documents anomenats Apocalipsis, que es numeren per a correspondre's amb els capítols de Programming Perl. L'actual, inacabada especificació de Perl 6, està resumida en uns documents de disseny anomenats Sinopsis, que estan numerats per a correspondre als Apocalipsis.

Perl 6 no té la intenció de ser compatible per a enrere, encara que existirà una manera de compatibilidad.

En 2001 es va decidir que Perl 6 corregués en una màquina virtual cridada Parrot. Això vol dir que altres llenguatges que usin Parrot podran guanyar accés natiu a CPAN i permetrà algun cert nivell de desenvolupament creuat.

En 2005 Audrey Tang va crear el projecte pugs, una implementación de Perl 6 en Haskell. Va ser i és una plataforma de testeo del llenguatge Perl 6 (separat del desenvolupament actual de la implementación) permetent als dissenyadors explorar. El projecte pugs va engendrar una activa comunitat Perl/Haskell centrada al voltant del canal irc #perl6 en Freenode.

Un cert nombre de característiques en el llenguatge Perl 6 mostren una similitud amb les d'Haskell i Perl 6 ha estat acollit per la comunitat Haskell com un potencial llenguatge de scripting.

En el 2006, Perl 6, Parrot i pugs segueixen estant baix desenvolupament i un nou mòdul per a Perl 5 cridat v6 permet a una part del codi Perl 6 córrer directament sobre Perl 5.

[editar] Diversió amb Perl

Com en C, les competicions de codi ofuscado són un tret popular de la cultura Perl. L'Obfuscated Perl contest homenatja la virtut de la flexibilitat sintáctica de Perl. El programa següent imprimeix el text "Just another Perl / Unix hacker", usant 32 processos en paral·lel coordinats amb pipes. L'explicació completa està disponible en el lloc web de l'autor.

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","o$p"}=(P,P);pipe"r$p","o$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$ford
($p{$_})&6];$p$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p[P.]/&&
close$_}%p;wait until$?;mapr/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print

De forma similar al codi ofuscado però amb un propòsit diferent, "Poesia Perl" és la pràctica d'escriure poemes que puguin ser compilados com codi legal de Perl (encara que generalment sense sentit). Aquesta afició és més o menys única en Perl a causa del gran nombre de paraules normals de l'Anglès que el llenguatge utilitza. Els nous poemes es publiquen de forma regular en el lloc Perl Monks, en la secció Poesia Perl. Part del saber de Perl està en Black Perl, un exemple infame de la poètica de Perl.

Un altre pasatiempo és "Perl Golf". Com amb l'esport real, la meta és reduir el nombre de cops necessaris per a completar un objectiu, però aquí, els "cops" es refereixen als pulsacions de teclat en comptes dels recorreguts en un club de golf. Es proposa una tasca, com "escanear un string d'entrada i retornar el palíndromo més gran que contingui" i els participants intenten batre als seus oponentes escrivint solucions que requereixin cada vegada menys caràcters de codi font Perl.

Una altra tradició entre els hackers Perl és escriure JAPH, que és una espècie de petits programes ofuscados que imprimeixen la frase "Just another Perl hacker,". El "canónico" JAPH inclou la mengi al final, encara que sovint s'omet, i moltes altres variants que s'han creat (exemple: [4], que imprimeix "Just Another Perl Pirate!").

Un mòdul Perl interessant és Lingua::Romana::Perligata (en CPAN). Aquest mòdul tradueix el codi font d'un script escrit en Llatí a Perl, permetent al programador escriure programes ejecutables en Llatí.

La comunitat Perl ha reservat l'espai de noms "Acme" per als mòduls que siguin divertits o experimentals. Alguns dels mòduls Acme estan implementados de maneres molt entretingudes. Alguns exemples:

  • Acme::Bleach, un dels primers mòduls en Acme::, permet al codi font d'un programa ser "blanquejat" (és a dir, tots els caràcters són reemplaçats per l'espai en blanc) i seguir funcionant. És un exemple d'un filtre de codi font. Hi ha també un cert nombre d'altres filtres de font en l'espai de noms Acme.
  • Acme::Hello simplifica el procés d'escriure un programa "Hello, World!"
  • Acme::Currency permet canviar el prefix "$" de les variables escalessis per un altre caràcter (per defecte usa l'euro "€")
  • Acme::ProgressBar és, completament fet a propòsit, una horrible i ineficiente forma d'indicar el progrés d'una tasca
  • Acme::VerySign satiriza el largamente criticat servei Site Finder de VeriSign
  • Acme::Don't implementa l'oposat lògic de la paraula clau dodon't—, que no executa el bloc de codi subordinat.

[editar] Enllacis relacionats

[editar] Vegi's també

[editar] Notes

  1. a b Larry Wall. Consultat el 2006-08-20. (anglès)
  2. Usenet post, May 10th 1997, with ANEU 199705101952.MAA00756@wall.org.
  3. Una descripció de l'intèrpret Perl 5 es pot trobar en Programming Perl, 3rd Ed., capítol 18 (anglès)
  4. Hietaniemi, Jarkko (1998). CPAN.org:Perl Ports (Binary Distributions).
  5. Prevalgui Estafi Freeware:The MacPerl Pages (1997).
  6. Win32 Perl Wiki:Win32 Distributions.
  7. Kennedy, Adam (2006). Win32 Perl Wiki.
  8. Transcripción de la xerrada de Larry. Anotada el 28 de setembre de 2006. (anglès)

[editar] Enllaços externs

Excepte la secció Recursos en Espanyol o indicació expressa, tots els enllacis porten a pàgines en anglès

[editar] Pàgines de manual Perl

Les pàgines de manual de Perl s'inclouen en la distribució font. Estan disponibles en la web http://perldoc.perl.org/ (en anglès). Alguns bons llocs per a començar (tots en anglès) són:

[editar] Recursos principals

[editar] Recursos en Espanyol

Wikilibros

[editar] Desenvolupament

[editar] Suporti

[editar] Distribucions

[editar] Miscelánea