Perl - Guida rapida
Perl è un linguaggio di programmazione generico sviluppato originariamente per la manipolazione del testo e ora utilizzato per un'ampia gamma di attività, tra cui amministrazione del sistema, sviluppo web, programmazione di rete, sviluppo di GUI e altro.
Cos'è Perl?
Perl è un linguaggio di programmazione stabile e multipiattaforma.
Sebbene Perl non sia ufficialmente un acronimo, ma poche persone lo hanno usato come Practical Extraction and Report Language.
Viene utilizzato per progetti mission-critical nel settore pubblico e privato.
Perl è un software Open Source , concesso in licenza con la sua Artistic License , o GNU General Public License (GPL) .
Perl è stato creato da Larry Wall.
Perl 1.0 è stato rilasciato su alt.comp.sources di Usenet nel 1987.
Al momento della stesura di questo tutorial, l'ultima versione di perl era la 5.16.2.
Perl è elencato nell'Oxford English Dictionary .
PC Magazine ha annunciato Perl come finalista per il suo premio per l'eccellenza tecnica 1998 nella categoria Strumenti di sviluppo.
Funzionalità Perl
Perl prende le migliori caratteristiche da altri linguaggi, come C, awk, sed, sh e BASIC, tra gli altri.
Interfaccia di integrazione del database Perls DBI supporta database di terze parti inclusi Oracle, Sybase, Postgres, MySQL e altri.
Perl funziona con HTML, XML e altri linguaggi di markup.
Perl supporta Unicode.
Perl è conforme a Y2K.
Perl supporta sia la programmazione procedurale che quella orientata agli oggetti.
Perl si interfaccia con le librerie C / C ++ esterne tramite XS o SWIG.
Perl è estensibile. Sono disponibili oltre 20.000 moduli di terze parti dalla Comprehensive Perl Archive Network ( CPAN ).
L'interprete Perl può essere incorporato in altri sistemi.
Perl e il Web
Perl era il linguaggio di programmazione web più popolare grazie alle sue capacità di manipolazione del testo e al rapido ciclo di sviluppo.
Perl è ampiamente conosciuto come " il nastro adesivo di Internet ".
Perl può gestire dati Web crittografati, comprese le transazioni di e-commerce.
Perl può essere incorporato nei server web per accelerare l'elaborazione fino al 2000%.
Il mod_perl di Perl consente al server web Apache di incorporare un interprete Perl.
Il pacchetto DBI di Perl semplifica l'integrazione del database web.
Perl è interpretato
Perl è un linguaggio interpretato, il che significa che il codice può essere eseguito così com'è, senza una fase di compilazione che crei un programma eseguibile non portabile.
I compilatori tradizionali convertono i programmi in linguaggio macchina. Quando si esegue un programma Perl, viene prima compilato in un codice byte, che viene quindi convertito (durante l'esecuzione del programma) in istruzioni macchina. Quindi non è proprio la stessa cosa delle shell, o Tcl, che sonostrictly interpretato senza una rappresentazione intermedia.
Inoltre non è come la maggior parte delle versioni di C o C ++, che sono compilate direttamente in un formato dipendente dalla macchina. È da qualche parte nel mezzo, insieme ai file Python e awk ed Emacs .elc.
Prima di iniziare a scrivere i nostri programmi Perl, capiamo come configurare il nostro ambiente Perl. Perl è disponibile su un'ampia varietà di piattaforme:
- Unix (Solaris, Linux, FreeBSD, AIX, HP / UX, SunOS, IRIX ecc.)
- Win 9x / NT / 2000 /
- WinCE
- Macintosh (PPC, 68K)
- Solaris (x86, SPARC)
- OpenVMS
- Alpha (7.2 e versioni successive)
- Symbian
- Debian GNU / kFreeBSD
- MirOS BSD
- E molti altri...
È più probabile che il tuo sistema abbia installato perl su di esso. Prova a dare il seguente comando al $ prompt -
$perl -v
Se hai installato perl sulla tua macchina, riceverai un messaggio come segue:
This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Se non hai già installato perl, procedi alla sezione successiva.
Ottenere l'installazione di Perl
Il codice sorgente più aggiornato e attuale, i binari, la documentazione, le notizie, ecc. Sono disponibili sul sito web ufficiale di Perl.
Perl Official Website - https://www.perl.org/
È possibile scaricare la documentazione Perl dal seguente sito.
Perl Documentation Website - https://perldoc.perl.org
Installa Perl
La distribuzione di Perl è disponibile per un'ampia varietà di piattaforme. Devi scaricare solo il codice binario applicabile alla tua piattaforma e installare Perl.
Se il codice binario per la tua piattaforma non è disponibile, è necessario un compilatore C per compilare manualmente il codice sorgente. La compilazione del codice sorgente offre una maggiore flessibilità in termini di scelta delle funzionalità richieste durante l'installazione.
Ecco una rapida panoramica dell'installazione di Perl su varie piattaforme.
Installazione di Unix e Linux
Ecco i semplici passaggi per installare Perl su macchine Unix / Linux.
Apri un browser Web e vai a https://www.perl.org/get.html.
Segui il link per scaricare il codice sorgente zippato disponibile per Unix / Linux.
Scarica perl-5.x.y.tar.gz file ed emettere i seguenti comandi al $ prompt.
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
NOTE - Qui $ è un prompt Unix in cui digiti il tuo comando, quindi assicurati di non digitare $ mentre digiti i comandi sopra menzionati.
Questo installerà Perl in una posizione standard / usr / local / bin e le sue librerie saranno installate in / usr / local / lib / perlXX , dove XX è la versione di Perl che stai usando.
Ci vorrà un po 'di tempo per compilare il codice sorgente dopo aver emesso il makecomando. Una volta completata l'installazione, puoi emettereperl -vcomando al prompt $ per controllare l'installazione di perl. Se tutto va bene, verrà visualizzato il messaggio come mostrato sopra.
Installazione di Windows
Ecco i passaggi per installare Perl su macchina Windows.
Segui il collegamento per l'installazione di Strawberry Perl su Windows http://strawberryperl.com
Scarica la versione di installazione a 32 o 64 bit.
Eseguire il file scaricato facendo doppio clic su di esso in Esplora risorse. Questo fa apparire la procedura guidata di installazione di Perl, che è davvero facile da usare. Accetta le impostazioni predefinite, attendi fino al termine dell'installazione e sei pronto per partire!
Installazione su Macintosh
Per creare la tua versione di Perl, avrai bisogno di "make", che fa parte degli strumenti di sviluppo di Apples solitamente forniti con i DVD di installazione di Mac OS. Non è necessaria l'ultima versione di Xcode (che ora è a pagamento) per installare make.
Ecco i semplici passaggi per installare Perl su macchina Mac OS X.
Apri un browser Web e vai a https://www.perl.org/get.html.
Segui il link per scaricare il codice sorgente zippato disponibile per Mac OS X.
Scarica perl-5.x.y.tar.gz file ed emettere i seguenti comandi al $ prompt.
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
Questo installerà Perl in una posizione standard / usr / local / bin e le sue librerie saranno installate in / usr / local / lib / perlXX , dove XX è la versione di Perl che stai usando.
Eseguire Perl
I seguenti sono i diversi modi per avviare Perl.
Interprete interattivo
Puoi entrare perle inizia subito a scrivere codice nell'interprete interattivo avviandolo dalla riga di comando. Puoi farlo da Unix, DOS o qualsiasi altro sistema, che ti fornisce un interprete della riga di comando o una finestra della shell.
$perl -e <perl code> # Unix/Linux
or
C:>perl -e <perl code> # Windows/DOS
Ecco l'elenco di tutte le opzioni disponibili della riga di comando:
Sr.No. | Opzione e descrizione |
---|---|
1 | -d[:debugger] Esegue il programma sotto il debugger |
2 | -Idirectory Specifica la directory @ INC / # include |
3 | -T Consente i controlli di contaminazione |
4 | -t Abilita gli avvisi di contaminazione |
5 | -U Consente operazioni non sicure |
6 | -w Abilita molti avvisi utili |
7 | -W Abilita tutti gli avvisi |
8 | -X Disabilita tutti gli avvisi |
9 | -e program Esegue lo script Perl inviato come programma |
10 | file Esegue lo script Perl da un dato file |
Script dalla riga di comando
Uno script Perl è un file di testo, che mantiene il codice Perl al suo interno e può essere eseguito dalla riga di comando invocando l'interprete sulla tua applicazione, come di seguito:
$perl script.pl # Unix/Linux
or
C:>perl script.pl # Windows/DOS
Ambiente di sviluppo integrato
È possibile eseguire Perl anche da un ambiente con interfaccia utente grafica (GUI). Tutto ciò di cui hai bisogno è un'applicazione GUI sul tuo sistema che supporti Perl. È possibile scaricare Padre, l'IDE Perl . Puoi anche usare Eclipse Plugin EPIC - Perl Editor e IDE for Eclipse se hai familiarità con Eclipse.
Prima di procedere al capitolo successivo, assicurati che il tuo ambiente sia configurato correttamente e funzioni perfettamente. Se non sei in grado di configurare l'ambiente correttamente, puoi chiedere aiuto al tuo amministratore di sistema.
Tutti gli esempi forniti nei capitoli successivi sono stati eseguiti con la versione v5.16.2 disponibile sulla versione CentOS di Linux.
Perl prende in prestito la sintassi e i concetti da molti linguaggi: awk, sed, C, Bourne Shell, Smalltalk, Lisp e persino l'inglese. Tuttavia, ci sono alcune differenze nette tra le lingue. Questo capitolo è stato progettato per metterti rapidamente al passo con la sintassi che ci si aspetta da Perl.
Un programma Perl consiste in una sequenza di dichiarazioni e istruzioni, che vengono eseguite dall'alto verso il basso. I loop, le subroutine e altre strutture di controllo ti consentono di saltare all'interno del codice. Ogni semplice istruzione deve terminare con un punto e virgola (;).
Perl è un linguaggio in formato libero: puoi formattarlo e indentarlo come preferisci. Lo spazio vuoto serve principalmente per separare i token, a differenza di linguaggi come Python dove è una parte importante della sintassi, o Fortran dove è immateriale.
Primo programma Perl
Programmazione in modalità interattiva
Puoi usare l'interprete Perl con -eopzione nella riga di comando, che consente di eseguire istruzioni Perl dalla riga di comando. Proviamo qualcosa a $ prompt come segue:
$perl -e 'print "Hello World\n"'
Questa esecuzione produrrà il seguente risultato:
Hello, world
Programmazione in modalità script
Supponendo che tu sia già su $ prompt, apriamo un file di testo hello.pl usando vi o vim editor e inseriamo le seguenti righe nel tuo file.
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";
Qui /usr/bin/perlè attuale il binario dell'interprete perl. Prima di eseguire lo script, assicurati di cambiare la modalità del file di script e di dare il privilegio di esecuzione, generalmente un'impostazione di 0755 funziona perfettamente e alla fine esegui lo script sopra come segue:
$chmod 0755 hello.pl $./hello.pl
Questa esecuzione produrrà il seguente risultato:
Hello, world
È possibile utilizzare le parentesi per gli argomenti delle funzioni o ometterle in base ai propri gusti personali. Sono richiesti solo occasionalmente per chiarire le questioni di precedenza. Le seguenti due affermazioni producono lo stesso risultato.
print("Hello, world\n");
print "Hello, world\n";
Estensione del file Perl
Uno script Perl può essere creato all'interno di qualsiasi normale programma di editor di testo semplice. Sono disponibili diversi programmi per ogni tipo di piattaforma. Ci sono molti programmi progettati per i programmatori disponibili per il download sul web.
Come convenzione Perl, un file Perl deve essere salvato con estensione .pl o .PL per essere riconosciuto come uno script Perl funzionante. I nomi dei file possono contenere numeri, simboli e lettere ma non devono contenere uno spazio. Usa un trattino basso (_) nelle posizioni degli spazi.
Commenti in Perl
I commenti in qualsiasi linguaggio di programmazione sono amici degli sviluppatori. I commenti possono essere utilizzati per rendere il programma facile da usare e vengono semplicemente ignorati dall'interprete senza influire sulla funzionalità del codice. Ad esempio, nel programma sopra, una riga che inizia con hash# è un commento.
Dicendo semplicemente che i commenti in Perl iniziano con un simbolo cancelletto e corrono fino alla fine della riga -
# This is a comment in perl
Le righe che iniziano con = vengono interpretate come l'inizio di una sezione di documentazione incorporata (pod) e tutte le righe successive fino al taglio successivo = vengono ignorate dal compilatore. Di seguito è riportato l'esempio:
#!/usr/bin/perl
# This is a single line comment
print "Hello, world\n";
=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These comments will be ignored by the
compiler until the next =cut is encountered.
=cut
Questo produrrà il seguente risultato:
Hello, world
Whitespaces in Perl
Un programma Perl non si preoccupa degli spazi bianchi. Il seguente programma funziona perfettamente -
#!/usr/bin/perl
print "Hello, world\n";
Ma se gli spazi sono all'interno delle stringhe tra virgolette, verrebbero stampati così come sono. Ad esempio:
#!/usr/bin/perl
# This would print with a line break in the middle
print "Hello
world\n";
Questo produrrà il seguente risultato:
Hello
world
Tutti i tipi di spazi bianchi come spazi, tabulazioni, nuove righe, ecc. Sono equivalenti per l'interprete quando vengono utilizzati al di fuori delle virgolette. Una riga contenente solo spazi bianchi, possibilmente con un commento, è conosciuta come una riga vuota e Perl la ignora completamente.
Virgolette singole e doppie in Perl
È possibile utilizzare virgolette doppie o virgolette singole attorno a stringhe letterali come segue:
#!/usr/bin/perl
print "Hello, world\n";
print 'Hello, world\n';
Questo produrrà il seguente risultato:
Hello, world
Hello, world\n$
C'è una differenza importante tra virgolette singole e doppie. Solo virgolette doppieinterpolatevariabili e caratteri speciali come le nuove righe \ n, mentre le virgolette singole non interpola alcuna variabile o carattere speciale. Controlla l'esempio di seguito in cui stiamo usando $ a come variabile per memorizzare un valore e successivamente stampare quel valore -
#!/usr/bin/perl
$a = 10; print "Value of a = $a\n";
print 'Value of a = $a\n';
Questo produrrà il seguente risultato:
Value of a = 10
Value of a = $a\n$
Documenti "qui"
È possibile memorizzare o stampare testo multilinea con grande comodità. Anche tu puoi usare le variabili all'interno del documento "qui". Di seguito è riportata una semplice sintassi, verificare attentamente che non vi siano spazi tra << e l'identificatore.
Un identificatore può essere una semplice parola o un testo citato come abbiamo usato EOF di seguito. Se l'identificatore è citato, il tipo di citazione che usi determina il trattamento del testo all'interno del here docoment, proprio come nelle normali citazioni. Un identificatore non quotato funziona come virgolette doppie.
#!/usr/bin/perl
$a = 10;
$var = <<"EOF"; This is the syntax for here document and it will continue until it encounters a EOF in the first line. This is case of double quote so variable value will be interpolated. For example value of a = $a
EOF
print "$var\n"; $var = <<'EOF';
This is case of single quote so variable value will be
interpolated. For example value of a = $a EOF print "$var\n";
Questo produrrà il seguente risultato:
This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be
interpolated. For example value of a = 10
This is case of single quote so variable value will be
interpolated. For example value of a = $a
Caratteri in fuga
Perl utilizza il carattere barra rovesciata (\) per eseguire l'escape di qualsiasi tipo di carattere che potrebbe interferire con il nostro codice. Facciamo un esempio in cui vogliamo stampare virgolette doppie e $ segno -
#!/usr/bin/perl
$result = "This is \"number\""; print "$result\n";
print "\$result\n";
Questo produrrà il seguente risultato:
This is "number"
$result
Identificatori Perl
Un identificatore Perl è un nome utilizzato per identificare una variabile, una funzione, una classe, un modulo o un altro oggetto. Un nome di variabile Perl inizia con $, @ o% seguito da zero o più lettere, trattini bassi e cifre (da 0 a 9).
Perl non consente caratteri di punteggiatura come @, $ e% all'interno degli identificatori. Perl è un filecase sensitivelinguaggio di programmazione. Così$Manpower e $manpower sono due identificatori differenti in Perl.
Perl è un linguaggio vagamente tipizzato e non è necessario specificare un tipo per i dati durante l'utilizzo nel programma. L'interprete Perl sceglierà il tipo in base al contesto dei dati stessi.
Perl ha tre tipi di dati di base: scalari, array di scalari e hash di scalari, noti anche come array associativi. Ecco un piccolo dettaglio su questi tipi di dati.
Sr.No. | Tipi e descrizione |
---|---|
1 | Scalar Gli scalari sono variabili semplici. Sono preceduti da un segno di dollaro ($). Uno scalare è un numero, una stringa o un riferimento. Un riferimento è in realtà un indirizzo di una variabile, che vedremo nei prossimi capitoli. |
2 | Arrays Gli array sono elenchi ordinati di scalari a cui si accede con un indice numerico, che inizia con 0. Sono preceduti da un segno "a" (@). |
3 | Hashes Gli hash sono set non ordinati di coppie chiave / valore a cui si accede utilizzando le chiavi come pedici. Sono preceduti da un segno di percentuale (%). |
Letterali numerici
Perl memorizza tutti i numeri internamente come interi con segno o come valori in virgola mobile a doppia precisione. I valori letterali numerici sono specificati in uno dei seguenti formati a virgola mobile o intero:
genere | Valore |
---|---|
Numero intero | 1234 |
Numero intero negativo | -100 |
Virgola mobile | 2000 |
Notazione scientifica | 16.12E14 |
Esadecimale | 0xffff |
Octal | 0577 |
Valori letterali stringa
Le stringhe sono sequenze di caratteri. Di solito sono valori alfanumerici delimitati da virgolette singole (') o doppie ("). Funzionano in modo molto simile alle virgolette di shell UNIX in cui è possibile utilizzare stringhe con virgolette singole e stringhe con virgolette doppie.
I valori letterali di stringa tra virgolette doppie consentono l'interpolazione delle variabili e le stringhe con apici singoli non lo sono. Ci sono alcuni caratteri quando sono preceduti da una barra rovesciata, hanno un significato speciale e sono usati per rappresentare come una nuova riga (\ n) o una tabulazione (\ t).
Puoi incorporare le nuove righe o una qualsiasi delle seguenti sequenze di escape direttamente nelle stringhe tra virgolette doppie:
Sequenza di escape | Senso |
---|---|
\\ | Barra rovesciata |
\ ' | Virgoletta singola |
\ " | Virgolette doppie |
\un | Allerta o campanello |
\ b | Backspace |
\ f | Avanzamento modulo |
\ n | Nuova linea |
\ r | Ritorno in carrozza |
\ t | Tab orizzontale |
\ v | Scheda verticale |
\ 0nn | Crea numeri in formato ottale |
\ xnn | Crea numeri in formato Hexideciamal |
\ cX | Controlla i caratteri, x può essere qualsiasi carattere |
\ u | Forza il carattere successivo in maiuscolo |
\ l | Forza il carattere successivo in minuscolo |
\ U | Forza tutti i seguenti caratteri in maiuscolo |
\ L | Forza tutti i caratteri seguenti in minuscolo |
\ Q | Barra rovesciata su tutti i caratteri non alfanumerici seguenti |
\ E | Fine \ U, \ L o \ Q |
Esempio
Vediamo ancora come si comportano le stringhe con virgolette singole e virgolette doppie. Qui useremo gli escape di stringa menzionati nella tabella sopra e utilizzeremo la variabile scalare per assegnare valori di stringa.
#!/usr/bin/perl
# This is case of interpolation.
$str = "Welcome to \ntutorialspoint.com!";
print "$str\n"; # This is case of non-interpolation. $str = 'Welcome to \ntutorialspoint.com!';
print "$str\n"; # Only W will become upper case. $str = "\uwelcome to tutorialspoint.com!";
print "$str\n"; # Whole line will become capital. $str = "\UWelcome to tutorialspoint.com!";
print "$str\n"; # A portion of line will become capital. $str = "Welcome to \Ututorialspoint\E.com!";
print "$str\n"; # Backsalash non alpha-numeric including spaces. $str = "\QWelcome to tutorialspoint's family";
print "$str\n";
Questo produrrà il seguente risultato:
Welcome to
tutorialspoint.com!
Welcome to \ntutorialspoint.com!
Welcome to tutorialspoint.com!
WELCOME TO TUTORIALSPOINT.COM!
Welcome to TUTORIALSPOINT.com!
Welcome\ to\ tutorialspoint\'s\ family
Le variabili sono le posizioni di memoria riservate per memorizzare i valori. Ciò significa che quando crei una variabile riservi dello spazio in memoria.
In base al tipo di dati di una variabile, l'interprete alloca la memoria e decide cosa può essere memorizzato nella memoria riservata. Pertanto, assegnando diversi tipi di dati alle variabili, è possibile memorizzare numeri interi, decimali o stringhe in queste variabili.
Abbiamo appreso che Perl ha i seguenti tre tipi di dati di base:
- Scalars
- Arrays
- Hashes
Di conseguenza, useremo tre tipi di variabili in Perl. UNscalarla variabile precederà un segno di dollaro ($) e può memorizzare un numero, una stringa o un riferimento. Unarrayla variabile precederà il segno @ e memorizzerà elenchi ordinati di scalari. Infine, ilHash variabile precederà dal segno% e verrà utilizzata per memorizzare set di coppie chiave / valore.
Perl mantiene ogni tipo di variabile in uno spazio dei nomi separato. Quindi puoi, senza paura di conflitti, usare lo stesso nome per una variabile scalare, un array o un hash. Ciò significa che $ foo e @foo sono due variabili diverse.
Creazione di variabili
Le variabili Perl non devono essere dichiarate esplicitamente per riservare spazio di memoria. La dichiarazione avviene automaticamente quando si assegna un valore a una variabile. Il segno di uguale (=) viene utilizzato per assegnare valori alle variabili.
Tieni presente che questo è obbligatorio per dichiarare una variabile prima di usarla se la usiamo use strict dichiarazione nel nostro programma.
L'operando a sinistra dell'operatore = è il nome della variabile e l'operando a destra dell'operatore = è il valore memorizzato nella variabile. Ad esempio:
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
Qui 25, "John Paul" e 1445.50 sono i valori assegnati rispettivamente alle variabili $ age , $ name e $ salary . Tra poco vedremo come possiamo assegnare valori ad array e hash.
Variabili scalari
Uno scalare è una singola unità di dati. Tali dati potrebbero essere un numero intero, una virgola mobile, un carattere, una stringa, un paragrafo o un'intera pagina web. Semplicemente dicendo che potrebbe essere qualsiasi cosa, ma solo una cosa.
Ecco un semplice esempio di utilizzo delle variabili scalari:
#!/usr/bin/perl
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
print "Age = $age\n"; print "Name = $name\n";
print "Salary = $salary\n";
Questo produrrà il seguente risultato:
Age = 25
Name = John Paul
Salary = 1445.5
Variabili di matrice
Un array è una variabile che memorizza un elenco ordinato di valori scalari. Le variabili di matrice sono precedute da un segno "at" (@). Per fare riferimento a un singolo elemento di un array, utilizzerai il simbolo del dollaro ($) con il nome della variabile seguito dall'indice dell'elemento tra parentesi quadre.
Ecco un semplice esempio di utilizzo delle variabili array:
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
Qui abbiamo usato il segno di escape (\) prima del segno $ solo per stamparlo. Un altro Perl lo interpreterà come una variabile e ne stamperà il valore. Quando viene eseguito, questo produrrà il seguente risultato:
$ages[0] = 25
$ages[1] = 30 $ages[2] = 40
$names[0] = John Paul $names[1] = Lisa
$names[2] = Kumar
Variabili hash
Un hash è un insieme di file key/valuecoppie. Le variabili hash sono precedute da un segno di percentuale (%). Per fare riferimento a un singolo elemento di un hash, utilizzerai il nome della variabile hash seguito dalla "chiave" associata al valore tra parentesi graffe.
Ecco un semplice esempio di utilizzo delle variabili hash:
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
Questo produrrà il seguente risultato:
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
Contesto variabile
Perl tratta la stessa variabile in modo diverso in base al contesto, cioè alla situazione in cui viene utilizzata una variabile. Controlliamo il seguente esempio:
#!/usr/bin/perl
@names = ('John Paul', 'Lisa', 'Kumar');
@copy = @names;
$size = @names; print "Given names are : @copy\n"; print "Number of names are : $size\n";
Questo produrrà il seguente risultato:
Given names are : John Paul Lisa Kumar
Number of names are : 3
Qui @names è un array, che è stato utilizzato in due diversi contesti. Per prima cosa l'abbiamo copiato in qualsiasi altro array, cioè list, quindi ha restituito tutti gli elementi assumendo che il contesto sia il contesto della lista. Successivamente abbiamo usato lo stesso array e provato a memorizzare questo array in uno scalare, quindi in questo caso ha restituito solo il numero di elementi in questo array assumendo che il contesto sia un contesto scalare. La tabella seguente elenca i vari contesti:
Sr.No. | Contesto e descrizione |
---|---|
1 | Scalar L'assegnazione a una variabile scalare valuta il lato destro in un contesto scalare. |
2 | List L'assegnazione a un array o un hash valuta il lato destro in un contesto di elenco. |
3 | Boolean Il contesto booleano è semplicemente qualsiasi luogo in cui un'espressione viene valutata per vedere se è vera o falsa. |
4 | Void Questo contesto non solo non si preoccupa di quale sia il valore di ritorno, ma non vuole nemmeno un valore di ritorno. |
5 | Interpolative Questo contesto si verifica solo tra virgolette o cose che funzionano come virgolette. |
Uno scalare è una singola unità di dati. Tali dati potrebbero essere un numero intero, una virgola mobile, un carattere, una stringa, un paragrafo o un'intera pagina web.
Ecco un semplice esempio di utilizzo delle variabili scalari:
#!/usr/bin/perl
$age = 25; # An integer assignment $name = "John Paul"; # A string
$salary = 1445.50; # A floating point print "Age = $age\n";
print "Name = $name\n"; print "Salary = $salary\n";
Questo produrrà il seguente risultato:
Age = 25
Name = John Paul
Salary = 1445.5
Scalari numerici
Uno scalare è molto spesso un numero o una stringa. L'esempio seguente dimostra l'utilizzo di vari tipi di scalari numerici:
#!/usr/bin/perl
$integer = 200; $negative = -300;
$floating = 200.340; $bigfloat = -1.2E-23;
# 377 octal, same as 255 decimal
$octal = 0377; # FF hex, also 255 decimal $hexa = 0xff;
print "integer = $integer\n"; print "negative = $negative\n";
print "floating = $floating\n"; print "bigfloat = $bigfloat\n";
print "octal = $octal\n"; print "hexa = $hexa\n";
Questo produrrà il seguente risultato:
integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255
Scalari di stringa
L'esempio seguente dimostra l'utilizzo di vari tipi di scalari di stringa. Notare la differenza tra stringhe con virgolette singole e stringhe con virgolette doppie -
#!/usr/bin/perl
$var = "This is string scalar!"; $quote = 'I m inside single quote - $var'; $double = "This is inside single quote - $var"; $escape = "This example of escape -\tHello, World!";
print "var = $var\n"; print "quote = $quote\n";
print "double = $double\n"; print "escape = $escape\n";
Questo produrrà il seguente risultato:
var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape - Hello, World
Operazioni scalari
Vedrai un dettaglio dei vari operatori disponibili in Perl in un capitolo separato, ma qui elencheremo alcune operazioni numeriche e sulle stringhe.
#!/usr/bin/perl
$str = "hello" . "world"; # Concatenates strings.
$num = 5 + 10; # adds two numbers. $mul = 4 * 5; # multiplies two numbers.
$mix = $str . $num; # concatenates string and number. print "str = $str\n";
print "num = $num\n"; print "mix = $mix\n";
Questo produrrà il seguente risultato:
str = helloworld
num = 15
mul = 20
mix = helloworld15
Stringhe multilinea
Se vuoi introdurre stringhe multilinea nei tuoi programmi, puoi usare le virgolette singole standard come di seguito -
#!/usr/bin/perl
$string = 'This is a multiline string'; print "$string\n";
Questo produrrà il seguente risultato:
This is
a multiline
string
Puoi usare anche la sintassi del documento "qui" per memorizzare o stampare multilinee come di seguito -
#!/usr/bin/perl
print <<EOF;
This is
a multiline
string
EOF
Anche questo produrrà lo stesso risultato:
This is
a multiline
string
V-Strings
Un valore letterale nella forma v1.20.300.4000 viene analizzato come una stringa composta da caratteri con gli ordinali specificati. Questa forma è nota come v-string.
Una v-string fornisce un modo alternativo e più leggibile per costruire stringhe, piuttosto che usare la forma di interpolazione un po 'meno leggibile "\ x {1} \ x {14} \ x {12c} \ x {fa0}".
Sono qualsiasi valore letterale che inizia con av ed è seguito da uno o più elementi separati da punti. Ad esempio:
#!/usr/bin/perl
$smile = v9786; $foo = v102.111.111;
$martin = v77.97.114.116.105.110; print "smile = $smile\n";
print "foo = $foo\n"; print "martin = $martin\n";
Anche questo produrrà lo stesso risultato:
smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.
Letterali speciali
Finora devi avere un'idea degli scalari delle stringhe e della sua concatenazione e interpolazione. Quindi lasciate che vi parli di tre letterali speciali __FILE__, __LINE__ e __PACKAGE__ rappresentano il nome del file corrente, il numero di riga e il nome del pacchetto a quel punto nel vostro programma.
Possono essere usati solo come token separati e non verranno interpolati in stringhe. Controlla l'esempio seguente:
#!/usr/bin/perl
print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";
# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";
Questo produrrà il seguente risultato:
File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__
Un array è una variabile che memorizza un elenco ordinato di valori scalari. Le variabili di matrice sono precedute da un segno "at" (@). Per fare riferimento a un singolo elemento di un array, utilizzerai il simbolo del dollaro ($) con il nome della variabile seguito dall'indice dell'elemento tra parentesi quadre.
Ecco un semplice esempio di utilizzo delle variabili array:
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n"; print "\$ages[1] = $ages[1]\n"; print "\$ages[2] = $ages[2]\n"; print "\$names[0] = $names[0]\n"; print "\$names[1] = $names[1]\n"; print "\$names[2] = $names[2]\n";
Qui abbiamo usato il segno di escape (\) prima del segno $ solo per stamparlo. Un altro Perl lo interpreterà come una variabile e ne stamperà il valore. Quando viene eseguito, questo produrrà il seguente risultato:
$ages[0] = 25 $ages[1] = 30
$ages[2] = 40 $names[0] = John Paul
$names[1] = Lisa $names[2] = Kumar
In Perl, i termini List e Array sono spesso usati come se fossero intercambiabili. Ma l'elenco è i dati e l'array è la variabile.
Creazione di array
Le variabili array sono precedute dal segno @ e vengono popolate utilizzando le parentesi o l'operatore qw. Ad esempio:
@array = (1, 2, 'Hello');
@array = qw/This is an array/;
La seconda riga utilizza l'operatore qw //, che restituisce un elenco di stringhe, separando la stringa delimitata da uno spazio bianco. In questo esempio, ciò porta a una matrice di quattro elementi; il primo elemento è "this" e l'ultimo (quarto) è "array". Ciò significa che puoi utilizzare linee diverse come segue:
@days = qw/Monday
Tuesday
...
Sunday/;
È anche possibile popolare un array assegnando ogni valore individualmente come segue:
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
Accesso agli elementi dell'array
Quando si accede a singoli elementi da un array, è necessario anteporre alla variabile un segno di dollaro ($) e quindi aggiungere l'indice dell'elemento tra parentesi quadre dopo il nome della variabile. Ad esempio:
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
print "$days[0]\n";
print "$days[1]\n"; print "$days[2]\n";
print "$days[6]\n"; print "$days[-1]\n";
print "$days[-7]\n";
Questo produrrà il seguente risultato:
Mon
Tue
Wed
Sun
Sun
Mon
Gli indici degli array iniziano da zero, quindi per accedere al primo elemento è necessario fornire 0 come indici. Puoi anche dare un indice negativo, nel qual caso selezioni l'elemento dalla fine, piuttosto che dall'inizio, dell'array. Ciò significa quanto segue:
print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon
Matrici di numeri sequenziali
Perl offre una scorciatoia per numeri e lettere sequenziali. Invece di digitare ogni elemento quando si conta fino a 100, ad esempio, possiamo fare qualcosa di simile a quanto segue:
#!/usr/bin/perl
@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);
print "@var_10\n"; # Prints number from 1 to 10
print "@var_20\n"; # Prints number from 10 to 20
print "@var_abc\n"; # Prints number from a to z
Qui viene chiamato il doppio punto (..) range operator. Questo produrrà il seguente risultato:
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z
Dimensione array
La dimensione di un array può essere determinata utilizzando il contesto scalare sull'array - il valore restituito sarà il numero di elementi nell'array -
@array = (1,2,3);
print "Size: ",scalar @array,"\n";
Il valore restituito sarà sempre la dimensione fisica dell'array, non il numero di elementi validi. Puoi dimostrarlo, e la differenza tra scalar @array e $ # array, usando questo frammento è la seguente:
#!/usr/bin/perl
@array = (1,2,3);
$array[50] = 4; $size = @array;
$max_index = $#array;
print "Size: $size\n"; print "Max Index: $max_index\n";
Questo produrrà il seguente risultato:
Size: 51
Max Index: 50
Ci sono solo quattro elementi nell'array che contiene informazioni, ma l'array è lungo 51 elementi, con un indice massimo di 50.
Aggiunta e rimozione di elementi in array
Perl fornisce una serie di funzioni utili per aggiungere e rimuovere elementi in un array. Potresti avere una domanda che cos'è una funzione? Finora hai usatoprintfunzione per stampare vari valori. Allo stesso modo ci sono varie altre funzioni o talvolta chiamate sotto-routine, che possono essere utilizzate per varie altre funzionalità.
Sr.No. | Tipi e descrizione |
---|---|
1 | push @ARRAY, LIST Inserisce i valori dell'elenco alla fine dell'array. |
2 | pop @ARRAY Si apre e restituisce l'ultimo valore dell'array. |
3 | shift @ARRAY Sposta il primo valore dell'array e lo restituisce, accorciando l'array di 1 e spostando tutto verso il basso. |
4 | unshift @ARRAY, LIST Antepone l'elenco all'inizio dell'array e restituisce il numero di elementi nel nuovo array. |
#!/usr/bin/perl
# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins = @coins\n";
# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins = @coins\n";
# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins = @coins\n";
# remove one element from the last of the array.
pop(@coins);
print "4. \@coins = @coins\n";
# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins = @coins\n";
Questo produrrà il seguente risultato:
1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel
Affettare elementi array
Puoi anche estrarre una "fetta" da un array, ovvero puoi selezionare più di un elemento da un array per produrre un altro array.
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3,4,5];
print "@weekdays\n";
Questo produrrà il seguente risultato:
Thu Fri Sat
La specifica per una sezione deve avere un elenco di indici validi, positivi o negativi, ciascuno separato da una virgola. Per la velocità, puoi anche usare il.. operatore di gamma -
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3..5];
print "@weekdays\n";
Questo produrrà il seguente risultato:
Thu Fri Sat
Sostituzione degli elementi dell'array
Ora introdurremo un'altra funzione chiamata splice(), che ha la seguente sintassi:
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
Questa funzione rimuoverà gli elementi di @ARRAY designati da OFFSET e LENGTH e li sostituirà con LIST, se specificato. Infine, restituisce gli elementi rimossi dall'array. Di seguito è riportato l'esempio:
#!/usr/bin/perl
@nums = (1..20);
print "Before - @nums\n";
splice(@nums, 5, 5, 21..25);
print "After - @nums\n";
Questo produrrà il seguente risultato:
Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
Qui, la sostituzione effettiva inizia con il sesto numero, dopodiché cinque elementi vengono sostituiti da 6 a 10 con i numeri 21, 22, 23, 24 e 25.
Trasforma le stringhe in array
Diamo un'occhiata a un'altra funzione chiamata split(), che ha la seguente sintassi:
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
Questa funzione divide una stringa in un array di stringhe e la restituisce. Se viene specificato LIMIT, si divide al massimo in quel numero di campi. Se PATTERN viene omesso, si divide in spazi bianchi. Di seguito è riportato l'esempio:
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
print "$string[3]\n"; # This will print Roses print "$names[4]\n"; # This will print Michael
Questo produrrà il seguente risultato:
Roses
Michael
Trasforma array in stringhe
Possiamo usare il file join()funzione per ricongiungere gli elementi dell'array e formare una lunga stringa scalare. Questa funzione ha la seguente sintassi:
join EXPR, LIST
Questa funzione unisce le stringhe separate di LIST in una singola stringa con campi separati dal valore di EXPR e restituisce la stringa. Di seguito è riportato l'esempio:
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
$string1 = join( '-', @string ); $string2 = join( ',', @names );
print "$string1\n"; print "$string2\n";
Questo produrrà il seguente risultato:
Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom
Ordinamento di array
Il sort()funzione ordina ogni elemento di un array in base agli standard numerici ASCII. Questa funzione ha la seguente sintassi:
sort [ SUBROUTINE ] LIST
Questa funzione ordina la LISTA e restituisce il valore dell'array ordinato. Se si specifica SUBROUTINE, la logica specificata all'interno della SUBTROUTINE viene applicata durante l'ordinamento degli elementi.
#!/usr/bin/perl
# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";
# sort this array
@foods = sort(@foods);
print "After: @foods\n";
Questo produrrà il seguente risultato:
Before: pizza steak chicken burgers
After: burgers chicken pizza steak
Si noti che l'ordinamento viene eseguito in base al valore numerico ASCII delle parole. Quindi l'opzione migliore è trasformare prima ogni elemento dell'array in lettere minuscole e quindi eseguire la funzione di ordinamento.
Unione di matrici
Poiché un array è solo una sequenza di valori separati da virgole, puoi combinarli insieme come mostrato di seguito:
#!/usr/bin/perl
@numbers = (1,3,(4,5,6));
print "numbers = @numbers\n";
Questo produrrà il seguente risultato:
numbers = 1 3 4 5 6
Gli array incorporati diventano solo una parte dell'array principale come mostrato di seguito -
#!/usr/bin/perl
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers = (@odd, @even);
print "numbers = @numbers\n";
Questo produrrà il seguente risultato:
numbers = 1 3 5 2 4 6
Selezione di elementi dagli elenchi
La notazione dell'elenco è identica a quella degli array. Puoi estrarre un elemento da un array aggiungendo parentesi quadre all'elenco e fornendo uno o più indici -
#!/usr/bin/perl
$var = (5,4,3,2,1)[4]; print "value of var = $var\n"
Questo produrrà il seguente risultato:
value of var = 1
Allo stesso modo, possiamo estrarre le sezioni, sebbene senza la necessità di un carattere @ iniziale -
#!/usr/bin/perl
@list = (5,4,3,2,1)[1..3];
print "Value of list = @list\n";
Questo produrrà il seguente risultato:
Value of list = 4 3 2
Un hash è un insieme di file key/valuecoppie. Le variabili hash sono precedute da un segno di percentuale (%). Per fare riferimento a un singolo elemento di un hash, userai il nome della variabile hash preceduto da un segno "$" e seguito dalla "chiave" associata al valore tra parentesi graffe.
Ecco un semplice esempio di utilizzo delle variabili hash:
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
Questo produrrà il seguente risultato:
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
Creazione di hash
Gli hash vengono creati in uno dei due modi seguenti. Nel primo metodo, assegni un valore a una chiave con nome uno per uno:
$data{'John Paul'} = 45; $data{'Lisa'} = 30;
$data{'Kumar'} = 40;
Nel secondo caso si utilizza una lista, che viene convertita prelevando singole coppie dalla lista: il primo elemento della coppia viene utilizzato come chiave e il secondo come valore. Ad esempio:
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
Per chiarezza, puoi usare => come alias per, per indicare le coppie chiave / valore come segue:
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
Ecco un'altra variante del modulo sopra, dai un'occhiata, qui tutte le chiavi sono state precedute da un trattino (-) e non è richiesta alcuna citazione intorno ad esse -
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
Ma è importante notare che c'è una sola parola, cioè senza spazi le chiavi sono state usate in questa forma di formazione hash e se si crea l'hash in questo modo, si accederà alle chiavi usando il trattino solo come mostrato di seguito.
$val = %data{-JohnPaul}
$val = %data{-Lisa}
Accesso agli elementi hash
Quando si accede a singoli elementi da un hash, è necessario anteporre alla variabile un segno di dollaro ($) e quindi aggiungere la chiave dell'elemento tra parentesi graffe dopo il nome della variabile. Ad esempio:
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
print "$data{'John Paul'}\n"; print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";
Questo produrrà il seguente risultato:
45
30
40
Estrazione di fette
Puoi estrarre fette di un hash proprio come puoi estrarre fette da un array. Sarà necessario utilizzare il prefisso @ per la variabile per memorizzare il valore restituito perché sarà un elenco di valori -
#!/uer/bin/perl
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
@array = @data{-JohnPaul, -Lisa};
print "Array : @array\n";
Questo produrrà il seguente risultato:
Array : 45 30
Estrazione di chiavi e valori
È possibile ottenere un elenco di tutte le chiavi da un hash utilizzando keys funzione, che ha la seguente sintassi:
keys %HASH
Questa funzione restituisce un array di tutte le chiavi dell'hash denominato. Di seguito è riportato l'esempio:
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@names = keys %data;
print "$names[0]\n";
print "$names[1]\n"; print "$names[2]\n";
Questo produrrà il seguente risultato:
Lisa
John Paul
Kumar
Allo stesso modo, puoi usare valuesfunzione per ottenere un elenco di tutti i valori. Questa funzione ha la seguente sintassi:
values %HASH
Questa funzione restituisce un normale array costituito da tutti i valori dell'hash denominato. Di seguito è riportato l'esempio:
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@ages = values %data;
print "$ages[0]\n"; print "$ages[1]\n";
print "$ages[2]\n";
Questo produrrà il seguente risultato:
30
45
40
Controllo dell'esistenza
Se provi ad accedere a una coppia chiave / valore da un hash che non esiste, normalmente otterrai l'estensione undefinedvalore e se hai attivato gli avvisi, riceverai un avviso generato in fase di esecuzione. Puoi aggirare questo problema usando ilexists funzione, che restituisce true se la chiave denominata esiste, indipendentemente da quale potrebbe essere il suo valore -
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
if( exists($data{'Lisa'} ) ) {
print "Lisa is $data{'Lisa'} years old\n";
} else {
print "I don't know age of Lisa\n";
}
Qui abbiamo introdotto l'affermazione IF ... ELSE, che studieremo in un capitolo separato. Per ora lo presumiif( condition ) parte verrà eseguita solo quando la condizione data è vera altrimenti elseparte verrà eseguita. Quindi, quando eseguiamo il programma sopra, produce il seguente risultato perché qui esiste la condizione data ($ data {'Lisa'} restituisce true -
Lisa is 30 years old
Ottenere dimensioni hash
È possibile ottenere la dimensione, ovvero il numero di elementi da un hash, utilizzando il contesto scalare su chiavi o valori. Semplicemente dicendo prima devi ottenere un array di chiavi o valori e quindi puoi ottenere la dimensione dell'array come segue:
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
@values = values %data;
$size = @values; print "2 - Hash size: is $size\n";
Questo produrrà il seguente risultato:
1 - Hash size: is 3
2 - Hash size: is 3
Aggiungi e rimuovi elementi negli hash
L'aggiunta di una nuova coppia chiave / valore può essere eseguita con una riga di codice utilizzando l'operatore di assegnazione semplice. Ma per rimuovere un elemento dall'hash è necessario utilizzaredelete funziona come mostrato di seguito nell'esempio:
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
# adding an element to the hash;
$data{'Ali'} = 55; @keys = keys %data; $size = @keys;
print "2 - Hash size: is $size\n"; # delete the same element from the hash; delete $data{'Ali'};
@keys = keys %data;
$size = @keys; print "3 - Hash size: is $size\n";
Questo produrrà il seguente risultato:
1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3
Le istruzioni condizionali Perl aiutano nel processo decisionale, che richiede che il programmatore specifichi una o più condizioni che devono essere valutate o testate dal programma, insieme a una o più istruzioni da eseguire se la condizione è determinata essere vera e, facoltativamente, altre istruzioni da eseguire se si determina che la condizione è falsa.
Di seguito è riportato il generale di una tipica struttura decisionale presente nella maggior parte dei linguaggi di programmazione:
Il numero 0, le stringhe "0" e "", l'elenco vuoto () e undef sono tutti false in un contesto booleano e tutti gli altri valori lo sono true. Negazione di un valore reale da parte di! o not restituisce un valore falso speciale.
Il linguaggio di programmazione Perl fornisce i seguenti tipi di istruzioni condizionali.
Sr.No. | Dichiarazione e descrizione |
---|---|
1 | istruzione if Un if statement consiste in un'espressione booleana seguita da una o più istruzioni. |
2 | if ... else dichiarazione Un if statement può essere seguito da un optional else statement. |
3 | if ... elsif ... else istruzione Un if statement può essere seguito da un optional elsif statement e poi da un optional else statement. |
4 | salvo dichiarazione Un unless statement consiste in un'espressione booleana seguita da una o più istruzioni. |
5 | a meno che ... altra dichiarazione Un unless statement può essere seguito da un optional else statement. |
6 | a meno che ... elsif..else dichiarazione Un unless statement può essere seguito da un optional elsif statement e poi da un optional else statement. |
7 | istruzione switch Con le ultime versioni di Perl, puoi usare il switchdichiarazione. che consente un modo semplice di confrontare un valore variabile con varie condizioni. |
Il ? : Operatore
Controlliamo il file conditional operator ? :che può essere utilizzato per sostituire if...elsedichiarazioni. Ha la seguente forma generale:
Exp1 ? Exp2 : Exp3;
Dove Exp1, Exp2 e Exp3 sono espressioni. Notare l'uso e il posizionamento dei due punti.
Il valore di un? l'espressione è determinata in questo modo: viene valutata Exp1. Se è vero, allora Exp2 viene valutato e diventa il valore dell'intero? espressione. Se Exp1 è falso, viene valutato Exp3 e il suo valore diventa il valore dell'espressione. Di seguito è riportato un semplice esempio che utilizza questo operatore:
#!/usr/local/bin/perl
$name = "Ali"; $age = 10;
$status = ($age > 60 )? "A senior citizen" : "Not a senior citizen";
print "$name is - $status\n";
Questo produrrà il seguente risultato:
Ali is - Not a senior citizen
Potrebbe esserci una situazione in cui è necessario eseguire un blocco di codice più volte. In generale, le istruzioni vengono eseguite in sequenza: la prima istruzione in una funzione viene eseguita per prima, seguita dalla seconda e così via.
I linguaggi di programmazione forniscono varie strutture di controllo che consentono percorsi di esecuzione più complicati.
Un'istruzione loop ci consente di eseguire un'istruzione o un gruppo di istruzioni più volte e la seguente è la forma generale di un'istruzione loop nella maggior parte dei linguaggi di programmazione:
Il linguaggio di programmazione Perl fornisce i seguenti tipi di loop per gestire i requisiti di loop.
Sr.No. | Tipo e descrizione del loop |
---|---|
1 | while loop Ripete un'istruzione o un gruppo di istruzioni finché una determinata condizione è vera. Verifica la condizione prima di eseguire il corpo del ciclo. |
2 | fino al ciclo Ripete un'affermazione o un gruppo di affermazioni finché una determinata condizione non diventa vera. Verifica la condizione prima di eseguire il corpo del ciclo. |
3 | per loop Esegue una sequenza di istruzioni più volte e abbrevia il codice che gestisce la variabile del ciclo. |
4 | ciclo foreach Il ciclo foreach itera su un normale valore di elenco e imposta la variabile VAR in modo che sia a turno ogni elemento dell'elenco. |
5 | fare ... mentre loop Come un'istruzione while, tranne per il fatto che verifica la condizione alla fine del corpo del ciclo |
6 | loop annidati È possibile utilizzare uno o più cicli all'interno di un altro ciclo while, for o do.. while. |
Dichiarazioni di controllo del loop
Le istruzioni di controllo del ciclo cambiano l'esecuzione dalla sua sequenza normale. Quando l'esecuzione esce da un ambito, tutti gli oggetti automatici creati in tale ambito vengono eliminati.
Perl supporta le seguenti istruzioni di controllo. Fare clic sui seguenti collegamenti per verificarne i dettagli.
Sr.No. | Dichiarazione di controllo e descrizione |
---|---|
1 | dichiarazione successiva Fa sì che il ciclo salti il resto del suo corpo e ritorni immediatamente le sue condizioni prima di ripetere. |
2 | ultima dichiarazione Termina l'istruzione loop e trasferisce l'esecuzione all'istruzione immediatamente successiva al loop. |
3 | continua dichiarazione Un BLOCCO continuo, viene sempre eseguito appena prima che il condizionale stia per essere valutato di nuovo. |
4 | redo statement Il comando redo riavvia il blocco del loop senza valutare nuovamente il condizionale. L'eventuale blocco continue non viene eseguito. |
5 | istruzione goto Perl supporta un comando goto con tre forme: goto label, goto expr e goto & name. |
Il ciclo infinito
Un ciclo diventa ciclo infinito se una condizione non diventa mai falsa. Ilforloop è tradizionalmente utilizzato per questo scopo. Poiché nessuna delle tre espressioni che formano il filefor loop sono obbligatori, puoi creare un loop infinito lasciando vuota l'espressione condizionale.
#!/usr/local/bin/perl
for( ; ; ) {
printf "This loop will run forever.\n";
}
È possibile terminare il ciclo infinito precedente premendo i tasti Ctrl + C.
Quando l'espressione condizionale è assente, si presume che sia vera. Potresti avere un'inizializzazione e un'espressione di incremento, ma come programmatore usa più comunemente il costrutto for (;;) per indicare un ciclo infinito.
Cos'è un operatore?
La risposta semplice può essere data usando l'espressione 4 + 5 è uguale a 9 . Qui 4 e 5 sono chiamati operandi e + è chiamato operatore. Il linguaggio Perl supporta molti tipi di operatori, ma di seguito è riportato un elenco di operatori importanti e utilizzati più di frequente:
- Operatori aritmetici
- Operatori di uguaglianza
- Operatori logici
- Operatori di assegnazione
- Operatori bit per bit
- Operatori logici
- Operatori simili a virgolette
- Operatori vari
Diamo uno sguardo a tutti gli operatori uno per uno.
Operatori aritmetici Perl
Assumi variabile $a holds 10 and variable $b contiene 20, quindi i seguenti sono gli operatori aritmatici Perl:
Mostra esempio
Sr.No. | Operatore e descrizione |
---|---|
1 | + ( Addition ) Aggiunge valori su entrambi i lati dell'operatore Example - $a + $b darà 30 |
2 | - (Subtraction) Sottrae l'operando della mano destra dall'operando della mano sinistra Example - $a - $b darà -10 |
3 | * (Multiplication) Moltiplica i valori su entrambi i lati dell'operatore Example - $a * $b darà 200 |
4 | / (Division) Divide l'operando sinistro per l'operando destro Example - $b / $un darà 2 |
5 | % (Modulus) Divide l'operando di sinistra per l'operando di destra e restituisce il resto Example - $b % $un darà 0 |
6 | ** (Exponent) Esegue il calcolo esponenziale (potenza) sugli operatori Example - $a**$b darà 10 alla potenza 20 |
Operatori di uguaglianza Perl
Questi sono anche chiamati operatori relazionali. Assumi variabile$a holds 10 and variable $b contiene 20 quindi, controlliamo i seguenti operatori di uguaglianza numerica -
Mostra esempio
Sr.No. | Operatore e descrizione |
---|---|
1 | == (equal to) Controlla se il valore di due operandi è uguale o meno, in caso affermativo la condizione diventa vera. Example - ($a == $b) non è vero. |
2 | != (not equal to) Controlla se il valore di due operandi è uguale o meno, se i valori non sono uguali la condizione diventa vera. Example - ($a != $b) è vero. |
3 | <=> Controlla se il valore di due operandi è uguale o meno e restituisce -1, 0 o 1 a seconda che l'argomento di sinistra sia numericamente minore, uguale o maggiore dell'argomento destro. Example - ($a <=> $b) restituisce -1. |
4 | > (greater than) Controlla se il valore dell'operando sinistro è maggiore del valore dell'operando destro, in caso affermativo la condizione diventa vera. Example - ($a > $b) non è vero. |
5 | < (less than) Controlla se il valore dell'operando sinistro è inferiore al valore dell'operando destro, in caso affermativo la condizione diventa vera. Example - ($a < $b) è vero. |
6 | >= (greater than or equal to) Controlla se il valore dell'operando sinistro è maggiore o uguale al valore dell'operando destro, in caso affermativo la condizione diventa vera. Example - ($a >= $b) non è vero. |
7 | <= (less than or equal to) Controlla se il valore dell'operando sinistro è minore o uguale al valore dell'operando destro, in caso affermativo la condizione diventa vera. Example - ($a <= $b) è vero. |
Di seguito è riportato un elenco di operatori azionari. Assumi variabile$a holds "abc" and variable $b contiene "xyz" quindi, controlliamo i seguenti operatori di uguaglianza delle stringhe -
Mostra esempio
Sr.No. | Operatore e descrizione |
---|---|
1 | lt Restituisce vero se l'argomento di sinistra è inferiore in senso stringa rispetto all'argomento di destra. Example - ($a lt $b) è vero. |
2 | gt Restituisce vero se l'argomento di sinistra è maggiore nel senso della stringa dell'argomento di destra. Example - ($a gt $b) è falso. |
3 | le Restituisce vero se l'argomento di sinistra è inferiore o uguale all'argomento di destra in senso stringa. Example - ($a le $b) è vero. |
4 | ge Restituisce vero se l'argomento di sinistra è maggiore o uguale all'argomento di destra in senso stringa. Example - ($a ge $b) è falso. |
5 | eq Restituisce vero se l'argomento di sinistra è uguale all'argomento di destra in senso stringa. Example - ($a eq $b) è falso. |
6 | ne Restituisce vero se l'argomento di sinistra non è uguale all'argomento di destra in senso stringa. Example - ($a ne $b) è vero. |
7 | cmp Restituisce -1, 0 o 1 a seconda che l'argomento di sinistra sia minore, uguale o maggiore dell'argomento di destra in senso stringa. Example - ($a cmp $b) è -1. |
Operatori di assegnazione Perl
Assumi variabile $a holds 10 and variable $b ne contiene 20, quindi di seguito sono riportati gli operatori di assegnazione disponibili in Perl e il loro utilizzo:
Mostra esempio
Sr.No. | Operatore e descrizione |
---|---|
1 | = Operatore di assegnazione semplice, Assegna i valori dagli operandi del lato destro all'operando del lato sinistro Example - $c = $a + $b will assigned value of $a + $b into $c |
2 | += Aggiungi operatore di assegnazione AND, aggiunge l'operando destro all'operando sinistro e assegna il risultato all'operando sinistro Example - $c += $a è equivalente a $c = $c + $ a |
3 | -= Sottrai AND operatore di assegnazione, sottrae l'operando destro dall'operando sinistro e assegna il risultato all'operando sinistro Example - $ c - = $a is equivalent to $c = $c - $un |
4 | *= Moltiplica AND operatore di assegnazione, moltiplica l'operando destro con l'operando sinistro e assegna il risultato all'operando sinistro Example - $c *= $a è equivalente a $c = $c * $ a |
5 | /= Divide AND operatore di assegnazione, divide l'operando sinistro con l'operando destro e assegna il risultato all'operando sinistro Example - $ c / = $a is equivalent to $c = $c / $un |
6 | %= Modulo AND operatore di assegnazione, richiede il modulo utilizzando due operandi e assegna il risultato all'operando sinistro Example - $c %= $a è equivalente a $c = $circa |
7 | **= Operatore di assegnazione AND esponenziale, esegue il calcolo esponenziale (potenza) sugli operatori e assegna un valore all'operando sinistro Example - $c **= $a è equivalente a $c = $c ** $ a |
Operatori bit per bit Perl
Bitwise operator works on bits and perform bit by bit operation. Assume if $a = 60; and $b = 13; Now in binary format they will be as follows −
$a = 0011 1100
$b = 0000 1101
-----------------
$a&$b = 0000 1100
$a|$b = 0011 1101
$a^$b = 0011 0001
~$a = 1100 0011
There are following Bitwise operators supported by Perl language, assume if $a = 60; and $b = 13
Show Example
Sr.No. | Operator & Description |
---|---|
1 | & Binary AND Operator copies a bit to the result if it exists in both operands. Example − ($a & $b) will give 12 which is 0000 1100 |
2 | | Binary OR Operator copies a bit if it exists in eather operand. Example − ($a | $b) will give 61 which is 0011 1101 |
3 | ^ Binary XOR Operator copies the bit if it is set in one operand but not both. Example − ($a ^ $b) will give 49 which is 0011 0001 |
4 | ~ Binary Ones Complement Operator is unary and has the efect of 'flipping' bits. Example − (~$a ) will give -61 which is 1100 0011 in 2's complement form due to a signed binary number. |
5 | << Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand. Example − $a << 2 will give 240 which is 1111 0000 |
6 | >> Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand. Example − $a >> 2 will give 15 which is 0000 1111 |
Perl Logical Operators
There are following logical operators supported by Perl language. Assume variable $a holds true and variable $b holds false then −
Show Example
Sr.No. | Operator & Description |
---|---|
1 | and Called Logical AND operator. If both the operands are true then then condition becomes true. Example − ($a and $b) is false. |
2 | && C-style Logical AND operator copies a bit to the result if it exists in both operands. Example − ($a && $b) is false. |
3 | or Called Logical OR Operator. If any of the two operands are non zero then then condition becomes true. Example − ($a or $b) is true. |
4 | || C-style Logical OR operator copies a bit if it exists in eather operand. Example − ($a || $b) is true. |
5 | not Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false. Example − not($a and $b) is true. |
Quote-like Operators
There are following Quote-like operators supported by Perl language. In the following table, a {} represents any pair of delimiters you choose.
Show Example
Sr.No. | Operator & Description |
---|---|
1 | q{ } Encloses a string with-in single quotes Example − q{abcd} gives 'abcd' |
2 | qq{ } Encloses a string with-in double quotes Example − qq{abcd} gives "abcd" |
3 | qx{ } Encloses a string with-in invert quotes Example − qx{abcd} gives `abcd` |
Miscellaneous Operators
There are following miscellaneous operators supported by Perl language. Assume variable a holds 10 and variable b holds 20 then −
Show Example
Sr.No. | Operator & Description |
---|---|
1 | . Binary operator dot (.) concatenates two strings. Example − If $a = "abc", $b = "def" then $a.$b will give "abcdef" |
2 | x The repetition operator x returns a string consisting of the left operand repeated the number of times specified by the right operand. Example − ('-' x 3) will give ---. |
3 | .. The range operator .. returns a list of values counting (up by ones) from the left value to the right value Example − (2..5) will give (2, 3, 4, 5) |
4 | ++ Auto Increment operator increases integer value by one Example − $a++ will give 11 |
5 | -- Auto Decrement operator decreases integer value by one Example − $a-- will give 9 |
6 | -> The arrow operator is mostly used in dereferencing a method or variable from an object or a class name Example − $obj->$a is an example to access variable $a from object $obj. |
Perl Operators Precedence
The following table lists all operators from highest precedence to lowest.
Show Example
left terms and list operators (leftward)
left ->
nonassoc ++ --
right **
right ! ~ \ and unary + and -
left =~ !~
left * / % x
left + - .
left << >>
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp ~~
left &
left | ^
left &&
left || //
nonassoc .. ...
right ?:
right = += -= *= etc.
left , =>
nonassoc list operators (rightward)
right not
left and
left or xor
This chapter will give you the basic understanding on how to process and manipulate dates and times in Perl.
Current Date and Time
Let's start with localtime() function, which returns values for the current date and time if given no arguments. Following is the 9-element list returned by the localtime function while using in list context −
sec, # seconds of minutes from 0 to 61
min, # minutes of hour from 0 to 59
hour, # hours of day from 0 to 24
mday, # day of month from 1 to 31
mon, # month of year from 0 to 11
year, # year since 1900
wday, # days since sunday
yday, # days since January 1st
isdst # hours of daylight savings time
Try the following example to print different elements returned by localtime() function −
#!/usr/local/bin/perl
@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";
When the above code is executed, it produces the following result −
16 Feb Sat
If you will use localtime() function in scalar context, then it will return date and time from the current time zone set in the system. Try the following example to print current date and time in full format −
#!/usr/local/bin/perl
$datestring = localtime();
print "Local date and time $datestring\n";
When the above code is executed, it produces the following result −
Local date and time Sat Feb 16 06:50:45 2013
GMT Time
The function gmtime() works just like localtime() function but the returned values are localized for the standard Greenwich time zone. When called in list context, $isdst, the last value returned by gmtime, is always 0. There is no Daylight Saving Time in GMT.
You should make a note on the fact that localtime() will return the current local time on the machine that runs the script and gmtime() will return the universal Greenwich Mean Time, or GMT (or UTC).
Try the following example to print the current date and time but on GMT scale −
#!/usr/local/bin/perl
$datestring = gmtime(); print "GMT date and time $datestring\n";
When the above code is executed, it produces the following result −
GMT date and time Sat Feb 16 13:50:45 2013
Format Date and Time
You can use localtime() function to get a list of 9-elements and later you can use the printf() function to format date and time based on your requirements as follows −
#!/usr/local/bin/perl
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); printf("Time Format - HH:MM:SS\n"); printf("%02d:%02d:%02d", $hour, $min, $sec);
When the above code is executed, it produces the following result −
Time Format - HH:MM:SS
06:58:52
Epoch time
You can use the time() function to get epoch time, i.e., the numbers of seconds that have elapsed since a given date, in Unix is January 1, 1970.
#!/usr/local/bin/perl
$epoc = time(); print "Number of seconds since Jan 1, 1970 - $epoc\n";
When the above code is executed, it produces the following result −
Number of seconds since Jan 1, 1970 - 1361022130
You can convert a given number of seconds into date and time string as follows −
#!/usr/local/bin/perl
$datestring = localtime(); print "Current date and time $datestring\n";
$epoc = time(); $epoc = $epoc - 24 * 60 * 60; # one day before of current date. $datestring = localtime($epoc); print "Yesterday's date and time $datestring\n";
When the above code is executed, it produces the following result −
Current date and time Tue Jun 5 05:54:43 2018
Yesterday's date and time Mon Jun 4 05:54:43 2018
POSIX Function strftime()
You can use the POSIX function strftime() to format date and time with the help of the following table. Please note that the specifiers marked with an asterisk (*) are locale-dependent.
Specifier | Replaced by | Example |
---|---|---|
%a |
Abbreviated weekday name * | Thu |
%A |
Full weekday name * | Thursday |
%b |
Abbreviated month name * | Aug |
%B |
Full month name * | August |
%c |
Date and time representation * | Thu Aug 23 14:55:02 2001 |
%C |
Year divided by 100 and truncated to integer (00-99 ) |
20 |
%d |
Day of the month, zero-padded (01-31 ) |
23 |
%D |
Short MM/DD/YY date, equivalent to %m/%d/%y |
08/23/01 |
%e |
Day of the month, space-padded (1-31 ) |
23 |
%F |
Short YYYY-MM-DD date, equivalent to %Y-%m-%d |
2001-08-23 |
%g |
Week-based year, last two digits (00-99 ) |
01 |
%G |
Week-based year | 2001 |
%h |
Abbreviated month name * (same as %b ) |
Aug |
%H |
Hour in 24h format (00-23 ) |
14 |
%I |
Hour in 12h format (01-12 ) |
02 |
%j |
Day of the year (001-366 ) |
235 |
%m |
Month as a decimal number (01-12 ) |
08 |
%M |
Minute (00-59 ) |
55 |
%n |
New-line character ('\n' ) |
|
%p |
AM or PM designation | PM |
%r |
12-hour clock time * | 02:55:02 pm |
%R |
24-hour HH:MM time, equivalent to %H:%M |
14:55 |
%S |
Second (00-61 ) |
02 |
%t |
Horizontal-tab character ('\t' ) |
|
%T |
ISO 8601 time format (HH:MM:SS ), equivalent to %H:%M:%S |
14:55 |
%u |
ISO 8601 weekday as number with Monday as 1 (1-7 ) |
4 |
%U |
Week number with the first Sunday as the first day of week one (00-53 ) |
33 |
%V |
ISO 8601 week number (00-53 ) |
34 |
%w |
Weekday as a decimal number with Sunday as 0 (0-6 ) |
4 |
%W |
Week number with the first Monday as the first day of week one (00-53 ) |
34 |
%x |
Date representation * | 08/23/01 |
%X |
Time representation * | 14:55:02 |
%y |
Year, last two digits (00-99 ) |
01 |
%Y |
Year | 2001 |
%z |
ISO 8601 offset from UTC in timezone (1 minute = 1, 1 hour = 100) If timezone cannot be termined, no characters |
+100 |
%Z |
Timezone name or abbreviation * If timezone cannot be termined, no characters |
CDT |
%% |
A % sign |
% |
Let's check the following example to understand the usage −
#!/usr/local/bin/perl
use POSIX qw(strftime);
$datestring = strftime "%a %b %e %H:%M:%S %Y", localtime; printf("date and time - $datestring\n");
# or for GMT formatted appropriately for your locale:
$datestring = strftime "%a %b %e %H:%M:%S %Y", gmtime; printf("date and time - $datestring\n");
When the above code is executed, it produces the following result −
date and time - Sat Feb 16 07:10:23 2013
date and time - Sat Feb 16 14:10:23 2013
A Perl subroutine or function is a group of statements that together performs a task. You can divide up your code into separate subroutines. How you divide up your code among different subroutines is up to you, but logically the division usually is so each function performs a specific task.
Perl uses the terms subroutine, method and function interchangeably.
Define and Call a Subroutine
The general form of a subroutine definition in Perl programming language is as follows −
sub subroutine_name {
body of the subroutine
}
The typical way of calling that Perl subroutine is as follows −
subroutine_name( list of arguments );
In versions of Perl before 5.0, the syntax for calling subroutines was slightly different as shown below. This still works in the newest versions of Perl, but it is not recommended since it bypasses the subroutine prototypes.
&subroutine_name( list of arguments );
Let's have a look into the following example, which defines a simple function and then call it. Because Perl compiles your program before executing it, it doesn't matter where you declare your subroutine.
#!/usr/bin/perl
# Function definition
sub Hello {
print "Hello, World!\n";
}
# Function call
Hello();
When above program is executed, it produces the following result −
Hello, World!
Passing Arguments to a Subroutine
You can pass various arguments to a subroutine like you do in any other programming language and they can be acessed inside the function using the special array @_. Thus the first argument to the function is in $_[0], the second is in $_[1], and so on.
You can pass arrays and hashes as arguments like any scalar but passing more than one array or hash normally causes them to lose their separate identities. So we will use references ( explained in the next chapter ) to pass any array or hash.
Let's try the following example, which takes a list of numbers and then prints their average −
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_); $sum = 0;
foreach $item (@_) { $sum += $item; } $average = $sum / $n;
print "Average for the given numbers : $average\n";
}
# Function call
Average(10, 20, 30);
When above program is executed, it produces the following result −
Average for the given numbers : 20
Passing Lists to Subroutines
Because the @_ variable is an array, it can be used to supply lists to a subroutine. However, because of the way in which Perl accepts and parses lists and arrays, it can be difficult to extract the individual elements from @_. If you have to pass a list along with other scalar arguments, then make list as the last argument as shown below −
#!/usr/bin/perl
# Function definition
sub PrintList {
my @list = @_;
print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
# Function call with list parameter
PrintList($a, @b);
When above program is executed, it produces the following result −
Given list is 10 1 2 3 4
Passing Hashes to Subroutines
When you supply a hash to a subroutine or operator that accepts a list, then hash is automatically translated into a list of key/value pairs. For example −
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key}; print "$key : $value\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Function call with hash parameter
PrintHash(%hash);
When above program is executed, it produces the following result −
name : Tom
age : 19
Returning Value from a Subroutine
You can return a value from subroutine like you do in any other programming language. If you are not returning a value from a subroutine then whatever calculation is last performed in a subroutine is automatically also the return value.
You can return arrays and hashes from the subroutine like any scalar but returning more than one array or hash normally causes them to lose their separate identities. So we will use references ( explained in the next chapter ) to return any array or hash from a function.
Let's try the following example, which takes a list of numbers and then returns their average −
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0; foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n; return $average;
}
# Function call
$num = Average(10, 20, 30); print "Average for the given numbers : $num\n";
When above program is executed, it produces the following result −
Average for the given numbers : 20
Private Variables in a Subroutine
By default, all variables in Perl are global variables, which means they can be accessed from anywhere in the program. But you can create private variables called lexical variables at any time with the my operator.
The my operator confines a variable to a particular region of code in which it can be used and accessed. Outside that region, this variable cannot be used or accessed. This region is called its scope. A lexical scope is usually a block of code with a set of braces around it, such as those defining the body of the subroutine or those marking the code blocks of if, while, for, foreach, and eval statements.
Following is an example showing you how to define a single or multiple private variables using my operator −
sub somefunc {
my $variable; # $variable is invisible outside somefunc()
my ($another, @an_array, %a_hash); # declaring many variables at once
}
Let's check the following example to distinguish between global and private variables −
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
# Function definition
sub PrintHello {
# Private variable for PrintHello function
my $string; $string = "Hello, Perl!";
print "Inside the function $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
When above program is executed, it produces the following result −
Inside the function Hello, Perl!
Outside the function Hello, World!
Temporary Values via local()
The local is mostly used when the current value of a variable must be visible to called subroutines. A local just gives temporary values to global (meaning package) variables. This is known as dynamic scoping. Lexical scoping is done with my, which works more like C's auto declarations.
If more than one variable or expression is given to local, they must be placed in parentheses. This operator works by saving the current values of those variables in its argument list on a hidden stack and restoring them upon exiting the block, subroutine, or eval.
Let's check the following example to distinguish between global and local variables −
#!/usr/bin/perl
# Global variable
$string = "Hello, World!"; sub PrintHello { # Private variable for PrintHello function local $string;
$string = "Hello, Perl!"; PrintMe(); print "Inside the function PrintHello $string\n";
}
sub PrintMe {
print "Inside the function PrintMe $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
When above program is executed, it produces the following result −
Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!
State Variables via state()
There are another type of lexical variables, which are similar to private variables but they maintain their state and they do not get reinitialized upon multiple calls of the subroutines. These variables are defined using the state operator and available starting from Perl 5.9.4.
Let's check the following example to demonstrate the use of state variables −
#!/usr/bin/perl
use feature 'state';
sub PrintCount {
state $count = 0; # initial value print "Value of counter is $count\n";
$count++;
}
for (1..5) {
PrintCount();
}
When above program is executed, it produces the following result −
Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4
Prior to Perl 5.10, you would have to write it like this −
#!/usr/bin/perl
{
my $count = 0; # initial value
sub PrintCount {
print "Value of counter is $count\n"; $count++;
}
}
for (1..5) {
PrintCount();
}
Subroutine Call Context
The context of a subroutine or statement is defined as the type of return value that is expected. This allows you to use a single function that returns different values based on what the user is expecting to receive. For example, the following localtime() returns a string when it is called in scalar context, but it returns a list when it is called in list context.
my $datestring = localtime( time );
In this example, the value of $timestr is now a string made up of the current date and time, for example, Thu Nov 30 15:21:33 2000. Conversely −
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
Now the individual variables contain the corresponding values returned by localtime() subroutine.
A Perl reference is a scalar data type that holds the location of another value which could be scalar, arrays, or hashes. Because of its scalar nature, a reference can be used anywhere, a scalar can be used.
You can construct lists containing references to other lists, which can contain references to hashes, and so on. This is how the nested data structures are built in Perl.
Create References
It is easy to create a reference for any variable, subroutine or value by prefixing it with a backslash as follows −
$scalarref = \$foo; $arrayref = \@ARGV;
$hashref = \%ENV; $coderef = \&handler;
$globref = \*foo;
You cannot create a reference on an I/O handle (filehandle or dirhandle) using the backslash operator but a reference to an anonymous array can be created using the square brackets as follows −
$arrayref = [1, 2, ['a', 'b', 'c']];
Similar way you can create a reference to an anonymous hash using the curly brackets as follows −
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
A reference to an anonymous subroutine can be created by using sub without a subname as follows −
$coderef = sub { print "Boink!\n" };
Dereferencing
Dereferencing returns the value from a reference point to the location. To dereference a reference simply use $, @ or % as prefix of the reference variable depending on whether the reference is pointing to a scalar, array, or hash. Following is the example to explain the concept −
#!/usr/bin/perl
$var = 10;
# Now $r has reference to $var scalar.
$r = \$var;
# Print value available at the location stored in $r. print "Value of $var is : ", $$r, "\n"; @var = (1, 2, 3); # Now $r has reference to @var array.
$r = \@var; # Print values available at the location stored in $r.
print "Value of @var is : ", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # Now $r has reference to %var hash.
$r = \%var; # Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";
When above program is executed, it produces the following result −
Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110
If you are not sure about a variable type, then its easy to know its type using ref, which returns one of the following strings if its argument is a reference. Otherwise, it returns false −
SCALAR
ARRAY
HASH
CODE
GLOB
REF
Let's try the following example −
#!/usr/bin/perl
$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n"; @var = (1, 2, 3); $r = \@var;
print "Reference type in r : ", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var;
print "Reference type in r : ", ref($r), "\n";
When above program is executed, it produces the following result −
Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH
Circular References
A circular reference occurs when two references contain a reference to each other. You have to be careful while creating references otherwise a circular reference can lead to memory leaks. Following is an example −
#!/usr/bin/perl
my $foo = 100;
$foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
Value of foo is : REF(0x9aae38)
Riferimenti a funzioni
Ciò potrebbe accadere se è necessario creare un gestore di segnali in modo da poter produrre un riferimento a una funzione facendo precedere il nome della funzione con \ & e per dereferenziare quel riferimento è sufficiente aggiungere un prefisso alla variabile di riferimento utilizzando la e commerciale &. Di seguito è riportato un esempio:
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n"; } } %hash = ('name' => 'Tom', 'age' => 19); # Create a reference to above function. $cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
Quando viene eseguito il programma sopra, produce il seguente risultato:
Item : name
Item : Tom
Item : age
Item : 19
Perl utilizza un modello di scrittura chiamato "formato" per generare report. Per usare la funzionalità di formattazione di Perl, devi prima definire un formato e poi puoi usare quel formato per scrivere dati formattati.
Definisci un formato
Di seguito è riportata la sintassi per definire un formato Perl:
format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.
Qui FormatNamerappresenta il nome del formato. Ilfieldlineè il modo specifico, i dati dovrebbero essere formattati. Le righe dei valori rappresentano i valori che verranno inseriti nella riga del campo. Finisci il formato con un solo punto.
Il prossimo fieldlinepuò contenere qualsiasi testo o fieldholder. I titolari di campo mantengono lo spazio per i dati che verranno inseriti lì in un secondo momento. Un titolare di campo ha il formato:
@<<<<
Questo segnaposto è giustificato a sinistra, con uno spazio del campo pari a 5. È necessario contare i segni @ e <per conoscere il numero di spazi nel campo. Altri detentori di campo includono:
@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder
Un formato di esempio potrebbe essere:
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
In questo esempio, $ nome verrebbe scritto come giustificato a sinistra entro 22 spazi di caratteri e dopo tale età verrà scritto in due spazi.
Utilizzando il formato
Per richiamare questa dichiarazione di formato, utilizzeremo il write parola chiave -
write EMPLOYEE;
Il problema è che il nome del formato è in genere il nome di un handle di file aperto e l'istruzione write invierà l'output a questo handle di file. Poiché vogliamo che i dati vengano inviati allo STDOUT, dobbiamo associare EMPLOYEE al filehandle STDOUT. Per prima cosa, tuttavia, dobbiamo assicurarci che STDOUT sia il nostro handle di file selezionato, utilizzando la funzione select ().
select(STDOUT);
Assoceremo quindi EMPLOYEE a STDOUT impostando il nome del nuovo formato con STDOUT, utilizzando la variabile speciale $ ~ o $ FORMAT_NAME come segue:
$~ = "EMPLOYEE";
Quando ora eseguiamo un write (), i dati verranno inviati a STDOUT. Ricorda: se hai intenzione di scrivere il tuo report in qualsiasi altro handle di file invece di STDOUT, puoi usare la funzione select () per selezionare quell'handle di file e il resto della logica rimarrà la stessa.
Prendiamo il seguente esempio. Qui abbiamo valori hard coded solo per mostrare l'utilizzo. Nell'utilizzo effettivo leggerai i valori da un file o database per generare rapporti effettivi e potrebbe essere necessario scrivere nuovamente il rapporto finale in un file.
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary =================================== . select(STDOUT); $~ = EMPLOYEE;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
Quando viene eseguito, questo produrrà il seguente risultato:
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Definisci un'intestazione del rapporto
Sembra tutto a posto. Ma ti interesserebbe aggiungere un'intestazione al tuo rapporto. Questa intestazione verrà stampata nella parte superiore di ogni pagina. È molto semplice farlo. Oltre a definire un modello, dovresti definire un'intestazione e assegnarla alla variabile $ ^ o $ FORMAT_TOP_NAME -
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
format EMPLOYEE_TOP =
===================================
Name Age
===================================
.
select(STDOUT);
$~ = EMPLOYEE; $^ = EMPLOYEE_TOP;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
Ora il tuo rapporto avrà il seguente aspetto:
===================================
Name Age
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Definisci un'impaginazione
E se il tuo rapporto occupa più di una pagina? Hai una soluzione per questo, usa semplicemente$% o $ FORMAT_PAGE_NUMBER vairable insieme all'intestazione come segue -
format EMPLOYEE_TOP =
===================================
Name Age Page @<
$%
===================================
.
Ora il tuo output sarà come segue:
===================================
Name Age Page 1
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Numero di righe su una pagina
È possibile impostare il numero di righe per pagina utilizzando una variabile speciale $= (o $ FORMAT_LINES_PER_PAGE), per impostazione predefinita $ = sarà 60.
Definisci un piè di pagina del rapporto
Mentre $ ^ o $FORMAT_TOP_NAME contains the name of the current header format, there is no corresponding mechanism to automatically do the same thing for a footer. If you have a fixed-size footer, you can get footers by checking variable $- oppure $ FORMAT_LINES_LEFT prima di ogni write () e stampa tu stesso il piè di pagina se necessario utilizzando un altro formato definito come segue -
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
Per un set completo di variabili relative alla formattazione, fare riferimento alla sezione Variabili speciali di Perl .
Le basi della gestione dei file sono semplici: associ un file filehandle con un'entità esterna (solitamente un file) e quindi utilizzare una varietà di operatori e funzioni all'interno di Perl per leggere e aggiornare i dati memorizzati nel flusso di dati associato al filehandle.
Un filehandle è una struttura Perl interna denominata che associa un file fisico a un nome. Tutti i filehandle sono in grado di accedere in lettura / scrittura, quindi puoi leggere e aggiornare qualsiasi file o dispositivo associato a un filehandle. Tuttavia, quando si associa un filehandle, è possibile specificare la modalità in cui viene aperto il filehandle.
Tre handle di file di base sono: STDIN, STDOUT, e STDERR, che rappresentano rispettivamente i dispositivi di input standard, output standard e standard di errore.
Apertura e chiusura di file
Ci sono le seguenti due funzioni con più moduli, che possono essere usati per aprire qualsiasi file nuovo o esistente in Perl.
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
Qui FILEHANDLE è l'handle di file restituito da open funzione ed EXPR è l'espressione con nome file e modalità di apertura del file.
Apri funzione
Di seguito è riportata la sintassi per aprire file.txtin modalità di sola lettura. Qui il segno meno di <indica che il file deve essere aperto in modalità di sola lettura.
open(DATA, "<file.txt");
Qui DATA è l'handle del file, che verrà utilizzato per leggere il file. Ecco l'esempio, che aprirà un file e ne stamperà il contenuto sullo schermo.
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!"; while(<DATA>) { print "$_";
}
Di seguito è riportata la sintassi per aprire file.txt in modalità di scrittura. Qui il segno meno di> indica che il file deve essere aperto in modalità di scrittura.
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
Questo esempio in realtà tronca (svuota) il file prima di aprirlo per la scrittura, il che potrebbe non essere l'effetto desiderato. Se desideri aprire un file in lettura e scrittura, puoi inserire un segno più prima dei caratteri> o <.
Ad esempio, per aprire un file per l'aggiornamento senza troncarlo:
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
Per troncare prima il file:
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
È possibile aprire un file in modalità di aggiunta. In questa modalità, il punto di scrittura verrà impostato alla fine del file.
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
Un doppio >> apre il file per l'aggiunta, posizionando il puntatore del file alla fine, in modo da poter iniziare immediatamente ad aggiungere informazioni. Tuttavia, non puoi leggere da esso a meno che non ci metti anche un segno più -
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
Di seguito è riportata la tabella, che fornisce i possibili valori delle diverse modalità
Sr.No. | Entità e definizione |
---|---|
1 | < or r Accesso in sola lettura |
2 | > or w Crea, scrive e tronca |
3 | >> or a Scrive, aggiunge e crea |
4 | +< or r+ Legge e scrive |
5 | +> or w+ Legge, scrive, crea e tronca |
6 | +>> or a+ Legge, scrive, aggiunge e crea |
Funzione Sysopen
Il sysopen è simile alla funzione principale di apertura, tranne per il fatto che utilizza il sistema open() funzione, utilizzando i parametri forniti come parametri per la funzione di sistema -
Ad esempio, per aprire un file da aggiornare, emulando il file +<filename formato da aperto -
sysopen(DATA, "file.txt", O_RDWR);
O per troncare il file prima dell'aggiornamento -
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
È possibile utilizzare O_CREAT per creare un nuovo file e O_WRONLY per aprire il file in modalità di sola scrittura e O_RDONLY per aprire il file in modalità di sola lettura.
Il PERMSL'argomento specifica i permessi del file per il file specificato, se deve essere creato. Per impostazione predefinita ci vuole0x666.
Di seguito è riportata la tabella, che fornisce i possibili valori di MODE.
Sr.No. | Entità e definizione |
---|---|
1 | O_RDWR Leggere e scrivere |
2 | O_RDONLY Sola lettura |
3 | O_WRONLY Solo scrittura |
4 | O_CREAT Crea il file |
5 | O_APPEND Aggiungi il file |
6 | O_TRUNC Tronca il file |
7 | O_EXCL Si ferma se il file esiste già |
8 | O_NONBLOCK Usabilità non bloccante |
Chiudi funzione
Per chiudere un filehandle, e quindi dissociare il filehandle dal file corrispondente, si utilizza il closefunzione. Questo svuota i buffer del filehandle e chiude il descrittore di file del sistema.
close FILEHANDLE
close
Se non è specificato alcun FILEHANDLE, chiude il filehandle attualmente selezionato. Restituisce true solo se può svuotare correttamente i buffer e chiudere il file.
close(DATA) || die "Couldn't close file properly";
Lettura e scrittura di file
Una volta che hai un filehandle aperto, devi essere in grado di leggere e scrivere informazioni. Esistono diversi modi per leggere e scrivere i dati nel file.
L'operatore <FILEHANDL>
Il metodo principale per leggere le informazioni da un filehandle aperto è l'operatore <FILEHANDLE>. In un contesto scalare, restituisce una singola riga dal filehandle. Ad esempio:
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
Quando si utilizza l'operatore <FILEHANDLE> in un contesto di elenco, restituisce un elenco di righe dal filehandle specificato. Ad esempio, per importare tutte le righe da un file in un array:
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
Funzione getc
La funzione getc restituisce un singolo carattere dal FILEHANDLE specificato o STDIN se non è specificato nessuno -
getc FILEHANDLE
getc
Se si è verificato un errore o il filehandle si trova alla fine del file, viene restituito undef.
leggere la funzione
La funzione di lettura legge un blocco di informazioni dal filehandle memorizzato nel buffer: Questa funzione viene utilizzata per leggere i dati binari dal file.
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
La lunghezza dei dati letti è definita da LENGTH, e il dato viene posizionato all'inizio di SCALAR se non viene specificato alcun OFFSET. In caso contrario, i dati vengono inseriti dopo i byte OFFSET in SCALARE. La funzione restituisce il numero di byte letti in caso di successo, zero alla fine del file o undef se si è verificato un errore.
Funzione di stampa
Per tutti i diversi metodi usati per leggere le informazioni dai filehandle, la funzione principale per riscrivere le informazioni è la funzione di stampa.
print FILEHANDLE LIST
print LIST
print
La funzione print stampa il valore valutato di LIST su FILEHANDLE o sul filehandle di output corrente (STDOUT per impostazione predefinita). Ad esempio:
print "Hello World!\n";
Copia di file
Ecco l'esempio, che apre un file esistente file1.txt e lo legge riga per riga e genera un altro file di copia file2.txt.
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
Rinominare un file
Ecco un esempio, che mostra come possiamo rinominare un file file1.txt in file2.txt. Supponendo che il file sia disponibile nella directory / usr / test.
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
Questa funzione renames accetta due argomenti e rinomina semplicemente il file esistente.
Eliminazione di un file esistente
Ecco un esempio, che mostra come eliminare un file file1.txt utilizzando l'estensione unlink funzione.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
Posizionamento all'interno di un file
Puoi usare per tell funzione per conoscere la posizione corrente di un file e seek funzione per puntare una particolare posizione all'interno del file.
Tell Function
Il primo requisito è trovare la tua posizione all'interno di un file, cosa che fai usando la funzione tell -
tell FILEHANDLE
tell
Questo restituisce la posizione del puntatore del file, in byte, all'interno di FILEHANDLE se specificato, o il filehandle selezionato di default corrente se non è specificato nessuno.
cercare la funzione
La funzione di ricerca posiziona il puntatore del file sul numero di byte specificato all'interno di un file -
seek FILEHANDLE, POSITION, WHENCE
La funzione utilizza la funzione di sistema fseek e hai la stessa capacità di posizionare in relazione a tre diversi punti: l'inizio, la fine e la posizione corrente. Puoi farlo specificando un valore per WHENCE.
Zero imposta il posizionamento relativo all'inizio del file. Ad esempio, la riga imposta il puntatore del file al 256 ° byte nel file.
seek DATA, 256, 0;
Informazioni sui file
È possibile testare alcune funzionalità molto rapidamente in Perl utilizzando una serie di operatori di test noti collettivamente come test -X. Ad esempio, per eseguire un rapido test delle varie autorizzazioni su un file, potresti utilizzare uno script come questo:
#/usr/bin/perl
my $file = "/usr/test/file1.txt"; my (@description, $size);
if (-e $file) { push @description, 'binary' if (-B _); push @description, 'a socket' if (-S _); push @description, 'a text file' if (-T _); push @description, 'a block special file' if (-b _); push @description, 'a character special file' if (-c _); push @description, 'a directory' if (-d _); push @description, 'executable' if (-x _); push @description, (($size = -s _)) ? "$size bytes" : 'empty'; print "$file is ", join(', ',@description),"\n";
}
Ecco l'elenco delle funzionalità, che puoi controllare per un file o una directory:
Sr.No. | Operatore e definizione |
---|---|
1 | -A Ora di inizio dello script meno l'ora dell'ultimo accesso al file, in giorni. |
2 | -B È un file binario? |
3 | -C Ora di inizio dello script meno l'ora dell'ultima modifica dell'inode del file, in giorni. |
3 | -M Ora di inizio dello script meno l'ora di modifica del file, in giorni. |
4 | -O Il file è di proprietà dell'ID utente reale? |
5 | -R Il file è leggibile dall'ID utente reale o dal gruppo reale? |
6 | -S Il file è un socket? |
7 | -T È un file di testo? |
8 | -W Il file è scrivibile dall'ID utente reale o dal gruppo reale? |
9 | -X Il file è eseguibile dall'ID utente reale o dal gruppo reale? |
10 | -b È un file speciale a blocchi? |
11 | -c È un file speciale di caratteri? |
12 | -d Il file è una directory? |
13 | -e Il file esiste? |
14 | -f È un file semplice? |
15 | -g Il file ha il bit setgid impostato? |
16 | -k Il file ha il bit appiccicoso impostato? |
17 | -l Il file è un collegamento simbolico? |
18 | -o Il file è di proprietà dell'ID utente effettivo? |
19 | -p Il file è una pipe con nome? |
20 | -r Il file è leggibile dall'utente effettivo o dall'ID gruppo? |
21 | -s Restituisce la dimensione del file, zero size = file vuoto. |
22 | -t Il filehandle è aperto da un TTY (terminale)? |
23 | -u Il file ha il bit setuid impostato? |
24 | -w Il file è scrivibile dall'utente o dall'ID gruppo effettivo? |
25 | -x Il file è eseguibile dall'utente effettivo o dall'ID gruppo? |
26 | -z La dimensione del file è zero? |
Di seguito sono riportate le funzioni standard utilizzate per giocare con le directory.
opendir DIRHANDLE, EXPR # To open a directory
readdir DIRHANDLE # To read a directory
rewinddir DIRHANDLE # Positioning pointer to the begining
telldir DIRHANDLE # Returns current position of the dir
seekdir DIRHANDLE, POS # Pointing pointer to POS inside dir
closedir DIRHANDLE # Closing a directory.
Visualizza tutti i file
Esistono vari modi per elencare tutti i file disponibili in una determinata directory. Per prima cosa usiamo il modo semplice per ottenere ed elencare tutti i file utilizzando l'estensioneglob operatore -
#!/usr/bin/perl
# Display all the files in /tmp directory.
$dir = "/tmp/*"; my @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the C source files in /tmp directory. $dir = "/tmp/*.c";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
# Display all the hidden files.
$dir = "/tmp/.*"; @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the files from /tmp and /home directories. $dir = "/tmp/* /home/*";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
Ecco un altro esempio, che apre una directory ed elenca tutti i file disponibili all'interno di questa directory.
#!/usr/bin/perl
opendir (DIR, '.') or die "Couldn't open directory, $!"; while ($file = readdir DIR) {
print "$file\n";
}
closedir DIR;
Un altro esempio per stampare l'elenco dei file sorgente C che potresti utilizzare è:
#!/usr/bin/perl
opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR))) { print "$_\n";
}
closedir DIR;
Crea nuova directory
Puoi usare mkdirfunzione per creare una nuova directory. Sarà necessario disporre dell'autorizzazione richiesta per creare una directory.
#!/usr/bin/perl
$dir = "/tmp/perl"; # This creates perl directory in /tmp directory. mkdir( $dir ) or die "Couldn't create $dir directory, $!";
print "Directory created successfully\n";
Rimuovi una directory
Puoi usare rmdirfunzione per rimuovere una directory. Sarà necessario disporre dell'autorizzazione richiesta per rimuovere una directory. Inoltre, questa directory dovrebbe essere vuota prima di provare a rimuoverla.
#!/usr/bin/perl
$dir = "/tmp/perl"; # This removes perl directory from /tmp directory. rmdir( $dir ) or die "Couldn't remove $dir directory, $!";
print "Directory removed successfully\n";
Cambia una directory
Puoi usare chdirfunzione per cambiare una directory e andare in una nuova posizione. Sarà necessario disporre dell'autorizzazione richiesta per modificare una directory e accedere alla nuova directory.
#!/usr/bin/perl
$dir = "/home"; # This changes perl directory and moves you inside /home directory. chdir( $dir ) or die "Couldn't go inside $dir directory, $!";
print "Your new location is $dir\n";
L'esecuzione e gli errori vanno sempre insieme. Se stai aprendo un file che non esiste. quindi se non hai gestito correttamente questa situazione, il tuo programma è considerato di scarsa qualità.
Il programma si interrompe se si verifica un errore. Quindi una corretta gestione degli errori viene utilizzata per gestire vari tipi di errori, che possono verificarsi durante l'esecuzione di un programma e intraprendere l'azione appropriata invece di interrompere completamente il programma.
È possibile identificare e intercettare un errore in molti modi diversi. È molto facile intercettare gli errori in Perl e quindi gestirli correttamente. Ecco alcuni metodi che possono essere utilizzati.
L'istruzione if
Il if statementè la scelta più ovvia quando è necessario controllare il valore restituito da un'istruzione; per esempio -
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
Qui la variabile $! restituisce il messaggio di errore effettivo. In alternativa, possiamo ridurre l'affermazione a una riga nelle situazioni in cui ha senso farlo; per esempio -
open(DATA, $file) || die "Error: Couldn't open the file $!";
La funzioneless
Il unlessla funzione è l'opposto logico di if: le istruzioni possono ignorare completamente lo stato di successo ed essere eseguite solo se l'espressione restituisce false. Ad esempio:
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
Il unlessè meglio utilizzare quando si desidera sollevare un errore o un'alternativa solo se l'espressione fallisce. L'affermazione ha senso anche se usata in un'istruzione di una sola riga:
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
Qui moriamo solo se l'operazione chdir fallisce e si legge bene.
L'operatore ternario
Per test molto brevi, puoi usare l'operatore condizionale ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
Non è così chiaro qui cosa stiamo cercando di ottenere, ma l'effetto è lo stesso dell'uso di un file if o unlessdichiarazione. L'operatore condizionale viene utilizzato al meglio quando si desidera restituire rapidamente uno dei due valori all'interno di un'espressione o un'istruzione.
La funzione warn
La funzione warn genera solo un avviso, un messaggio viene stampato su STDERR, ma non viene intrapresa alcuna azione. Quindi è più utile se vuoi solo stampare un avviso per l'utente e procedere con il resto dell'operazione -
chdir('/etc') or warn "Can't change directory";
La funzione die
La funzione die funziona proprio come warn, tranne per il fatto che chiama anche exit. All'interno di uno script normale, questa funzione ha l'effetto di terminare immediatamente l'esecuzione. Dovresti usare questa funzione nel caso in cui sia inutile procedere se c'è un errore nel programma -
chdir('/etc') or die "Can't change directory";
Errori all'interno dei moduli
Ci sono due diverse situazioni che dovremmo essere in grado di gestire:
Segnalare un errore in un modulo che cita il nome del file e il numero di riga del modulo: è utile quando si esegue il debug di un modulo o quando si desidera specificamente sollevare un errore relativo al modulo, piuttosto che relativo allo script.
Segnalazione di un errore all'interno di un modulo che cita le informazioni del chiamante in modo da poter eseguire il debug della riga all'interno dello script che ha causato l'errore. Gli errori generati in questo modo sono utili all'utente finale, perché evidenziano l'errore in relazione alla riga di origine dello script chiamante.
Il warn e diele funzioni funzionano in modo leggermente diverso da quello che ti aspetteresti quando chiamate dall'interno di un modulo. Ad esempio, il modulo semplice -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
Quando viene chiamato da uno script come di seguito -
use T;
function();
Produrrà il seguente risultato:
Error in module! at T.pm line 9.
Questo è più o meno quello che potresti aspettarti, ma non necessariamente quello che vuoi. Dal punto di vista di un programmatore di moduli, le informazioni sono utili perché aiutano a indicare un bug all'interno del modulo stesso. Per un utente finale, le informazioni fornite sono abbastanza inutili e per tutti tranne che per i programmatori incalliti, sono completamente inutili.
La soluzione a questi problemi è il modulo Carp, che fornisce un metodo semplificato per segnalare errori all'interno dei moduli che restituiscono informazioni sullo script chiamante. Il modulo Carp fornisce quattro funzioni: carpa, cluck, gracidare e confessare. Queste funzioni sono discusse di seguito.
La funzione carpa
La funzione carp è l'equivalente di base di warn e stampa il messaggio su STDERR senza effettivamente uscire dallo script e stampare il nome dello script.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
Quando viene chiamato da uno script come di seguito -
use T;
function();
Produrrà il seguente risultato:
Error in module! at test.pl line 4
La funzione cluck
La funzione cluck è una sorta di carpa sovralimentata, segue lo stesso principio di base ma stampa anche una traccia dello stack di tutti i moduli che hanno portato alla chiamata della funzione, comprese le informazioni sullo script originale.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
Quando viene chiamato da uno script come di seguito -
use T;
function();
Produrrà il seguente risultato:
Error in module! at T.pm line 9
T::function() called at test.pl line 4
La funzione gracchiare
Il croak funzione è equivalente a die, tranne per il fatto che segnala il chiamante di un livello superiore. Come die, anche questa funzione esce dallo script dopo aver segnalato l'errore a STDERR -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
Quando viene chiamato da uno script come di seguito -
use T;
function();
Produrrà il seguente risultato:
Error in module! at test.pl line 4
Come per le carpe, si applicano le stesse regole di base per quanto riguarda l'inclusione delle informazioni sulla linea e sul file in base alle funzioni di avvertimento e di matrice.
La funzione confessare
Il confess la funzione è simile cluck; chiama die e quindi stampa una traccia dello stack fino allo script di origine.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
Quando viene chiamato da uno script come di seguito -
use T;
function();
Produrrà il seguente risultato:
Error in module! at T.pm line 9
T::function() called at test.pl line 4
Ci sono alcune variabili che hanno un significato predefinito e speciale in Perl. Sono le variabili che utilizzano i caratteri di punteggiatura dopo il solito indicatore di variabile ($, @ o%), come $ _ (spiegato di seguito).
La maggior parte delle variabili speciali ha un nome lungo come l'inglese, ad esempio, variabile di errore del sistema operativo $! può essere scritto come $ OS_ERROR. Ma se hai intenzione di usare nomi simili all'inglese, dovresti inserire una rigause English;all'inizio del file di programma. Questo guida l'interprete a cogliere il significato esatto della variabile.
La variabile speciale più comunemente usata è $ _, che contiene l'input predefinito e la stringa di ricerca del modello. Ad esempio, nelle righe seguenti:
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print $_;
print "\n";
}
Quando viene eseguito, questo produrrà il seguente risultato:
hickory
dickory
doc
Di nuovo, controlliamo lo stesso esempio senza usare esplicitamente la variabile $ _ -
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print;
print "\n";
}
Quando viene eseguito, questo produrrà anche il seguente risultato:
hickory
dickory
doc
La prima volta che il ciclo viene eseguito, viene stampato "hickory". La seconda volta viene stampato "dickory" e la terza volta "doc". Questo perché in ogni iterazione del ciclo, viene inserita la stringa corrente$_, and is used by default by print. Here are the places where Perl will assume $_ anche se non lo specifichi -
Varie funzioni unarie, incluse funzioni come ord e int, nonché tutti i test di file (-f, -d) eccetto -t, che per impostazione predefinita è STDIN.
Varie funzioni di elenco come stampa e scollega.
Le operazioni di corrispondenza dei modelli m //, s /// e tr /// se usate senza un operatore = ~.
La variabile iteratore predefinita in un ciclo foreach se non viene fornita alcuna altra variabile.
La variabile iteratore implicita nelle funzioni grep e map.
La posizione predefinita in cui inserire un record di input quando il risultato di un'operazione di input di riga viene testato da solo come unico criterio di un test while (cioè). Si noti che al di fuori di un breve test, ciò non accadrà.
Tipi di variabili speciali
In base all'uso e alla natura delle variabili speciali, possiamo classificarle nelle seguenti categorie:
- Variabili speciali scalari globali.
- Variabili speciali dell'array globale.
- Variabili speciali hash globali.
- Filehandle speciali globali.
- Costanti speciali globali.
- Variabili speciali delle espressioni regolari.
- Variabili speciali Filehandle.
Variabili speciali scalari globali
Ecco l'elenco di tutte le variabili speciali scalari. Abbiamo elencato i nomi simili in inglese insieme ai nomi simbolici.
$ _ | Lo spazio di input e di ricerca pattern predefinito. |
$ ARG | |
$. | Il numero di riga di input corrente dell'ultimo filehandle letto. Una chiusura esplicita sul filehandle ripristina il numero di riga. |
$ NR | |
$ / | Il separatore di record di input; nuova riga per impostazione predefinita. Se impostato sulla stringa nulla, tratta le righe vuote come delimitatori. |
$ RS | |
$, | Il separatore del campo di output per l'operatore di stampa. |
$ OFS | |
$ \ | Il separatore di record di output per l'operatore di stampa. |
$ ORS | |
$ " | Come "$", tranne per il fatto che si applica ai valori di elenco interpolati in una stringa tra virgolette (o una stringa interpretata simile). L'impostazione predefinita è uno spazio. |
$ LIST_SEPARATOR | |
$; | Il separatore di pedici per l'emulazione di array multidimensionali. L'impostazione predefinita è "\ 034". |
$ SUBSCRIPT_SEPARATOR | |
$ ^ L | Che formato produce per eseguire un formfeed. L'impostazione predefinita è "\ f". |
$ FORMAT_FORMFEED | |
$: | Il set corrente di caratteri dopo il quale una stringa può essere interrotta per riempire i campi di continuazione (che iniziano con ^) in un formato. L'impostazione predefinita è "\ n" ". |
$ FORMAT_LINE_BREAK_CHARACTERS | |
$ ^ A | Il valore corrente dell'accumulatore di scrittura per le righe di formato. |
$ ACCUMULATORE | |
$ # | Contiene il formato di output per i numeri stampati (deprecato). |
$ OFMT | |
$? | Lo stato restituito dall'ultima chiusura pipe, comando backtick (``) o operatore di sistema. |
$ CHILD_ERROR | |
$! | Se utilizzato in un contesto numerico, restituisce il valore corrente della variabile errno, identificando l'ultimo errore della chiamata di sistema. Se utilizzato in un contesto stringa, restituisce la stringa di errore di sistema corrispondente. |
$OS_ERROR or $ERRNO | |
$ @ | Il messaggio di errore di sintassi Perl dall'ultimo comando eval. |
$ EVAL_ERROR | |
$$ | Il pid del processo Perl che esegue questo script. |
$ PROCESS_ID o $ PID | |
$ < | L'ID utente reale (uid) di questo processo. |
$REAL_USER_ID or $UID | |
$> | L'ID utente effettivo di questo processo. |
$ EFFECTIVE_USER_ID o $ EUID | |
$ ( | Il vero ID gruppo (gid) di questo processo. |
$REAL_GROUP_ID or $GID | |
$) | Il gid efficace di questo processo. |
$ EFFECTIVE_GROUP_ID o $ EGID | |
$ 0 | Contiene il nome del file contenente lo script Perl in esecuzione. |
$ PROGRAM_NAME | |
$ [ | L'indice del primo elemento in una matrice e del primo carattere in una sottostringa. L'impostazione predefinita è 0. |
$] | Restituisce la versione più il livello di patch diviso per 1000. |
$ PERL_VERSION | |
$ ^ D | Il valore corrente dei flag di debug. |
$ DEBUGGING | |
$ ^ E | Messaggio di errore esteso su alcune piattaforme. |
$ EXTENDED_OS_ERROR | |
$ ^ F | Il descrittore di file di sistema massimo, normalmente 2. |
$ SYSTEM_FD_MAX | |
$ ^ H | Contiene suggerimenti interni per il compilatore abilitati da alcuni moduli pragmatici. |
$ ^ I | Il valore corrente dell'estensione inplace-edit. Usa undef per disabilitare la modifica sul posto. |
$ INPLACE_EDIT | |
$ ^ M | Il contenuto di $M can be used as an emergency memory pool in case Perl dies with an out-of-memory error. Use of $M richiede una compilazione speciale di Perl. Vedere il documento INSTALL per ulteriori informazioni. |
$ ^ O | Contiene il nome del sistema operativo per cui è stato compilato il binario Perl corrente. |
$ OSNAME | |
$ ^ P | Il flag interno che il debugger cancella in modo che non esegua il debug da solo. |
$ PERLDB | |
$ ^ T | L'ora in cui lo script ha iniziato a essere eseguito, in secondi dall'epoca. |
$ BASETIME | |
$ ^ W | Il valore corrente dell'interruttore di avviso, vero o falso. |
$ ATTENZIONE | |
$ ^ X | Il nome con cui è stato eseguito il binario Perl stesso. |
$ EXECUTABLE_NAME | |
$ ARGV | Contiene il nome del file corrente durante la lettura da <ARGV>. |
Variabili speciali dell'array globale
@ARGV | L'array contenente gli argomenti della riga di comando destinati allo script. |
@INC | L'array contenente l'elenco delle posizioni in cui cercare gli script Perl che devono essere valutati dai costrutti do, require o use. |
@F | L'array in cui vengono suddivise le righe di input quando viene fornita l'opzione -a della riga di comando. |
Variabili speciali hash globali
% INC | L'hash contenente le voci per il nome del file di ogni file che è stato incluso tramite do o require. |
% ENV | L'hash contenente l'ambiente corrente. |
% SIG | L'hash utilizzato per impostare i gestori di segnali per vari segnali. |
Filehandle speciali globali
ARGV | Il filehandle speciale che itera sui nomi dei file della riga di comando in @ARGV. Di solito scritto come filehandle nullo in <>. |
STDERR | Il filehandle speciale per l'errore standard in qualsiasi pacchetto. |
STDIN | Lo speciale filehandle per lo standard input in qualsiasi pacchetto. |
STDOUT | Lo speciale filehandle per lo standard output in qualsiasi pacchetto. |
DATI | Lo speciale filehandle che fa riferimento a tutto ciò che segue il token __END__ nel file contenente lo script. Oppure, il filehandle speciale per qualsiasi cosa che segue il token __DATA__ in un file richiesto, purché tu stia leggendo i dati nello stesso pacchetto in cui è stato trovato __DATA__. |
_ (trattino basso) | Lo speciale filehandle utilizzato per memorizzare nella cache le informazioni dall'ultimo operatore di test stat, lstat o file. |
Costanti speciali globali
__FINE__ | Indica la fine logica del programma. Qualsiasi testo seguente viene ignorato, ma può essere letto tramite il filehandle DATA. |
__FILE__ | Rappresenta il nome del file nel punto del programma in cui viene utilizzato. Non interpolato in stringhe. |
__LINEA__ | Rappresenta il numero di riga corrente. Non interpolato in stringhe. |
__PACCHETTO__ | Rappresenta il nome del pacchetto corrente in fase di compilazione o non definito se non è presente alcun pacchetto corrente. Non interpolato in stringhe. |
Variabili speciali delle espressioni regolari
$ cifra | Contiene il testo abbinato dal set di parentesi corrispondente nell'ultimo modello trovato. Ad esempio, $ 1 corrisponde a tutto ciò che era contenuto nella prima serie di parentesi nell'espressione regolare precedente. |
$ & | La stringa corrispondente all'ultima corrispondenza di pattern riuscita. |
$ MATCH | |
$ ` | La stringa che precede ciò che è stato trovato per l'ultima corrispondenza di pattern riuscita. |
$ PREMATCH | |
$ ' | La stringa che segue ciò che è stato trovato nell'ultima corrispondenza di pattern riuscita. |
$ POSTMATCH | |
$ + | L'ultima parentesi corrispondente all'ultimo pattern di ricerca. Questo è utile se non sai quale di un insieme di modelli alternativi è stato abbinato. Ad esempio: / Version: (. *) | Revision: (. *) / && ($rev = $+); |
$ LAST_PAREN_MATCH |
Variabili speciali Filehandle
$ | | Se impostato su diverso da zero, forza un fflush (3) dopo ogni scrittura o stampa sul canale di output attualmente selezionato. |
$ OUTPUT_AUTOFLUSH | |
$% | Il numero di pagina corrente del canale di uscita attualmente selezionato. |
$ FORMAT_PAGE_NUMBER | |
$ = | La lunghezza della pagina corrente (righe stampabili) del canale di output attualmente selezionato. L'impostazione predefinita è 60. |
$ FORMAT_LINES_PER_PAGE | |
$ - | Il numero di righe rimaste nella pagina del canale di uscita attualmente selezionato. |
$ FORMAT_LINES_LEFT | |
$ ~ | Il nome del formato di report corrente per il canale di output attualmente selezionato. Il valore predefinito è il nome del filehandle. |
$ FORMAT_NAME | |
$ ^ | Il nome del formato di inizio pagina corrente per il canale di output attualmente selezionato. Il valore predefinito è il nome del filehandle con _TOP aggiunto. |
$ FORMAT_TOP_NAME |
Ogni programmatore, ovviamente, avrà le sue preferenze riguardo alla formattazione, ma ci sono alcune linee guida generali che renderanno i tuoi programmi più facili da leggere, capire e mantenere.
La cosa più importante è eseguire i programmi sempre sotto il flag -w. Puoi disattivarlo esplicitamente per particolari parti di codice tramite il pragma no warnings o la variabile $ ^ W se necessario. Dovresti anche eseguire sempre in use strict o conoscere il motivo per cui no. Anche l'uso di sigtrap e persino l'uso di pragmi diagnostici possono rivelarsi utili.
Per quanto riguarda l'estetica del layout del codice, l'unica cosa a cui Larry tiene fortemente è che la parentesi graffa di chiusura di un BLOCCO multilinea deve allinearsi con la parola chiave che ha iniziato il costrutto. Oltre a ciò, ha altre preferenze che non sono così forti -
- Rientro a 4 colonne.
- Se possibile, aprire ricci sulla stessa riga della parola chiave, altrimenti allineare.
- Spazio prima del ricciolo di apertura di un BLOCCO multilinea.
- BLOCCO di una riga può essere messo su una riga, compresi i ricci.
- Nessuno spazio prima del punto e virgola.
- Punto e virgola omesso in BLOCCO "breve" di una riga.
- Spazio intorno alla maggior parte degli operatori.
- Spazio attorno a un pedice "complesso" (tra parentesi).
- Linee vuote tra blocchi che fanno cose diverse.
- Altri non coccolati.
- Nessuno spazio tra il nome della funzione e la sua parentesi di apertura.
- Spazio dopo ogni virgola.
- Linee lunghe interrotte dopo un operatore (tranne e e o).
- Spazio dopo l'ultima parentesi corrispondente sulla riga corrente.
- Allinea verticalmente gli elementi corrispondenti.
- Ometti punteggiatura ridondante finché la chiarezza non ne risente.
Ecco alcune altre questioni di stile più sostanziali su cui riflettere: solo perché PUOI fare qualcosa in un modo particolare non significa che DOVRESTI farlo in quel modo. Perl è progettato per darti diversi modi per fare qualsiasi cosa, quindi considera di scegliere quello più leggibile. Ad esempio:
open(FOO,$foo) || die "Can't open $foo: $!";
È meglio di -
die "Can't open $foo: $!" unless open(FOO,$foo);
Perché il secondo modo nasconde il punto principale dell'istruzione in un modificatore. D'altra parte,
print "Starting analysis\n" if $verbose;
È meglio di -
$verbose && print "Starting analysis\n";
Perché il punto principale non è se l'utente ha digitato -v o meno.
Non passare attraverso stupide contorsioni per uscire da un ciclo in alto o in basso, quando Perl fornisce l'ultimo operatore in modo da poter uscire nel mezzo. Basta "rimpicciolirlo" un po 'per renderlo più visibile -
LINE:
for (;;) {
statements;
last LINE if $foo;
next LINE if /^#/;
statements;
}
Vediamo alcuni punti più importanti:
Non aver paura di usare le etichette di loop: sono lì per migliorare la leggibilità e per consentire interruzioni di loop multilivello. Vedi l'esempio precedente.
Evita di usare grep () (o map ()) o `backtick` in un contesto void, cioè quando butti via i loro valori di ritorno. Queste funzioni hanno tutte valori di ritorno, quindi usale. Altrimenti usa un ciclo foreach () o la funzione system ().
Per la portabilità, quando si utilizzano funzionalità che potrebbero non essere implementate su ogni macchina, testare il costrutto in una valutazione per vedere se fallisce. Se sai quale versione o livello di patch è stata implementata una particolare funzionalità, puoi testare $] ($ PERL_VERSION in inglese) per vedere se sarà presente. Il modulo Config vi permetterà anche di interrogare i valori determinati dal programma Configure al momento dell'installazione di Perl.
Scegli identificatori mnemonici. Se non ricordi cosa significa mnemonico, hai un problema.
Anche se gli identificatori brevi come $ gotit sono probabilmente ok, usa i trattini bassi per separare le parole in identificatori più lunghi. In genere è più facile da leggere$var_names_like_this than $VarNamesLikeThis, soprattutto per i non madrelingua inglese. È anche una semplice regola che funziona in modo coerente con VAR_NAMES_LIKE_THIS.
I nomi dei pacchetti a volte sono un'eccezione a questa regola. Perl informalmente riserva nomi di moduli in minuscolo per i moduli "pragma" come integer e strict. Altri moduli dovrebbero iniziare con una lettera maiuscola e utilizzare maiuscole e minuscole, ma probabilmente senza trattini bassi a causa delle limitazioni nelle rappresentazioni dei file system primitivi dei nomi dei moduli come file che devono rientrare in pochi byte sparsi.
Se hai un'espressione regolare davvero pelosa, usa il modificatore / x e inserisci degli spazi bianchi per far sembrare un po 'meno rumore di linea. Non utilizzare la barra come delimitatore quando la tua espressione regolare ha barre o barre rovesciate.
Controlla sempre i codici di ritorno delle chiamate di sistema. I buoni messaggi di errore dovrebbero andare a STDERR, includere il programma che ha causato il problema, quali erano la chiamata di sistema fallita e gli argomenti e (MOLTO IMPORTANTE) dovrebbe contenere il messaggio di errore di sistema standard per ciò che è andato storto. Ecco un esempio semplice ma sufficiente:
opendir(D, $dir) or die "can't opendir $dir: $!";
Pensa alla riutilizzabilità. Perché sprecare le capacità intellettuali in un colpo solo quando potresti voler fare di nuovo qualcosa del genere? Considera l'idea di generalizzare il tuo codice. Considera l'idea di scrivere un modulo o una classe di oggetti. Considera la possibilità di eseguire il codice in modo pulito con use strict e use warnings (o -w) in vigore. Considera l'idea di regalare il tuo codice. Considera l'idea di cambiare tutta la tua visione del mondo. Considera ... oh, non importa.
Sii coerente.
Sii gentile.
Un'espressione regolare è una stringa di caratteri che definisce il modello o i modelli visualizzati. La sintassi delle espressioni regolari in Perl è molto simile a quella che troverai in altri programmi di supporto di espressioni regolari, comesed, grep, e awk.
Il metodo di base per applicare un'espressione regolare consiste nell'usare gli operatori di associazione del modello = ~ e !~. Il primo operatore è un operatore di test e assegnazione.
Ci sono tre operatori di espressioni regolari in Perl.
- Match Regular Expression - m //
- Espressione regolare sostitutiva - s ///
- Espressione regolare traslitterata - tr ///
Le barre in avanti in ogni caso fungono da delimitatori per l'espressione regolare (regex) che stai specificando. Se ti senti a tuo agio con qualsiasi altro delimitatore, puoi usarlo al posto della barra in avanti.
L'operatore di corrispondenza
L'operatore di corrispondenza, m //, viene utilizzato per abbinare una stringa o un'istruzione a un'espressione regolare. Ad esempio, per abbinare la sequenza di caratteri "pippo" alla barra $ scalare, potresti usare un'istruzione come questa:
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Quando viene eseguito il programma sopra, produce il seguente risultato:
First time is matching
Second time is matching
In realtà, m // funziona allo stesso modo della serie di operatori q //. Puoi utilizzare qualsiasi combinazione di caratteri che corrispondono naturalmente per agire come delimitatori per l'espressione. Ad esempio, m {}, m () e m> <sono tutti validi. Quindi l'esempio sopra può essere riscritto come segue:
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Puoi omettere m da m // se i delimitatori sono barre, ma per tutti gli altri delimitatori devi usare il prefisso m.
Si noti che l'intera espressione di corrispondenza, ovvero l'espressione a sinistra di = ~ o! ~ E l'operatore di corrispondenza, restituisce true (in un contesto scalare) se l'espressione corrisponde. Pertanto la dichiarazione -
$true = ($foo =~ m/foo/);
sarà impostato $true to 1 if $foo corrisponde alla regex o 0 se la corrispondenza fallisce. In un contesto di elenco, la corrispondenza restituisce il contenuto di qualsiasi espressione raggruppata. Ad esempio, quando si estraggono ore, minuti e secondi da una stringa temporale, è possibile utilizzare:
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Modificatori dell'operatore di corrispondenza
L'operatore di corrispondenza supporta il proprio set di modificatori. Il modificatore / g consente la corrispondenza globale. Il modificatore / i renderà la corrispondenza senza distinzione tra maiuscole e minuscole. Ecco l'elenco completo dei modificatori
Sr.No. | Modificatore e descrizione |
---|---|
1 | i Rende la corrispondenza senza distinzione tra maiuscole e minuscole. |
2 | m Specifica che se la stringa ha caratteri di ritorno a capo o di ritorno a capo, gli operatori ^ e $ ora corrisponderanno a un limite di nuova riga, anziché a un limite di stringa. |
3 | o Valuta l'espressione solo una volta. |
4 | s Consente l'uso di. per abbinare un carattere di nuova riga. |
5 | x Consente di utilizzare lo spazio bianco nell'espressione per maggiore chiarezza. |
6 | g Globalmente trova tutte le corrispondenze. |
7 | cg Consente la ricerca di continuare anche dopo che una corrispondenza globale fallisce. |
Corrispondenza solo una volta
Esiste anche una versione più semplice dell'operatore di corrispondenza: il? PATTERN? operatore. Questo è fondamentalmente identico all'operatore m // tranne per il fatto che corrisponde solo una volta all'interno della stringa che stai cercando tra ogni chiamata da reimpostare.
Ad esempio, puoi usarlo per ottenere il primo e l'ultimo elemento all'interno di un elenco -
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
First: foo, Last: footbrdige
Variabili delle espressioni regolari
Le variabili delle espressioni regolari includono $, che contiene qualunque sia l'ultima corrispondenza di raggruppamento abbinata; $&, che contiene l'intera stringa corrispondente; $`, che contiene tutto prima della stringa corrispondente; e$', che contiene tutto ciò che segue la stringa corrispondente. Il codice seguente mostra il risultato:
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/; print "Before: $`\n";
print "Matched: $&\n"; print "After: $'\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
Before: The
Matched: foo
After: d is in the salad bar
L'operatore di sostituzione
L'operatore di sostituzione, s ///, è in realtà solo un'estensione dell'operatore di corrispondenza che consente di sostituire il testo abbinato con del nuovo testo. La forma base dell'operatore è:
s/PATTERN/REPLACEMENT/;
Il PATTERN è l'espressione regolare per il testo che stiamo cercando. REPLACEMENT è una specifica per il testo o l'espressione regolare che vogliamo utilizzare per sostituire il testo trovato. Ad esempio, possiamo sostituire tutte le occorrenze didog con cat utilizzando la seguente espressione regolare:
#/user/bin/perl
$string = "The cat sat on the mat"; $string =~ s/cat/dog/;
print "$string\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
The dog sat on the mat
Modificatori dell'operatore di sostituzione
Ecco l'elenco di tutti i modificatori usati con l'operatore di sostituzione.
Sr.No. | Modificatore e descrizione |
---|---|
1 | i Rende la corrispondenza senza distinzione tra maiuscole e minuscole. |
2 | m Specifica che se la stringa ha caratteri di ritorno a capo o di ritorno a capo, gli operatori ^ e $ ora corrisponderanno a un limite di nuova riga, anziché a un limite di stringa. |
3 | o Valuta l'espressione solo una volta. |
4 | s Consente l'uso di. per abbinare un carattere di nuova riga. |
5 | x Consente di utilizzare lo spazio bianco nell'espressione per maggiore chiarezza. |
6 | g Sostituisce tutte le occorrenze dell'espressione trovata con il testo sostitutivo. |
7 | e Valuta la sostituzione come se fosse un'istruzione Perl e utilizza il valore restituito come testo di sostituzione. |
L'operatore di traduzione
La traduzione è simile, ma non identica, ai principi di sostituzione, ma a differenza della sostituzione, la traduzione (o traslitterazione) non utilizza espressioni regolari per la ricerca sui valori di sostituzione. Gli operatori di traduzione sono:
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
La traduzione sostituisce tutte le occorrenze dei caratteri in SEARCHLIST con i caratteri corrispondenti in REPLACEMENTLIST. Ad esempio, utilizzando "Il gatto seduto sul tappeto". stringa che abbiamo usato in questo capitolo -
#/user/bin/perl
$string = 'The cat sat on the mat'; $string =~ tr/a/o/;
print "$string\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
The cot sot on the mot.
È possibile utilizzare anche intervalli Perl standard, che consentono di specificare intervalli di caratteri tramite lettera o valore numerico. Per modificare il caso della stringa, potresti utilizzare la seguente sintassi al posto diuc funzione.
$string =~ tr/a-z/A-Z/;
Modificatori dell'operatore di traduzione
Di seguito è riportato l'elenco degli operatori relativi alla traduzione.
Sr.No. | Modificatore e descrizione |
---|---|
1 | c Complementi SEARCHLIST. |
2 | d Elimina i caratteri trovati ma non sostituiti. |
3 | s Le zucche duplicano i caratteri sostituiti. |
Il modificatore / d elimina i caratteri che corrispondono a SEARCHLIST che non hanno una voce corrispondente in REPLACEMENTLIST. Ad esempio:
#!/usr/bin/perl
$string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d;
print "$string\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
b b b.
L'ultimo modificatore, / s, rimuove le sequenze duplicate di caratteri che sono stati sostituiti, quindi -
#!/usr/bin/perl
$string = 'food';
$string = 'food'; $string =~ tr/a-z/a-z/s;
print "$string\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
fod
Espressioni regolari più complesse
Non devi solo abbinare stringhe fisse. In effetti, puoi abbinare praticamente qualsiasi cosa tu possa sognare usando espressioni regolari più complesse. Ecco un breve cheat sheet:
La tabella seguente elenca la sintassi delle espressioni regolari disponibile in Python.
Sr.No. | Modello e descrizione |
---|---|
1 | ^ Corrisponde all'inizio della riga. |
2 | $ Corrisponde alla fine della riga. |
3 | . Corrisponde a qualsiasi carattere singolo tranne la nuova riga. L'uso dell'opzione m consente anche di abbinare la nuova riga. |
4 | [...] Corrisponde a qualsiasi singolo carattere tra parentesi. |
5 | [^...] Corrisponde a qualsiasi carattere singolo non tra parentesi. |
6 | * Corrisponde a 0 o più occorrenze dell'espressione precedente. |
7 | + Corrisponde a 1 o più occorrenze dell'espressione precedente. |
8 | ? Corrisponde a 0 o 1 occorrenza dell'espressione precedente. |
9 | { n} Corrisponde esattamente al numero n di occorrenze dell'espressione precedente. |
10 | { n,} Corrisponde a n o più occorrenze dell'espressione precedente. |
11 | { n, m} Corrisponde ad almeno n e al massimo m occorrenze dell'espressione precedente. |
12 | a| b Corrisponde a a o b. |
13 | \w Corrisponde ai caratteri delle parole. |
14 | \W Corrisponde a caratteri non di parole. |
15 | \s Corrisponde allo spazio bianco. Equivalente a [\ t \ n \ r \ f]. |
16 | \S Corrisponde a spazi non bianchi. |
17 | \d Corrisponde alle cifre. Equivalente a [0-9]. |
18 | \D Corrisponde a non cifre. |
19 | \A Corrisponde all'inizio della stringa. |
20 | \Z Corrisponde alla fine della stringa. Se esiste una nuova riga, corrisponde appena prima della nuova riga. |
21 | \z Corrisponde alla fine della stringa. |
22 | \G Punto delle partite in cui è finita l'ultima partita. |
23 | \b Corrisponde ai confini delle parole quando sono al di fuori delle parentesi. Corrisponde a backspace (0x08) quando è racchiuso tra parentesi. |
24 | \B Corrisponde ai confini non di parole. |
25 | \n, \t, etc. Trova nuove righe, ritorni a capo, tabulazioni, ecc. |
26 | \1...\9 Corrisponde all'ennesima sottoespressione raggruppata. |
27 | \10 Corrisponde all'ennesima sottoespressione raggruppata se corrisponde già. Altrimenti si riferisce alla rappresentazione ottale di un codice carattere. |
28 | [aeiou] Corrisponde a un singolo carattere nel set specificato |
29 | [^aeiou] Corrisponde a un singolo carattere al di fuori del set specificato |
Il metacarattere ^ corrisponde all'inizio della stringa e il metasimbolo $ corrisponde alla fine della stringa. Ecco alcuni brevi esempi.
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
Diamo un'occhiata a un altro esempio.
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
First word: Cats
Line starts: Cats When
Confini corrispondenti
Il \bcorrisponde a qualsiasi confine di parola, come definito dalla differenza tra la classe \ w e la classe \ W. Poiché \ w include i caratteri per una parola e \ W il contrario, questo normalmente significa la fine di una parola. Il\Bl'asserzione corrisponde a qualsiasi posizione che non sia un confine di parola. Ad esempio:
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
Selezione di alternative
Il | carattere è proprio come lo standard o l'OR bit per bit all'interno di Perl. Specifica corrispondenze alternative all'interno di un'espressione regolare o di un gruppo. Ad esempio, per abbinare "gatto" o "cane" in un'espressione, potresti usare questo:
if ($string =~ /cat|dog/)
È possibile raggruppare insieme singoli elementi di un'espressione per supportare corrispondenze complesse. La ricerca dei nomi di due persone potrebbe essere ottenuta con due test separati, come questo:
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/)) This could be written as follows if ($string =~ /(Martin|Sharon) Brown/)
Corrispondenza di raggruppamento
Da un punto di vista delle espressioni regolari, non c'è differenza tra tranne, forse, che il primo è leggermente più chiaro.
$string =~ /(\S+)\s+(\S+)/; and $string =~ /\S+\s+\S+/;
Tuttavia, il vantaggio del raggruppamento è che ci consente di estrarre una sequenza da un'espressione regolare. I raggruppamenti vengono restituiti come un elenco nell'ordine in cui sono visualizzati nell'originale. Ad esempio, nel frammento seguente abbiamo estratto le ore, i minuti e i secondi da una stringa.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Oltre a questo metodo diretto, i gruppi corrispondenti sono disponibili anche all'interno delle speciali variabili $ x, dove x è il numero del gruppo all'interno dell'espressione regolare. Potremmo quindi riscrivere l'esempio precedente come segue:
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/; my ($hours, $minutes, $seconds) = ($1, $2, $3); print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
Hours : 12, Minutes: 05, Second: 30
Quando i gruppi vengono utilizzati nelle espressioni di sostituzione, la sintassi $ x può essere utilizzata nel testo di sostituzione. Quindi, potremmo riformattare una stringa di data usando questo -
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
1999/03/26
L'asserzione \ G
L'asserzione \ G ti consente di continuare la ricerca dal punto in cui si è verificata l'ultima corrispondenza. Ad esempio, nel codice seguente, abbiamo usato \ G in modo da poter cercare nella posizione corretta e quindi estrarre alcune informazioni, senza dover creare una singola espressione regolare più complessa -
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g; ($time) = ($string =~ /\G(\d+:\d+:\d+)/); $string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
Quando viene eseguito il programma sopra, produce il seguente risultato:
Time: 12:31:02, Date: 4/12/00
L'asserzione \ G è in realtà solo l'equivalente metasimbolo della funzione pos, quindi tra le chiamate di espressioni regolari puoi continuare a usare pos e persino modificare il valore di pos (e quindi \ G) usando pos come subroutine lvalue.
Esempi di espressioni regolari
Personaggi letterali
Sr.No. | Esempio e descrizione |
---|---|
1 | Perl Trova "Perl". |
Classi di caratteri
Sr.No. | Esempio e descrizione |
---|---|
1 | [Pp]ython Corrisponde a "Python" o "python" |
2 | rub[ye] Corrisponde a "ruby" o "rube" |
3 | [aeiou] Corrisponde a una vocale qualsiasi minuscola |
4 | [0-9] Corrisponde a qualsiasi cifra; uguale a [0123456789] |
5 | [a-z] Corrisponde a qualsiasi lettera ASCII minuscola |
6 | [A-Z] Corrisponde a qualsiasi lettera ASCII maiuscola |
7 | [a-zA-Z0-9] Corrisponde a uno dei precedenti |
8 | [^aeiou] Corrisponde a qualsiasi cosa diversa da una vocale minuscola |
9 | [^0-9] Corrisponde a qualsiasi cosa diversa da una cifra |
Classi di caratteri speciali
Sr.No. | Esempio e descrizione |
---|---|
1 | . Corrisponde a qualsiasi carattere tranne la nuova riga |
2 | \d Corrisponde a una cifra: [0-9] |
3 | \D Corrisponde a una non cifra: [^ 0-9] |
4 | \s Corrisponde a uno spazio vuoto: [\ t \ r \ n \ f] |
5 | \S Corrisponde a spazi non bianchi: [^ \ t \ r \ n \ f] |
6 | \w Corrisponde a un carattere di una sola parola: [A-Za-z0-9_] |
7 | \W Corrisponde a un carattere diverso da una parola: [^ A-Za-z0-9_] |
Casi di ripetizione
Sr.No. | Esempio e descrizione |
---|---|
1 | ruby? Corrisponde a "rub" o "ruby": la y è facoltativa |
2 | ruby* Corrisponde a "strofinare" più 0 o più anni |
3 | ruby+ Corrisponde a "strofinare" più 1 o più anni |
4 | \d{3} Corrisponde esattamente a 3 cifre |
5 | \d{3,} Corrisponde a 3 o più cifre |
6. | \d{3,5} Corrisponde a 3, 4 o 5 cifre |
Ripetizione di Nongreedy
Corrisponde al minor numero di ripetizioni -
Sr.No. | Esempio e descrizione |
---|---|
1 | <.*> Ripetizione avida: corrisponde a "<python> perl>" |
2 | <.*?> Nongreedy: trova "<python>" in "<python> perl>" |
Raggruppamento con parentesi
Sr.No. | Esempio e descrizione |
---|---|
1 | \D\d+ Nessun gruppo: + si ripete \ d |
2 | (\D\d)+ Raggruppato: + ripete la coppia \ D \ d |
3 | ([Pp]ython(, )?)+ Trova "Python", "Python, python, python", ecc. |
Backreferences
Questo corrisponde di nuovo a un gruppo precedentemente abbinato -
Sr.No. | Esempio e descrizione |
---|---|
1 | ([Pp])ython&\1ails Corrisponde a Python e Pails o Python e Pails |
2 | (['"])[^\1]*\1 Stringa tra virgolette singole o doppie. \ 1 corrisponde a qualsiasi corrispondenza del primo gruppo. \ 2 corrisponde a qualunque sia il 2 ° gruppo abbinato, ecc. |
Alternative
Sr.No. | Esempio e descrizione |
---|---|
1 | python|perl Corrisponde a "python" o "perl" |
2 | rub(y|le)) Corrisponde a "rubino" o "rublo" |
3 | Python(!+|\?) "Python" seguito da uno o più! o uno? |
Ancore
Questa necessità di specificare le posizioni delle partite.
Sr.No. | Esempio e descrizione |
---|---|
1 | ^Python Trova "Python" all'inizio di una stringa o di una riga interna |
2 | Python$ Trova "Python" alla fine di una stringa o di una riga |
3 | \APython Trova "Python" all'inizio di una stringa |
4 | Python\Z Trova "Python" alla fine di una stringa |
5 | \bPython\b Corrisponde a "Python" in corrispondenza del confine di una parola |
6 | \brub\B \ B è un confine non di parole: trova "rub" in "rube" e "ruby" ma non da solo |
7 | Python(?=!) Corrisponde a "Python", se seguito da un punto esclamativo |
8 | Python(?!!) Corrisponde a "Python", se non seguito da un punto esclamativo |
Sintassi speciale con parentesi
Sr.No. | Esempio e descrizione |
---|---|
1 | R(?#comment) Corrisponde a "R". Tutto il resto è un commento |
2 | R(?i)uby Non distingue tra maiuscole e minuscole durante la corrispondenza di "uby" |
3 | R(?i:uby) Come sopra |
4 | rub(?:y|le)) Raggruppa solo senza creare \ 1 backreference |
Utilizzo dell'utilità sendmail
Invio di un messaggio semplice
Se stai lavorando su una macchina Linux / Unix, puoi semplicemente usare sendmailutility all'interno del programma Perl per inviare e-mail. Di seguito è riportato uno script di esempio che può inviare un'e-mail a un determinato ID e-mail. Assicurati solo che il percorso specificato per l'utilità sendmail sia corretto. Questo potrebbe essere diverso per la tua macchina Linux / Unix.
#!/usr/bin/perl
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
In realtà, lo script sopra è uno script di posta elettronica client, che redigerà la posta elettronica e invierà al server in esecuzione localmente sulla tua macchina Linux / Unix. Questo script non sarà responsabile dell'invio di e-mail alla destinazione effettiva. Quindi devi assicurarti che il server di posta elettronica sia configurato correttamente e in esecuzione sulla tua macchina per inviare e-mail all'ID e-mail fornito.
Invio di un messaggio HTML
Se desideri inviare e-mail in formato HTML utilizzando sendmail, devi semplicemente aggiungere Content-type: text/html\n nella parte dell'intestazione dell'email come segue:
#!/usr/bin/perl
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
print MAIL "Content-type: text/html\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
Utilizzo del modulo MIME :: Lite
Se stai lavorando su una macchina Windows, non avrai accesso all'utilità sendmail. Ma hai un'alternativa per scrivere il tuo client di posta elettronica usando il modulo MIME: Lite perl. Puoi scaricare questo modulo da MIME-Lite-3.01.tar.gz e installarlo sulla tua macchina Windows o Linux / Unix. Per installarlo segui i semplici passaggi:
$tar xvfz MIME-Lite-3.01.tar.gz
$cd MIME-Lite-3.01 $perl Makefile.PL
$make $make install
Questo è tutto e avrai il modulo MIME :: Lite installato sulla tua macchina. Ora sei pronto per inviare la tua email con semplici script spiegati di seguito.
Invio di un messaggio semplice
Ora di seguito è riportato uno script che si occuperà di inviare e-mail all'ID e-mail fornito -
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->send;
print "Email Sent Successfully\n";
Invio di un messaggio HTML
Se desideri inviare e-mail in formato HTML utilizzando sendmail, devi semplicemente aggiungere Content-type: text/html\nnella parte di intestazione dell'email. Di seguito è riportato lo script, che si occuperà di inviare e-mail in formato HTML -
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->attr("content-type" => "text/html");
$msg->send;
print "Email Sent Successfully\n";
Invio di un allegato
Se desideri inviare un allegato, il seguente script serve allo scopo:
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]';
$cc = '[email protected]'; $from = '[email protected]';
$subject = 'Test Email'; $message = 'This is test email sent by Perl Script';
$msg = MIME::Lite->new( From => $from,
To => $to, Cc => $cc,
Subject => $subject, Type => 'multipart/mixed' ); # Add your text message. $msg->attach(Type => 'text',
Data => $message ); # Specify your file as attachement. $msg->attach(Type => 'image/gif',
Path => '/tmp/logo.gif',
Filename => 'logo.gif',
Disposition => 'attachment'
);
$msg->send;
print "Email Sent Successfully\n";
Puoi allegare tutti i file che desideri nella tua e-mail utilizzando il metodo attach ().
Utilizzo del server SMTP
Se la tua macchina non esegue un server di posta elettronica, puoi utilizzare qualsiasi altro server di posta disponibile nella posizione remota. Ma per utilizzare qualsiasi altro server di posta elettronica è necessario disporre di un ID, la sua password, URL, ecc. Una volta che hai tutte le informazioni richieste, devi semplicemente fornire quelle informazioni insend() metodo come segue -
$msg->send('smtp', "smtp.myisp.net", AuthUser=>"id", AuthPass=>"password" );
Puoi contattare l'amministratore del tuo server di posta per avere le informazioni sopra utilizzate e se un ID utente e una password non sono già disponibili, il tuo amministratore può crearli in pochi minuti.
Cos'è un socket?
Socket è un meccanismo UNIX di Berkeley per creare una connessione duplex virtuale tra diversi processi. Questo è stato successivamente trasferito su tutti i sistemi operativi noti consentendo la comunicazione tra i sistemi in posizioni geografiche in esecuzione su diversi software del sistema operativo. Se non fosse stato per il socket, la maggior parte della comunicazione di rete tra i sistemi non sarebbe mai avvenuta.
Guardando più da vicino; un tipico sistema informatico su una rete riceve e invia le informazioni desiderate dalle varie applicazioni in esecuzione su di esso. Queste informazioni vengono instradate al sistema, poiché ad esso viene designato un indirizzo IP univoco. Sul sistema, queste informazioni vengono fornite alle applicazioni pertinenti, che ascoltano su porte diverse. Ad esempio, un browser Internet ascolta sulla porta 80 le informazioni ricevute dal server web. Inoltre possiamo scrivere le nostre applicazioni personalizzate che possono ascoltare e inviare / ricevere informazioni su un numero di porta specifico.
Per ora, riassumiamo che un socket è un indirizzo IP e una porta, che consente alla connessione di inviare e ricevere dati su una rete.
Per spiegare il concetto di socket sopra menzionato, prenderemo un esempio di Programmazione client - server utilizzando Perl. Per completare un'architettura client server dovremmo seguire i seguenti passaggi:
Per creare un server
Crea un socket usando socket chiamata.
Associare il socket a un indirizzo di porta utilizzando bind chiamata.
Ascolta il socket all'indirizzo della porta utilizzando listen chiamata.
Accetta le connessioni client utilizzando accept chiamata.
Per creare un cliente
Crea un socket con socket chiamata.
Connetti (il socket) al server usando connect chiamata.
Il diagramma seguente mostra la sequenza completa delle chiamate utilizzate da Client e Server per comunicare tra loro:
Server Side Socket Calls
The socket() call
The socket() call is the first call in establishing a network connection is creating a socket. This call has the following syntax −
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
The above call creates a SOCKET and other three arguments are integers which should have the following values for TCP/IP connections.
DOMAIN should be PF_INET. It's probable 2 on your computer.
TYPE should be SOCK_STREAM for TCP/IP connection.
PROTOCOL should be (getprotobyname('tcp'))[2]. It is the particular protocol such as TCP to be spoken over the socket.
So socket function call issued by the server will be something like this −
use Socket # This defines PF_INET and SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
The bind() call
The sockets created by socket() call are useless until they are bound to a hostname and a port number. Server uses the following bind() function to specify the port at which they will be accepting connections from the clients.
bind( SOCKET, ADDRESS );
Here SOCKET is the descriptor returned by socket() call and ADDRESS is a socket address ( for TCP/IP ) containing three elements −
The address family (For TCP/IP, that's AF_INET, probably 2 on your system).
The port number (for example 21).
The internet address of the computer (for example 10.12.12.168).
As the bind() is used by a server, which does not need to know its own address so the argument list looks like this −
use Socket # This defines PF_INET and SOCK_STREAM
$port = 12345; # The unique port used by the sever to listen requests $server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "Can't bind to port $port! \n";
The or die clause is very important because if a server dies without outstanding connections, the port won't be immediately reusable unless you use the option SO_REUSEADDR using setsockopt() function. Here pack_sockaddr_in() function is being used to pack the Port and IP address into binary format.
The listen() call
If this is a server program, then it is required to issue a call to listen() on the specified port to listen, i.e., wait for the incoming requests. This call has the following syntax −
listen( SOCKET, QUEUESIZE );
The above call uses SOCKET descriptor returned by socket() call and QUEUESIZE is the maximum number of outstanding connection request allowed simultaneously.
The accept() call
If this is a server program then it is required to issue a call to the access() function to accept the incoming connections. This call has the following syntax −
accept( NEW_SOCKET, SOCKET );
The accept call receive SOCKET descriptor returned by socket() function and upon successful completion, a new socket descriptor NEW_SOCKET is returned for all future communication between the client and the server. If access() call fails, then it returns FLASE which is defined in Socket module which we have used initially.
Generally, accept() is used in an infinite loop. As soon as one connection arrives the server either creates a child process to deal with it or serves it himself and then goes back to listen for more connections.
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
Now all the calls related to server are over and let us see a call which will be required by the client.
Client Side Socket Calls
The connect() call
If you are going to prepare client program, then first you will use socket() call to create a socket and then you would have to use connect() call to connect to the server. You already have seen socket() call syntax and it will remain similar to server socket() call, but here is the syntax for connect() call −
connect( SOCKET, ADDRESS );
Here SCOKET is the socket descriptor returned by socket() call issued by the client and ADDRESS is a socket address similar to bind call, except that it contains the IP address of the remote server.
$port = 21; # For example, the ftp port
$server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "Can't connect to port $port! \n";
If you connect to the server successfully, then you can start sending your commands to the server using SOCKET descriptor, otherwise your client will come out by giving an error message.
Client - Server Example
Following is a Perl code to implement a simple client-server program using Perl socket. Here server listens for incoming requests and once connection is established, it simply replies Smile from the server. The client reads that message and print on the screen. Let's see how it has been done, assuming we have our server and client on the same machine.
Script to Create a Server
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use Socket;
# use port 7890 as default
my $port = shift || 7890; my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server # create a socket, make it reusable socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";
# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't bind to port $port! \n"; listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n"; # accepting a connection my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "Smile from the server"; print "Connection recieved from $name\n";
close NEW_SOCKET;
}
To run the server in background mode issue the following command on Unix prompt −
$perl sever.pl&
Script to Create a Client
!/usr/bin/perl -w
# Filename : client.pl
use strict;
use Socket;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890; my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "Can't connect to port $port! \n";
my $line; while ($line = <SOCKET>) {
print "$line\n"; } close SOCKET or die "close: $!";
Now let's start our client at the command prompt, which will connect to the server and read message sent by the server and displays the same on the screen as follows −
$perl client.pl
Smile from the server
NOTE − If you are giving the actual IP address in dot notation, then it is recommended to provide IP address in the same format in both client as well as server to avoid any confusion.
We have already studied references in Perl and Perl anonymous arrays and hashes. Object Oriented concept in Perl is very much based on references and anonymous array and hashes. Let's start learning basic concepts of Object Oriented Perl.
Object Basics
There are three main terms, explained from the point of view of how Perl handles objects. The terms are object, class, and method.
An object within Perl is merely a reference to a data type that knows what class it belongs to. The object is stored as a reference in a scalar variable. Because a scalar only contains a reference to the object, the same scalar can hold different objects in different classes.
A class within Perl is a package that contains the corresponding methods required to create and manipulate objects.
A method within Perl is a subroutine, defined with the package. The first argument to the method is an object reference or a package name, depending on whether the method affects the current object or the class.
Perl provides a bless() function, which is used to return a reference which ultimately becomes an object.
Defining a Class
It is very simple to define a class in Perl. A class is corresponding to a Perl Package in its simplest form. To create a class in Perl, we first build a package.
A package is a self-contained unit of user-defined variables and subroutines, which can be re-used over and over again.
Perl Packages provide a separate namespace within a Perl program which keeps subroutines and variables independent from conflicting with those in other packages.
To declare a class named Person in Perl we do −
package Person;
The scope of the package definition extends to the end of the file, or until another package keyword is encountered.
Creating and Using Objects
To create an instance of a class (an object) we need an object constructor. This constructor is a method defined within the package. Most programmers choose to name this object constructor method new, but in Perl you can use any name.
You can use any kind of Perl variable as an object in Perl. Most Perl programmers choose either references to arrays or hashes.
Let's create our constructor for our Person class using a Perl hash reference. When creating an object, you need to supply a constructor, which is a subroutine within a package that returns an object reference. The object reference is created by blessing a reference to the package's class. For example −
package Person;
sub new {
my $class = shift;
my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # Print all the values just for clarification. print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n"; print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
Now Let us see how to create an Object.
$object = new Person( "Mohammad", "Saleem", 23234345);
You can use simple hash in your consturctor if you don't want to assign any value to any class variable. For example −
package Person;
sub new {
my $class = shift; my $self = {};
bless $self, $class;
return $self;
}
Defining Methods
Other object-oriented languages have the concept of security of data to prevent a programmer from changing an object data directly and they provide accessor methods to modify object data. Perl does not have private variables but we can still use the concept of helper methods to manipulate object data.
Lets define a helper method to get person’s first name −
sub getFirstName {
return $self->{_firstName};
}
Another helper function to set person’s first name −
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
Now lets have a look into complete example: Keep Person package and helper functions into Person.pm file.
#!/usr/bin/perl
package Person;
sub new {
my $class = shift; my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n"; print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n"; bless $self, $class; return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_; return $self->{_firstName};
}
1;
Now let's make use of Person object in employee.pl file as follows −
#!/usr/bin/perl
use Person;
$object = new Person( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
When we execute above program, it produces the following result −
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
Inheritance
Object-oriented programming has very good and useful concept called inheritance. Inheritance simply means that properties and methods of a parent class will be available to the child classes. So you don't have to write the same code again and again, you can just inherit a parent class.
For example, we can have a class Employee, which inherits from Person. This is referred to as an "isa" relationship because an employee is a person. Perl has a special variable, @ISA, to help with this. @ISA governs (method) inheritance.
Following are the important points to be considered while using inheritance −
Perl searches the class of the specified object for the given method or attribute, i.e., variable.
Perl searches the classes defined in the object class's @ISA array.
If no method is found in steps 1 or 2, then Perl uses an AUTOLOAD subroutine, if one is found in the @ISA tree.
If a matching method still cannot be found, then Perl searches for the method within the UNIVERSAL class (package) that comes as part of the standard Perl library.
If the method still has not found, then Perl gives up and raises a runtime exception.
So to create a new Employee class that will inherit methods and attributes from our Person class, we simply code as follows: Keep this code into Employee.pm.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
Now Employee Class has all the methods and attributes inherited from Person class and you can use them as follows: Use main.pl file to test it −
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "After Setting First Name is : $firstName\n";
When we execute above program, it produces the following result −
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
Method Overriding
The child class Employee inherits all the methods from the parent class Person. But if you would like to override those methods in your child class then you can do it by giving your own implementation. You can add your additional functions in child class or you can add or modify the functionality of an existing methods in its parent class. It can be done as follows: modify Employee.pm file.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
# Override constructor
sub new {
my ($class) = @_; # Call the constructor of the parent class, Person. my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
# Add few more attributes
$self->{_id} = undef; $self->{_title} = undef;
bless $self, $class;
return $self; } # Override helper function sub getFirstName { my( $self ) = @_;
# This is child class function.
print "This is child class helper function\n";
return $self->{_firstName}; } # Add more methods sub setLastName{ my ( $self, $lastName ) = @_; $self->{_lastName} = $lastName if defined($lastName);
return $self->{_lastName}; } sub getLastName { my( $self ) = @_;
return $self->{_lastName};
}
1;
Ora proviamo di nuovo a utilizzare l'oggetto Employee nel nostro file main.pl ed eseguiamolo.
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n"; # Now Set first name using helper function. $object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";
Quando eseguiamo il programma sopra, produce il seguente risultato:
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.
Caricamento automatico predefinito
Perl offre una funzionalità che non troveresti in nessun altro linguaggio di programmazione: una subroutine predefinita. Ciò significa che, se definisci una funzione chiamataAUTOLOAD(),quindi qualsiasi chiamata a subroutine non definite chiamerà automaticamente la funzione AUTOLOAD (). Il nome della subroutine mancante è accessibile all'interno di questa subroutine come $ AUTOLOAD.
La funzionalità di caricamento automatico predefinita è molto utile per la gestione degli errori. Ecco un esempio per implementare AUTOLOAD, puoi implementare questa funzione a modo tuo.
sub AUTOLOAD {
my $self = shift; my $type = ref ($self) || croak "$self is not an object";
my $field = $AUTOLOAD;
$field =~ s/.*://; unless (exists $self->{$field}) { croak "$field does not exist in object/class $type"; } if (@_) { return $self->($name) = shift; } else { return $self->($name);
}
}
Distruttori e Garbage Collection
Se in precedenza hai programmato utilizzando la programmazione orientata agli oggetti, sarai consapevole della necessità di creare un file destructorper liberare la memoria allocata all'oggetto al termine dell'utilizzo. Perl lo fa automaticamente non appena l'oggetto esce dall'ambito.
Nel caso in cui desideri implementare il tuo distruttore, che dovrebbe occuparsi di chiudere i file o eseguire un'elaborazione extra, devi definire un metodo speciale chiamato DESTROY. Questo metodo verrà chiamato sull'oggetto appena prima che Perl liberi la memoria assegnata all'oggetto. Sotto tutti gli altri aspetti, il metodo DESTROY è proprio come qualsiasi altro metodo e puoi implementare qualsiasi logica tu voglia all'interno di questo metodo.
Un metodo distruttore è semplicemente una funzione membro (subroutine) denominata DESTROY, che verrà chiamata automaticamente nei seguenti casi:
- Quando la variabile del riferimento all'oggetto esce dall'ambito.
- Quando la variabile del riferimento all'oggetto è indefinita.
- Quando lo script termina
- Quando termina l'interprete perl
Ad esempio, puoi semplicemente inserire il seguente metodo DESTROY nella tua classe:
package MyClass;
...
sub DESTROY {
print "MyClass::DESTROY called\n";
}
Esempio di Perl orientato agli oggetti
Ecco un altro bell'esempio, che ti aiuterà a comprendere i concetti orientati agli oggetti di Perl. Metti questo codice sorgente in qualsiasi file perl ed eseguilo.
#!/usr/bin/perl
# Following is the implementation of simple Class.
package MyClass;
sub new {
print "MyClass::new called\n";
my $type = shift; # The package/type name
my $self = {}; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MyClass::DESTROY called\n"; } sub MyMethod { print "MyClass::MyMethod called!\n"; } # Following is the implemnetation of Inheritance. package MySubClass; @ISA = qw( MyClass ); sub new { print "MySubClass::new called\n"; my $type = shift; # The package/type name
my $self = MyClass->new; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MySubClass::DESTROY called\n"; } sub MyMethod { my $self = shift;
$self->SUPER::MyMethod(); print " MySubClass::MyMethod called!\n"; } # Here is the main program using above classes. package main; print "Invoke MyClass method\n"; $myObject = MyClass->new();
$myObject->MyMethod(); print "Invoke MySubClass method\n"; $myObject2 = MySubClass->new();
$myObject2->MyMethod(); print "Create a scoped object\n"; { my $myObject2 = MyClass->new();
}
# Destructor is called automatically here
print "Create and undef an object\n";
$myObject3 = MyClass->new(); undef $myObject3;
print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here
Quando eseguiamo il programma sopra, produce il seguente risultato:
Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called
Questo capitolo ti insegna come accedere a un database all'interno del tuo script Perl. A partire da Perl 5 è diventato molto facile scrivere applicazioni di database utilizzandoDBImodulo. DBI sta perDatabase Independent Interface per Perl, il che significa che DBI fornisce un livello di astrazione tra il codice Perl e il database sottostante, consentendo di cambiare le implementazioni del database molto facilmente.
Il DBI è un modulo di accesso al database per il linguaggio di programmazione Perl. Fornisce una serie di metodi, variabili e convenzioni che forniscono un'interfaccia di database coerente, indipendentemente dal database effettivamente utilizzato.
Architettura di un'applicazione DBI
DBI è indipendente da qualsiasi database disponibile nel backend. È possibile utilizzare DBI sia che si lavori con Oracle, MySQL o Informix, ecc. Questo è chiaro dal seguente diagramma dell'architettura.
Qui DBI è responsabile di prendere tutti i comandi SQL attraverso l'API, (cioè, Application Programming Interface) e di inviarli al driver appropriato per l'esecuzione effettiva. Infine, DBI è responsabile di prendere i risultati dal driver e restituirli allo scritp chiamante.
Notazione e convenzioni
In questo capitolo verranno utilizzate le seguenti notazioni e si raccomanda di seguire la stessa convenzione.
$dsn Database source name $dbh Database handle object
$sth Statement handle object $h Any of the handle types above ($dbh, $sth, or $drh) $rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer) @ary List of values returned from the database. $rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
Connessione al database
Supponendo che lavoreremo con il database MySQL. Prima di collegarti a un database, assicurati di quanto segue. Puoi prendere l'aiuto del nostro tutorial MySQL nel caso in cui non sei a conoscenza di come creare database e tabelle nel database MySQL.
Hai creato un database con un nome TESTDB.
Hai creato una tabella con un nome TEST_TABLE in TESTDB.
Questa tabella contiene i campi FIRST_NAME, LAST_NAME, AGE, SEX e INCOME.
L'ID utente "testuser" e la password "test123" sono impostati per accedere a TESTDB.
Perl Module DBI è installato correttamente sulla macchina.
Hai seguito il tutorial di MySQL per comprendere le basi di MySQL.
Di seguito è riportato l'esempio di connessione con il database MySQL "TESTDB" -
#!/usr/bin/perl
use DBI
use strict;
my $driver = "mysql";
my $database = "TESTDB"; my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser"; my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
Se viene stabilita una connessione con l'origine dati, viene restituito un handle di database e salvato in $ dbh per un ulteriore utilizzo, altrimenti $ dbh viene impostato sul valore undef e $ DBI :: errstr restituisce una stringa di errore.
Operazione INSERT
L'operazione INSERT è necessaria quando si desidera creare alcuni record in una tabella. Qui stiamo usando la tabella TEST_TABLE per creare i nostri record. Quindi, una volta stabilita la connessione al database, siamo pronti per creare record in TEST_TABLE. Di seguito è riportata la procedura per creare un singolo record in TEST_TABLE. Puoi creare tutti i record che desideri utilizzando lo stesso concetto.
La creazione di record richiede i seguenti passaggi:
Preparazione dell'istruzione SQL con l'istruzione INSERT. Questo sarà fatto usandoprepare() API.
Esecuzione di query SQL per selezionare tutti i risultati dal database. Questo sarà fatto usandoexecute() API.
Rilascio della maniglia di stato. Questo sarà fatto usandofinish() API.
Se tutto va bene allora commit questa operazione altrimenti puoi rollbacktransazione completa. Il commit e il rollback sono spiegati nelle sezioni successive.
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish(); $dbh->commit or die $DBI::errstr;
Utilizzo dei valori di associazione
Potrebbe esserci un caso in cui i valori da inserire non vengono forniti in anticipo. Quindi puoi usare le variabili di bind che prenderanno i valori richiesti in fase di esecuzione. I moduli Perl DBI fanno uso di un punto interrogativo al posto del valore effettivo e quindi i valori effettivi vengono passati tramite l'API execute () in fase di esecuzione. Di seguito è riportato l'esempio:
my $first_name = "john";
my $last_name = "poul"; my $sex = "M";
my $income = 13000; my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
(?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income)
or die $DBI::errstr; $sth->finish();
$dbh->commit or die $DBI::errstr;
Operazione READ
LETTURA Operare su una qualsiasi banca dati significa prelevare alcune informazioni utili dal database, ovvero uno o più record da una o più tabelle. Quindi, una volta stabilita la connessione al database, siamo pronti per eseguire una query in questo database. Di seguito è riportata la procedura per interrogare tutti i record con ETÀ maggiore di 20. Questo richiederà quattro passaggi:
Preparazione della query SQL SELECT in base alle condizioni richieste. Questo sarà fatto usandoprepare() API.
Esecuzione di query SQL per selezionare tutti i risultati dal database. Questo sarà fatto usandoexecute() API.
Recuperare tutti i risultati uno per uno e stamparli. Questo sarà fatto usando fetchrow_array() API.
Rilascio della maniglia di stato. Questo sarà fatto usandofinish() API.
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows; while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
Utilizzo dei valori di associazione
Potrebbe esserci un caso in cui la condizione non viene fornita in anticipo. Quindi puoi usare le variabili di bind, che assumeranno i valori richiesti in fase di esecuzione. I moduli Perl DBI utilizzano un punto interrogativo al posto del valore effettivo e quindi i valori effettivi vengono passati tramite l'API execute () in fase di esecuzione. Di seguito è riportato l'esempio:
$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr; print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) { my ($first_name, $last_name ) = @row; print "First Name = $first_name, Last Name = $last_name\n"; } $sth->finish();
Operazione UPDATE
AGGIORNAMENTO Operare su qualsiasi database significa aggiornare uno o più record già disponibili nelle tabelle del database. Di seguito è riportata la procedura per aggiornare tutti i record che hanno SEX come "M". Qui aumenteremo l'ETÀ di tutti i maschi di un anno. Questo richiederà tre passaggi:
Preparazione di query SQL in base alle condizioni richieste. Questo sarà fatto usandoprepare() API.
Esecuzione di query SQL per selezionare tutti i risultati dal database. Questo sarà fatto usandoexecute() API.
Rilascio della maniglia di stato. Questo sarà fatto usandofinish() API.
Se tutto va bene allora commit questa operazione altrimenti puoi rollbacktransazione completa. Vedere la sezione successiva per le API di commit e rollback.
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
Utilizzo dei valori di associazione
Potrebbe esserci un caso in cui la condizione non viene fornita in anticipo. Quindi puoi usare le variabili di bind, che assumeranno i valori richiesti in fase di esecuzione. I moduli Perl DBI fanno uso di un punto interrogativo al posto del valore effettivo e quindi i valori effettivi vengono passati tramite l'API execute () in fase di esecuzione. Di seguito è riportato l'esempio:
$sex = 'M'; my $sth = $dbh->prepare("UPDATE TEST_TABLE SET AGE = AGE + 1 WHERE SEX = ?"); $sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
In alcuni casi si desidera impostare un valore, che non viene fornito in anticipo, quindi è possibile utilizzare il valore di associazione come segue. In questo esempio il reddito di tutti i maschi sarà impostato a 10000.
$sex = 'M'; $income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET INCOME = ?
WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
Operazione DELETE
L'operazione DELETE è necessaria quando si desidera eliminare alcuni record dal database. Di seguito è riportata la procedura per eliminare tutti i record da TEST_TABLE dove AGE è uguale a 30. Questa operazione eseguirà i seguenti passaggi.
Preparazione di query SQL in base alle condizioni richieste. Questo sarà fatto usandoprepare() API.
Esecuzione di query SQL per eliminare i record richiesti dal database. Questo sarà fatto usandoexecute() API.
Rilascio della maniglia di stato. Questo sarà fatto usandofinish() API.
Se tutto va bene allora commit questa operazione altrimenti puoi rollback transazione completa.
$age = 30; my $sth = $dbh->prepare("DELETE FROM TEST_TABLE WHERE AGE = ?"); $sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
Utilizzando do Statement
Se stai eseguendo un UPDATE, INSERT o DELETE non ci sono dati che tornano dal database, quindi c'è una scorciatoia per eseguire questa operazione. Puoi usaredo istruzione per eseguire uno qualsiasi dei comandi come segue.
$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');
dorestituisce un valore vero se è riuscito e un valore falso se non è riuscito. In realtà, se ha successo, restituisce il numero di righe interessate. Nell'esempio restituirà il numero di righe che sono state effettivamente eliminate.
Operazione COMMIT
Commit è l'operazione che dà un segnale verde al database per finalizzare le modifiche e dopo questa operazione nessuna modifica può essere riportata alla sua posizione originale.
Ecco un semplice esempio da chiamare commit API.
$dbh->commit or die $dbh->errstr;
Operazione ROLLBACK
Se non sei soddisfatto di tutte le modifiche o riscontri un errore tra un'operazione e l'altra, puoi ripristinare tali modifiche per l'uso rollback API.
Ecco un semplice esempio da chiamare rollback API.
$dbh->rollback or die $dbh->errstr;
Inizia transazione
Molti database supportano le transazioni. Ciò significa che puoi fare un sacco di query che modificherebbero i database, ma nessuna delle modifiche viene effettivamente apportata. Quindi, alla fine, emetti la query SQL specialeCOMMITe tutte le modifiche vengono apportate contemporaneamente. In alternativa, puoi emettere la query ROLLBACK, nel qual caso tutte le modifiche vengono eliminate e il database rimane invariato.
Modulo DBI Perl fornito begin_workAPI, che abilita le transazioni (disattivando AutoCommit) fino alla chiamata successiva per il commit o il rollback. Dopo il successivo commit o rollback, AutoCommit verrà riattivato automaticamente.
$rc = $dbh->begin_work or die $dbh->errstr;
Opzione AutoCommit
Se le tue transazioni sono semplici, puoi risparmiarti la fatica di dover emettere molti commit. Quando si effettua la chiamata di connessione, è possibile specificare un fileAutoCommitopzione che eseguirà un'operazione di commit automatico dopo ogni query riuscita. Ecco come appare:
my $dbh = DBI->connect($dsn, $userid, $password,
{AutoCommit => 1})
or die $DBI::errstr;
Qui AutoCommit può assumere valore 1 o 0, dove 1 significa che AutoCommit è attivo e 0 significa che AutoCommit è disattivato.
Gestione automatica degli errori
Quando si effettua la chiamata di connessione, è possibile specificare un'opzione RaiseErrors che gestisce gli errori automaticamente. Quando si verifica un errore, DBI interromperà il programma invece di restituire un codice di errore. Se tutto ciò che vuoi è interrompere il programma in caso di errore, questo può essere conveniente. Ecco come appare:
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;
Qui RaiseError può assumere valore 1 o 0.
Disconnessione del database
Per disconnettere la connessione al database, utilizzare disconnect API come segue -
$rc = $dbh->disconnect or warn $dbh->errstr;
Il comportamento della transazione del metodo di disconnessione è, purtroppo, indefinito. Alcuni sistemi di database (come Oracle e Ingres) eseguiranno automaticamente il commit delle modifiche in sospeso, ma altri (come Informix) annulleranno tutte le modifiche in sospeso. Le applicazioni che non utilizzano AutoCommit devono chiamare esplicitamente il commit o il rollback prima di chiamare la disconnessione.
Utilizzo di valori NULL
I valori non definiti o undef vengono utilizzati per indicare i valori NULL. È possibile inserire e aggiornare colonne con un valore NULL come si farebbe con un valore non NULL. Questi esempi inseriscono e aggiornano l'età della colonna con un valore NULL -
$sth = $dbh->prepare(qq { INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?) }); $sth->execute("Joe", undef);
Qui qq{} viene utilizzato per restituire una stringa tra virgolette prepareAPI. Tuttavia, è necessario prestare attenzione quando si tenta di utilizzare valori NULL in una clausola WHERE. Considera -
SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?
Associare un undef (NULL) al segnaposto non selezionerà le righe, che hanno un'età NULL! Almeno per i motori di database conformi allo standard SQL. Fare riferimento al manuale SQL per il motore di database o qualsiasi libro SQL per le ragioni di ciò. Per selezionare esplicitamente NULL devi dire "WHERE age IS NULL".
Un problema comune è che un frammento di codice gestisca un valore che può essere definito o undef (non NULL o NULL) in fase di esecuzione. Una tecnica semplice consiste nel preparare l'istruzione appropriata in base alle esigenze e sostituire il segnaposto per i casi non NULL -
$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause }); $sth->execute(defined $age ? $age : ());
Alcune altre funzioni DBI
driver_disponibili
@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);
Restituisce un elenco di tutti i driver disponibili cercando i moduli DBD :: * attraverso le directory in @INC. Per impostazione predefinita, viene fornito un avviso se alcuni driver sono nascosti da altri con lo stesso nome nelle directory precedenti. Il passaggio di un valore vero per $ quiet inibirà l'avviso.
driver_installati
%drivers = DBI->installed_drivers();
Restituisce un elenco di nomi di driver e coppie di handle di driver per tutti i driver "installati" (caricati) nel processo corrente. Il nome del driver non include il prefisso "DBD ::".
Origine dei dati
@ary = DBI->data_sources($driver);
Restituisce un elenco di origini dati (database) disponibili tramite il driver denominato. Se $ driver è vuoto o undef, viene utilizzato il valore della variabile di ambiente DBI_DRIVER.
citazione
$sql = $dbh->quote($value); $sql = $dbh->quote($value, $data_type);
Indicare un valore letterale stringa da utilizzare come valore letterale in un'istruzione SQL, eseguendo l'escape di eventuali caratteri speciali (come le virgolette) contenuti nella stringa e aggiungendo il tipo richiesto di virgolette esterne.
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
Per la maggior parte dei tipi di database, le virgolette restituiscono "Non" (comprese le virgolette esterne). È valido per il metodo quote () restituire un'espressione SQL che restituisce la stringa desiderata. Ad esempio:
$quoted = $dbh->quote("one\ntwo\0three")
may produce results which will be equivalent to
CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
Metodi comuni a tutte le maniglie
err
$rv = $h->err; or $rv = $DBI::err or $rv = $h->err
Restituisce il codice di errore del motore di database nativo dall'ultimo metodo del driver chiamato. Il codice è in genere un numero intero, ma non dovresti assumerlo. Ciò è equivalente a $ DBI :: err o $ h-> err.
errstr
$str = $h->errstr; or $str = $DBI::errstr or $str = $h->errstr
Restituisce il messaggio di errore del motore di database nativo dall'ultimo metodo DBI chiamato. Questo ha gli stessi problemi di durata del metodo "err" descritto sopra. Questo è equivalente a $ DBI :: errstr o $ h-> errstr.
righe
$rv = $h->rows; or $rv = $DBI::rows
Restituisce il numero di righe influenzate dalla precedente istruzione SQL ed è equivalente a $ DBI :: righe.
traccia
$h->trace($trace_settings);
DBI mette in mostra una capacità estremamente utile di generare informazioni di tracciamento del runtime di ciò che sta facendo, che può essere un enorme risparmio di tempo quando si cerca di rintracciare strani problemi nei programmi DBI. È possibile utilizzare valori diversi per impostare il livello di traccia. Questi valori variano da 0 a 4. Il valore 0 significa disabilitare la traccia e 4 significa generare la traccia completa.
Le dichiarazioni interpolate sono vietate
Si consiglia vivamente di non utilizzare istruzioni interpolate come segue:
while ($first_name = <>) { my $sth = $dbh->prepare("SELECT * FROM TEST_TABLE WHERE FIRST_NAME = '$first_name'");
$sth->execute();
# and so on ...
}
Quindi non usare l'istruzione interpolata invece usa bind value per preparare l'istruzione SQL dinamica.
Cos'è la CGI?
Una Common Gateway Interface, o CGI, è un insieme di standard che definisce il modo in cui le informazioni vengono scambiate tra il server Web e uno script personalizzato.
Le specifiche CGI sono attualmente mantenute dall'NCSA e NCSA definisce CGI come segue:
Common Gateway Interface, o CGI, è uno standard per i programmi gateway esterni per interfacciarsi con i server di informazioni come i server HTTP.
La versione corrente è CGI / 1.1 e CGI / 1.2 è in fase di elaborazione.
Navigare su Internet
Per comprendere il concetto di CGI, vediamo cosa succede quando facciamo clic su un collegamento ipertestuale disponibile su una pagina web per sfogliare una particolare pagina web o URL.
Il browser contatta il server Web utilizzando il protocollo HTTP e richiede l'URL, ovvero il nome del file della pagina Web.
Web Server controllerà l'URL e cercherà il nome del file richiesto. Se il server web trova quel file, invia il file al browser senza alcuna ulteriore esecuzione, altrimenti invia un messaggio di errore che indica che hai richiesto un file sbagliato.
Il browser Web riceve la risposta dal server Web e visualizza il contenuto del file ricevuto o un messaggio di errore nel caso in cui il file non venga trovato.
Tuttavia, è possibile impostare il server HTTP in modo tale che ogni volta che viene richiesto un file in una determinata directory, quel file non viene restituito; invece viene eseguito come un programma, e qualunque cosa quel programma emetta come risultato, viene rimandata indietro per la visualizzazione del browser. Questo può essere fatto utilizzando una funzionalità speciale disponibile nel server web e si chiamaCommon Gateway Interfaceo CGI e tali programmi che vengono eseguiti dal server per produrre il risultato finale, sono chiamati script CGI. Questi programmi CGI possono essere uno script PERL, uno script shell, un programma C o C ++, ecc.
Diagramma di architettura CGI
Supporto e configurazione del server Web
Prima di procedere con la programmazione CGI, assicurati che il tuo server web supporti la funzionalità CGI e che sia configurato per gestire i programmi CGI. Tutti i programmi CGI che devono essere eseguiti dal web server sono conservati in una directory preconfigurata. Questa directory è chiamata directory CGI e per convenzione è chiamata / cgi-bin. Per convenzione i file CGI Perl avranno l'estensione come.cgi.
Primo programma CGI
Ecco un semplice collegamento che è collegato a uno script CGI chiamato hello.cgi . Questo file è stato conservato/cgi-bin/directory e ha il seguente contenuto. Prima di eseguire il programma CGI, assicurati di aver cambiato la modalità di utilizzo del filechmod 755 hello.cgi Comando UNIX.
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
Ora se fai clic su hello.cgi il collegamento quindi la richiesta va al server web che cerca hello.cgi nella directory / cgi-bin, lo esegue e qualunque sia il risultato generato, il server web invia quel risultato al browser web, che è il seguente:
Hello Word! This is my first CGI program
Questo script hello.cgi è un semplice script Perl che scrive il suo output su un file STDOUT, cioè screen. C'è una caratteristica importante ed extra disponibile che è la prima riga da stampareContent-type:text/html\r\n\r\n. Questa riga viene rinviata al browser e specifica il tipo di contenuto da visualizzare nella schermata del browser. Ora devi aver compreso il concetto di base di CGI e puoi scrivere molti programmi CGI complicati usando Perl. Questo script può interagire con qualsiasi altro sistema fisico anche per scambiare informazioni come database, servizi web o altre interfacce complesse.
Comprensione dell'intestazione HTTP
La prima riga Content-type:text/html\r\n\r\nè una parte dell'intestazione HTTP, che viene inviata al browser in modo che il browser possa comprendere il contenuto in arrivo dal lato server. Tutta l'intestazione HTTP avrà la seguente forma:
HTTP Field Name: Field Content
Ad esempio -
Content-type:text/html\r\n\r\n
Ci sono poche altre importanti intestazioni HTTP, che userete frequentemente nella vostra programmazione CGI.
Sr.No. | Intestazione e descrizione |
---|---|
1 | Content-type: String Una stringa MIME che definisce il formato del contenuto restituito. L'esempio è Content-type: text / html |
2 | Expires: Date String La data in cui le informazioni diventano non valide. Questo dovrebbe essere utilizzato dal browser per decidere quando una pagina deve essere aggiornata. Una stringa di data valida deve essere nel formato 01 gen 1998 12:00:00 GMT. |
3 | Location: URL String L'URL che dovrebbe essere restituito al posto dell'URL richiesto. È possibile utilizzare questo file per reindirizzare una richiesta a qualsiasi altra posizione. |
4 | Last-modified: String La data dell'ultima modifica del file. |
5 | Content-length: String La lunghezza, in byte, dei dati restituiti. Il browser utilizza questo valore per segnalare il tempo di download stimato per un file. |
6 | Set-Cookie: String Imposta il cookie passato attraverso la stringa |
Variabili d'ambiente CGI
Tutto il programma CGI avrà accesso alle seguenti variabili d'ambiente. Queste variabili giocano un ruolo importante durante la scrittura di qualsiasi programma CGI.
Sr.No. | Nomi e descrizione delle variabili |
---|---|
1 | CONTENT_TYPE Il tipo di dati del contenuto. Utilizzato quando il client invia il contenuto allegato al server. Ad esempio caricamento di file, ecc. |
2 | CONTENT_LENGTH La lunghezza delle informazioni sulla query. È disponibile solo per le richieste POST |
3 | HTTP_COOKIE Restituisce i cookie impostati sotto forma di coppia chiave e valore. |
4 | HTTP_USER_AGENT Il campo dell'intestazione della richiesta dell'agente utente contiene informazioni sull'agente utente che ha originato la richiesta. Il suo nome del browser web. |
5 | PATH_INFO Il percorso per lo script CGI. |
6 | QUERY_STRING Le informazioni con codifica URL inviate con la richiesta del metodo GET. |
7 | REMOTE_ADDR L'indirizzo IP dell'host remoto che effettua la richiesta. Questo può essere utile per la registrazione o per scopi di autenticazione. |
8 | REMOTE_HOST Il nome completo dell'host che effettua la richiesta. Se queste informazioni non sono disponibili, è possibile utilizzare REMOTE_ADDR per ottenere l'indirizzo IR. |
9 | REQUEST_METHOD Il metodo utilizzato per effettuare la richiesta. I metodi più comuni sono GET e POST. |
10 | SCRIPT_FILENAME Il percorso completo dello script CGI. |
11 | SCRIPT_NAME Il nome dello script CGI. |
12 | SERVER_NAME Il nome host o l'indirizzo IP del server. |
13 | SERVER_SOFTWARE Il nome e la versione del software in esecuzione sul server. |
Ecco un piccolo programma CGI per elencare tutte le variabili CGI supportate dal tuo server web. Fare clic su questo collegamento per visualizzare il risultato Ottieni ambiente
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
Sollevare una finestra di dialogo "Download file"?
A volte si desidera dare un'opzione in cui un utente farà clic su un collegamento e verrà visualizzata una finestra di dialogo "Download file" per l'utente invece di visualizzare il contenuto effettivo. Questo è molto semplice e verrà ottenuto tramite l'intestazione HTTP.
Questa intestazione HTTP sarà diversa dall'intestazione menzionata nella sezione precedente. Ad esempio, se vuoi creare un fileFileName file scaricabile da un determinato collegamento, la sua sintassi sarà la seguente:
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) { print("$buffer");
}
Metodi GET e POST
Devi esserti imbattuto in molte situazioni in cui hai bisogno di passare alcune informazioni dal tuo browser al server web e infine al tuo programma CGI che gestisce le tue richieste. Il più delle volte il browser utilizza due metodi per passare queste informazioni al server web. Questi metodi sonoGET Metodo e POSTMetodo. Controlliamoli uno per uno.
Passaggio di informazioni utilizzando il metodo GET
Il metodo GET invia le informazioni utente codificate aggiunte all'URL della pagina stessa. La pagina e le informazioni codificate sono separate dal? carattere come segue -
http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
Il metodo GET è il metodo predefinito per passare le informazioni da un browser al server web e produce una lunga stringa che appare nella casella Posizione: del browser. Non utilizzare mai il metodo GET se si dispone di password o altre informazioni sensibili da passare al server. Il metodo GET ha limiti di dimensione: possono essere passati solo 1024 caratteri in una stringa di richiesta.
Queste informazioni vengono passate utilizzando QUERY_STRING intestazione e sarà accessibile nel tuo programma CGI tramite la variabile d'ambiente QUERY_STRING che puoi analizzare e utilizzare nel tuo programma CGI.
Puoi passare le informazioni semplicemente concatenando coppie di chiavi e valori insieme a qualsiasi URL oppure puoi utilizzare i tag HTML <FORM> per passare le informazioni utilizzando il metodo GET.
Esempio di URL semplice: metodo Get
Ecco un semplice URL che passerà due valori al programma hello_get.cgi utilizzando il metodo GET.
http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALISotto è hello_get.cgi script per gestire l'input fornito dal browser web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } $first_name = $FORM{first_name}; $last_name = $FORM{last_name}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Hello - Second CGI Program</title>"; print "</head>"; print "<body>"; print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Esempio di FORM semplice: metodo GET
Ecco un semplice esempio, che trasmette due valori utilizzando HTML FORM e il pulsante di invio. Useremo lo stesso script CGI hello_get.cgi per gestire questo input.
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Ecco l'output effettivo della codifica del modulo sopra. Ora puoi inserire Nome e Cognome e quindi fare clic sul pulsante Invia per vedere il risultato.
Passaggio di informazioni utilizzando il metodo POST
Un metodo più affidabile per passare informazioni a un programma CGI è il POSTmetodo. Questo impacchetta le informazioni esattamente allo stesso modo dei metodi GET, ma invece di inviarle come stringa di testo dopo un file?nell'URL, lo invia come messaggio separato come parte dell'intestazione HTTP. Il server Web fornisce questo messaggio allo script CGI sotto forma di input standard.
Di seguito è il modificato hello_post.cgiscript per gestire l'input fornito dal browser web. Questo script gestirà GET e il metodo POST.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Riprendiamo lo stesso esempio di cui sopra, che trasmette due valori utilizzando HTML FORM e il pulsante di invio. Useremo lo script CGI hello_post.cgi per gestire questo input.
<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Ecco l'output effettivo della codifica del modulo sopra, inserisci Nome e Cognome e quindi fai clic sul pulsante Invia per vedere il risultato.
Passaggio dei dati della casella di controllo al programma CGI
Le caselle di controllo vengono utilizzate quando è necessario selezionare più di un'opzione. Ecco un esempio di codice HTML per un modulo con due caselle di controllo.
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
Il risultato di questo codice è il seguente modulo:
Sotto è checkbox.cgi script per gestire l'input fornito dal browser web per il pulsante di opzione.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } if( $FORM{maths} ) {
$maths_flag ="ON"; } else { $maths_flag ="OFF";
}
if( $FORM{physics} ) { $physics_flag ="ON";
} else {
$physics_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Checkbox - Third CGI Program</title>"; print "</head>"; print "<body>"; print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
Passaggio dei dati del pulsante di opzione al programma CGI
I pulsanti di opzione vengono utilizzati quando è necessario selezionare una sola opzione. Ecco un esempio di codice HTML per un modulo con due pulsanti di opzione:
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
Il risultato di questo codice è il seguente modulo:
Sotto è radiobutton.cgi script per gestire l'input fornito dal browser web per il pulsante di opzione.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Passaggio dei dati dell'area di testo al programma CGI
Un elemento textarea viene utilizzato quando il testo multilinea deve essere passato al programma CGI. Ecco un esempio di codice HTML per un modulo con una casella TEXTAREA -
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
Il risultato di questo codice è il seguente modulo:
Di seguito è riportato il file textarea.cgi script per gestire l'input fornito dal browser web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
Passaggio dei dati della casella a discesa al programma CGI
Una casella a discesa viene utilizzata quando abbiamo molte opzioni disponibili ma ne verranno selezionate solo una o due. Ecco un esempio di codice HTML per un modulo con una casella a discesa
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
Il risultato di questo codice è il seguente modulo:
Di seguito è riportato il file dropdown.cgi script per gestire l'input fornito dal browser web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Utilizzo dei cookie in CGI
Il protocollo HTTP è un protocollo senza stato. Ma per un sito web commerciale è necessario mantenere le informazioni sulla sessione tra pagine diverse. Ad esempio, la registrazione di un utente termina dopo transazioni che si estendono su molte pagine. Ma come mantenere le informazioni sulla sessione dell'utente in tutte le pagine web?
In molte situazioni, l'utilizzo dei cookie è il metodo più efficiente per ricordare e tracciare preferenze, acquisti, commissioni e altre informazioni necessarie per una migliore esperienza dei visitatori o statistiche del sito.
Come funziona
Il tuo server invia alcuni dati al browser del visitatore sotto forma di cookie. Il browser può accettare il cookie. In caso affermativo, viene archiviato come record di testo normale sul disco rigido del visitatore. Ora, quando il visitatore arriva a un'altra pagina del tuo sito, il cookie è disponibile per il recupero. Una volta recuperato, il tuo server sa / ricorda cosa è stato memorizzato.
I cookie sono un record di dati di testo semplice di 5 campi di lunghezza variabile -
Expires- La data in cui scadrà il cookie. Se questo è vuoto, il cookie scadrà quando il visitatore chiude il browser.
Domain - Il nome di dominio del tuo sito.
Path- Il percorso della directory o della pagina web che ha impostato il cookie. Questo può essere vuoto se desideri recuperare il cookie da qualsiasi directory o pagina.
Secure- Se questo campo contiene la parola "secure", il cookie può essere recuperato solo con un server sicuro. Se questo campo è vuoto, non esiste alcuna restrizione di questo tipo.
Name = Value - I cookie vengono impostati e riesaminati sotto forma di coppie chiave e valore.
Configurazione dei cookie
È molto semplice inviare cookie al browser. Questi cookie verranno inviati insieme all'intestazione HTTP. Supponendo che si desideri impostare UserID e Password come cookie. Quindi sarà fatto come segue:
#!/usr/bin/perl
print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....
Qui abbiamo usato Set-CookieIntestazione HTTP per impostare i cookie. È facoltativo impostare gli attributi dei cookie come Expires, Domain e Path. È importante notare che i cookie vengono impostati prima dell'invio di magic line"Content-type:text/html\r\n\r\n.
Recupero dei cookie
È molto facile recuperare tutti i cookie impostati. I cookie sono memorizzati nella variabile d'ambiente CGI HTTP_COOKIE e avranno la seguente forma.
key1 = value1;key2 = value2;key3 = value3....
Ecco un esempio di come recuperare i cookie.
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) { ($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//; $val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) { $user_id = $val; } elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n"; print "Password = $password\n";
Ciò produrrà il seguente risultato, a condizione che i cookie sopra siano stati impostati prima di chiamare lo script di recupero dei cookie.
User ID = XYZ
Password = XYZ123
Moduli e librerie CGI
Troverai molti moduli incorporati su Internet che ti forniscono funzioni dirette da usare nel tuo programma CGI. Di seguito sono riportati gli importanti una volta.
Modulo CGI
Berkeley cgi-lib.pl
Cosa sono i pacchetti?
Il packageL'istruzione cambia il contesto dei nomi corrente in uno spazio dei nomi specificato (tabella dei simboli). Quindi -
Un pacchetto è una raccolta di codice che risiede nel proprio spazio dei nomi.
Uno spazio dei nomi è una raccolta denominata di nomi di variabili univoci (chiamata anche tabella dei simboli).
Gli spazi dei nomi prevengono i conflitti di nomi di variabili tra i pacchetti.
I pacchetti consentono la costruzione di moduli che, se usati, non sovrascriveranno variabili e funzioni al di fuori dello spazio dei nomi dei moduli.
Il pacchetto rimane in vigore finché non viene richiamata un'altra istruzione del pacchetto o fino alla fine del blocco o del file corrente.
È possibile fare riferimento esplicito alle variabili all'interno di un pacchetto utilizzando il :: qualificatore del pacchetto.
Di seguito è riportato un esempio con i pacchetti main e Foo in un file. Qui è stata usata la variabile speciale __PACKAGE__ per stampare il nome del pacchetto.
#!/usr/bin/perl
# This is main package
$i = 1; print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10; print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100; print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
Quando viene eseguito il codice sopra, produce il seguente risultato:
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
Blocchi BEGIN e END
È possibile definire un numero qualsiasi di blocchi di codice denominati BEGIN e END, che agiscono rispettivamente come costruttori e distruttori.
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
Ogni BEGIN block viene eseguito dopo che lo script perl è stato caricato e compilato ma prima che venga eseguita qualsiasi altra istruzione.
Ogni blocco END viene eseguito appena prima che l'interprete perl esca.
I blocchi BEGIN e END sono particolarmente utili quando si creano moduli Perl.
L'esempio seguente mostra il suo utilizzo:
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
Quando viene eseguito il codice sopra, produce il seguente risultato:
This is BEGIN Block
Begin and Block Demo
This is END Block
Cosa sono i moduli Perl?
Un modulo Perl è un pacchetto riutilizzabile definito in un file di libreria il cui nome è uguale al nome del pacchetto con estensione .pm.
Un file di modulo Perl chiamato Foo.pm potrebbe contenere affermazioni come questa.
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
Pochi punti importanti sui moduli Perl
Le funzioni require e use caricherà un modulo.
Entrambi usano l'elenco dei percorsi di ricerca in @INC per trovare il modulo.
Entrambe le funzioni require e use chiama il eval funzione per elaborare il codice.
Il 1; in fondo fa sì che eval restituisca TRUE (e quindi non fallisca).
La funzione Richiedi
Un modulo può essere caricato chiamando il file require funzionare come segue -
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
Avrai notato che i nomi delle subroutine devono essere pienamente qualificati per chiamarli. Sarebbe bello abilitare la subroutinebar e blat da importare nel nostro spazio dei nomi in modo da non dover usare il qualificatore Foo ::.
La funzione Use
Un modulo può essere caricato chiamando il file use funzione.
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
Si noti che non è stato necessario qualificare completamente i nomi delle funzioni del pacchetto. Iluse funzione esporterà un elenco di simboli da un modulo dato alcune istruzioni aggiunte all'interno di un modulo.
require Exporter;
@ISA = qw(Exporter);
Quindi, fornire un elenco di simboli (scalari, elenchi, hash, subroutine, ecc.) Compilando la variabile di elenco denominata @EXPORT: Ad esempio -
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" } # Not exported!
1;
Crea l'albero dei moduli Perl
Quando sei pronto per spedire il tuo modulo Perl, esiste un modo standard per creare un albero del modulo Perl. Questo viene fatto usandoh2xsutilità. Questa utility viene fornita con Perl. Ecco la sintassi per usare h2xs -
$h2xs -AX -n ModuleName
Ad esempio, se il tuo modulo è disponibile in Person.pm file, quindi emetti semplicemente il seguente comando:
$h2xs -AX -n Person
Questo produrrà il seguente risultato:
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
Ecco la descrizione di queste opzioni:
-A omette il codice del caricatore automatico (utilizzato al meglio dai moduli che definiscono un gran numero di subroutine usate di rado).
-X omette gli elementi XS (eXternal Subroutine, dove eXternal significa esterno a Perl, cioè C).
-n specifica il nome del modulo.
Quindi il comando sopra crea la seguente struttura all'interno della directory Person. Il risultato effettivo è mostrato sopra.
- Changes
- Makefile.PL
- MANIFEST (contiene l'elenco di tutti i file nel pacchetto)
- README
- t / (file di prova)
- lib / (Il codice sorgente effettivo va qui
Quindi finalmente tu tarquesta struttura di directory in un file Person.tar.gz e puoi inviarlo. Dovrai aggiornare il file README con le istruzioni appropriate. Puoi anche fornire alcuni file di esempi di test nella directory t.
Installazione del modulo Perl
Scarica un modulo Perl nel file tar.gz. Utilizzare la seguente sequenza per installare qualsiasi modulo PerlPerson.pm che è stato scaricato in formato Person.tar.gz file.
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
L'interprete Perl ha un elenco di directory in cui cerca i moduli (array globale @INC).
È possibile utilizzare Perl in vari modi per creare nuovi processi secondo le proprie esigenze. Questo tutorial elencherà alcuni metodi importanti e usati più di frequente per creare e gestire processi Perl.
Puoi usare variabili speciali $$ o $PROCESS_ID per ottenere l'ID del processo corrente.
Ogni processo creato utilizzando uno dei metodi menzionati, mantiene il proprio ambiente virtuale all'interno %ENV variabile.
Il exit() funzione esce sempre solo dal processo figlio che esegue questa funzione e il processo principale nel suo insieme non uscirà a meno che tutti i processi figlio in esecuzione non siano terminati.
Tutti gli handle aperti sono dup () - ed nei processi figlio, in modo che la chiusura di qualsiasi handle in un processo non influisca sugli altri.
Operatore Backstick
Questo modo più semplice di eseguire qualsiasi comando Unix è usare l'operatore backstick. Metti semplicemente il tuo comando all'interno dell'operatore backstick, che comporterà l'esecuzione del comando e restituirà il suo risultato che può essere memorizzato come segue:
#!/usr/bin/perl
@files = `ls -l`;
foreach $file (@files) { print $file;
}
1;
Quando il codice sopra viene eseguito, elenca tutti i file e le directory disponibili nella directory corrente -
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
La funzione system ()
Puoi anche usare system()funzione per eseguire qualsiasi comando Unix, il cui output andrà all'output dello script perl. Per impostazione predefinita, è lo schermo, cioè STDOUT, ma puoi reindirizzarlo a qualsiasi file utilizzando l'operatore di reindirizzamento> -
#!/usr/bin/perl
system( "ls -l")
1;
Quando viene eseguito il codice sopra, elenca tutti i file e le directory disponibili nella directory corrente -
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
Fai attenzione quando il tuo comando contiene variabili ambientali di shell come $PATH or $CASA. Prova a seguire tre scenari:
#!/usr/bin/perl
$PATH = "I am Perl Variable"; system('echo $PATH'); # Treats $PATH as shell variable system("echo $PATH"); # Treats $PATH as Perl variable system("echo \$PATH"); # Escaping $ works.
1;
Quando viene eseguito il codice precedente, produce il seguente risultato a seconda di cosa è impostato nella variabile di shell $ PATH.
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
La funzione fork ()
Perl fornisce un file fork()funzione che corrisponde alla chiamata di sistema Unix con lo stesso nome. Sulla maggior parte delle piattaforme Unix in cui è disponibile la chiamata di sistema fork (), fork () di Perl la chiama semplicemente. Su alcune piattaforme come Windows dove la chiamata di sistema fork () non è disponibile, Perl può essere costruito per emulare fork () a livello di interprete.
La funzione fork () viene utilizzata per clonare un processo corrente. Questa chiamata crea un nuovo processo che esegue lo stesso programma nello stesso punto. Restituisce il pid figlio al processo padre, 0 al processo figlio o undef se il fork non ha successo.
Puoi usare exec() all'interno di un processo per avviare l'eseguibile richiesto, che verrà eseguito in un'area del processo separata ed exec () attenderà il completamento prima di uscire con lo stesso stato di uscita di quel processo.
#!/usr/bin/perl
if(!defined($pid = fork())) { # fork returned undef, so unsuccessful die "Cannot fork a child: $!";
} elsif ($pid == 0) { print "Printed by child process\n"; exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
Quando viene eseguito il codice sopra, produce il seguente risultato:
Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777
Il wait() e waitpid()può essere passato come ID pseudo-processo restituito da fork (). Queste chiamate attenderanno correttamente la fine dello pseudo-processo e restituiranno il suo stato. Se forzi senza mai aspettare che i tuoi figli usinowaitpid()funzione, accumulerai zombi. Sui sistemi Unix, puoi evitarlo impostando $ SIG {CHLD} su "IGNORE" come segue:
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!"; } elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!"; } else { # fork returned 0 nor undef # so this branch is parent print "Printed by parent process\n"; $ret = waitpid($pid, 0); print "Completed process id: $ret\n";
}
1;
Quando viene eseguito il codice sopra, produce il seguente risultato:
Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1
La funzione kill ()
Perl kill('KILL', (Process List)) può essere usata per terminare uno pseudo-processo passandogli l'ID restituito da fork ().
Notare che l'utilizzo di kill ('KILL', (Process List)) su uno pseudo-processo () può in genere causare perdite di memoria, perché il thread che implementa lo pseudo-processo non ha la possibilità di ripulire le sue risorse.
Puoi usare kill() funzione per inviare qualsiasi altro segnale ai processi di destinazione, ad esempio il seguente invierà SIGINT a un processo ID 104 e 102 -
#!/usr/bin/perl
kill('INT', 104, 102);
1;
Puoi incorporare la documentazione Pod (Plain Old Text) nei tuoi moduli e script Perl. Di seguito è riportata la regola per utilizzare la documentazione incorporata nel codice Perl:
Inizia la tua documentazione con una riga vuota, a =head1 comando all'inizio e terminarlo con un =cut
Perl ignorerà il testo del pod che hai inserito nel codice. Di seguito è riportato un semplice esempio di utilizzo della documentazione incorporata nel codice Perl:
#!/usr/bin/perl
print "Hello, World\n";
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
=cut
print "Hello, Universe\n";
Quando viene eseguito il codice sopra, produce il seguente risultato:
Hello, World
Hello, Universe
Se hai intenzione di mettere il tuo Pod alla fine del file e stai usando un segno di taglio __END__ o __DATA__, assicurati di mettere una riga vuota lì prima del primo comando Pod come segue, altrimenti senza una riga vuota prima il =head1, molti traduttori non avrebbero riconosciuto il =head1 come avviare un blocco pod.
#!/usr/bin/perl
print "Hello, World\n";
while(<DATA>) {
print $_;
}
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
Quando viene eseguito il codice sopra, produce il seguente risultato:
Hello, World
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
Facciamo un altro esempio per lo stesso codice senza leggere la parte DATA -
#!/usr/bin/perl
print "Hello, World\n";
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
Quando viene eseguito il codice sopra, produce il seguente risultato:
Hello, World
Cos'è il POD?
Pod è un linguaggio di markup semplice da usare utilizzato per scrivere documentazione per Perl, programmi Perl e moduli Perl. Sono disponibili vari traduttori per convertire Pod in vari formati come testo normale, HTML, pagine man e altro. Il markup del pod è costituito da tre tipi fondamentali di paragrafi:
Ordinary Paragraph - È possibile utilizzare codici di formattazione in paragrafi ordinari, per grassetto, corsivo, stile codice, collegamenti ipertestuali e altro.
Verbatim Paragraph - I paragrafi Verbatim vengono solitamente utilizzati per presentare un blocco di codice o altro testo che non richiede alcuna analisi o formattazione speciale e che non deve essere avvolto.
Command Paragraph- Un paragrafo di comando viene utilizzato per il trattamento speciale di intere porzioni di testo, solitamente come intestazioni o parti di elenchi. Tutti i paragrafi del comando iniziano con =, seguito da un identificatore, seguito da testo arbitrario che il comando può utilizzare come preferisce. I comandi attualmente riconosciuti sono:
=pod
=head1 Heading Text
=head2 Heading Text
=head3 Heading Text
=head4 Heading Text
=over indentlevel
=item stuff
=back
=begin format
=end format
=for format text...
=encoding type
=cut
Esempi di POD
Considera il seguente POD:
=head1 SYNOPSIS
Copyright 2005 [TUTORIALSOPOINT].
=cut
Puoi usare pod2html utility disponibile su Linux per convertire sopra POD in HTML, quindi produrrà il seguente risultato:
Quindi, considera il seguente esempio:
=head2 An Example List
=over 4
=item * This is a bulleted list.
=item * Here's another item.
=back
=begin html
<p>
Here's some embedded HTML. In this block I can
include images, apply <span style="color: green">
styles</span>, or do anything else I can do with
HTML. pod parsers that aren't outputting HTML will
completely ignore it.
</p>
=end html
Quando converti il POD sopra in HTML usando pod2html, produrrà il seguente risultato:
An Example List
This is a bulleted list.
Here's another item.
Here's some embedded HTML. In this block I can include images, apply
styles, or do anything else I can do with HTML. pod parsers that aren't
outputting HTML will completely ignore it.
Ecco l'elenco di tutte le funzioni importanti supportate dal Perl standard.
abs - funzione valore assoluto
accetta - accetta una connessione socket in entrata
allarme - programma un SIGALRM
atan2 - arcotangente di Y / X nell'intervallo da -PI a PI
bind : associa un indirizzo a un socket
binmode - prepara i file binari per I / O
benedica : crea un oggetto
caller - ottiene il contesto della chiamata della subroutine corrente
chdir - cambia la tua directory di lavoro corrente
chmod : modifica le autorizzazioni su un elenco di file
chomp - rimuove un separatore di record finale da una stringa
chop - rimuove l'ultimo carattere da una stringa
chown - cambia la nave in un elenco di file
chr - ottieni il carattere rappresentato da questo numero
chroot - crea una nuova directory root per le ricerche di percorso
close - chiude l'handle del file (o pipe o socket)
closedir - chiude l'handle della directory
connect - connettersi a una presa remota
continue - blocco finale opzionale tra un po 'o foreach
cos - funzione coseno
crypt - crittografia unidirezionale in stile passwd
dbmclose - interrompe il binding su un file dbm legato
dbmopen : crea l'associazione su un file dbm legato
definito : verifica se un valore, una variabile o una funzione è definito o meno
elimina : elimina un valore da un hash
muori - solleva un'eccezione o salva
fare - trasformare un BLOCCO in un TERMINE
dump : crea un core dump immediato
each - recupera la successiva coppia chiave / valore da un hash
endgrent - essere fatto usando il file di gruppo
endhostent - essere fatto usando il file hosts
endnetent - essere fatto utilizzando il file di rete
endprotoent - essere fatto utilizzando il file dei protocolli
endpwent - essere fatto usando il file passwd
endservent - essere eseguito utilizzando il file dei servizi
eof - verifica la fine di un filehandle
eval - cattura le eccezioni o compila ed esegui il codice
exec - abbandona questo programma per eseguirne un altro
esiste : verifica se è presente una chiave hash
exit - termina questo programma
exp - alza I
a un potere fcntl - chiamata di sistema di controllo file
fileno - restituisce il descrittore di file dal filehandle
flock - blocca un intero file con un blocco consultivo
fork : crea un nuovo processo proprio come questo
format - dichiara un formato immagine con l'uso dalla funzione write ()
formline - funzione interna utilizzata per i formati
getc - ottiene il carattere successivo dal filehandle
getgrent : ottieni il record del gruppo successivo
getgrgid - ottiene il record del gruppo dato l'ID utente del gruppo
getgrnam - ottiene il record del gruppo dato il nome del gruppo
gethostbyaddr - ottiene il record dell'host dato il suo indirizzo
gethostbyname - ottiene il nome dato dal record host
gethostent : ottieni il record del prossimo host
getlogin - restituisci chi ha effettuato l'accesso a questa tty
getnetbyaddr - ottiene il record di rete dato il suo indirizzo
getnetbyname - ottiene il nome dato dal record di rete
getnetent : ottieni il record successivo della rete
getpeername - trova l'altra estremità di una connessione socket
getpgrp - ottieni il gruppo di processi
getppid : ottieni l'ID del processo genitore
getpriority : ottieni il valore attuale
getprotobyname - ottiene il nome dato dal record del protocollo
getprotobynumber - ottiene il protocollo numerico del record del protocollo
getprotoent - ottiene il record dei protocolli successivi
getpwent - ottiene il record successivo di passwd
getpwnam - ottiene il record passwd dato il nome di accesso dell'utente
getpwuid - ottiene il record passwd dato l'ID utente
getservbyname - ottiene il record dei servizi dato il suo nome
getservbyport - ottiene il record dei servizi data la porta numerica
getservent - ottiene il record dei servizi successivi
getsockname - recupera il sockaddr per un dato socket
getsockopt - ottiene le opzioni del socket su un dato socket
glob - espande i nomi dei file utilizzando i caratteri jolly
gmtime : converte l'ora UNIX in record o stringa utilizzando il formato dell'ora di Greenwich.
goto - crea codice per spaghetti
grep - individua gli elementi in una lista verifica vero rispetto a un dato criterio
hex : converte una stringa in un numero esadecimale
import : applica lo spazio dei nomi di un modulo al tuo
index : trova una sottostringa all'interno di una stringa
int - ottiene la parte intera di un numero
ioctl - chiamata di sistema di controllo del dispositivo dipendente dal sistema
join : unisce un elenco in una stringa utilizzando un separatore
chiavi : recupera l'elenco degli indici da un hash
kill - invia un segnale a un processo o gruppo di processi
ultimo - esci prematuramente da un blocco
lc - restituisce la versione minuscola di una stringa
lcfirst - restituisce una stringa con solo la lettera successiva in minuscolo
length - restituisce il numero di byte in una stringa
link - crea un hard link nel filesytem
ascolta : registra il tuo socket come server
locale : crea un valore temporaneo per una variabile globale (ambito dinamico)
localtime - converte l'ora UNIX in record o stringa utilizzando l'ora locale
lock : consente di ottenere un thread lock su una variabile, una subroutine o un metodo
log : recupera il logaritmo naturale di un numero
lstat - stat un collegamento simbolico
m - corrisponde a una stringa con un modello di espressione regolare
mappa : applica una modifica a un elenco per ottenere un nuovo elenco con le modifiche
mkdir : crea una directory
msgctl - Operazioni di controllo dei messaggi IPC SysV
msgget : ottieni la coda dei messaggi IPC di SysV
msgrcv - riceve un messaggio IPC SysV da una coda messaggi
msgsnd - invia un messaggio IPC SysV a una coda di messaggi
my - dichiara e assegna una variabile locale (ambito lessicale)
next - itera un blocco prematuramente
no - annulla l'importazione di alcuni simboli di modulo o semantica in fase di compilazione
ott - converte una stringa in un numero ottale
open : apre un file, pipe o descrittore
opendir - apre una directory
ord : trova la rappresentazione numerica di un carattere
our - dichiara e assegna una variabile del pacchetto (ambito lessicale)
pack - converte un elenco in una rappresentazione binaria
pacchetto : dichiara uno spazio dei nomi globale separato
pipe - apre un paio di filehandle collegati
pop - rimuove l'ultimo elemento da un array e lo restituisce
pos - trova o imposta l'offset per l'ultima / successiva ricerca m // g
print - emette un elenco in un filehandle
printf - emette un elenco formattato in un filehandle
prototype : ottieni il prototipo (se presente) di una subroutine
push - aggiunge uno o più elementi a un array
q - cita singolarmente una stringa
qq - cita doppiamente una stringa
qr - Compila pattern
quotemeta - cita caratteri magici di espressioni regolari
qw - cita un elenco di parole
qx - apice inverso cita una stringa
rand - recupera il numero pseudocasuale successivo
read - input bufferizzato a lunghezza fissa da un filehandle
readdir - ottiene una directory da un handle di directory
readline - recupera un record da un file
readlink - determina dove punta un link simbolico
readpipe - esegue un comando di sistema e raccoglie l'output standard
recv - riceve un messaggio su un Socket
redo - avvia di nuovo questa iterazione del ciclo
ref : scopri il tipo di oggetto a cui si fa riferimento
rinomina - cambia il nome di un file
require - carica le funzioni esterne da una libreria in fase di runtime
reset - cancella tutte le variabili di un dato nome
return - esci presto da una funzione
reverse - capovolge una stringa o un elenco
rewinddir - reimposta l'handle della directory
rindex - ricerca di sottostringhe da destra a sinistra
rmdir - rimuove una directory
s - sostituisci un pattern con una stringa
scalare : forza un contesto scalare
seek - riposiziona il puntatore al file per I / O ad accesso casuale
seekdir - riposiziona il puntatore alla directory
seleziona - ripristina l'uscita predefinita o effettua il multiplexing degli I / O
semctl - operazioni di controllo del semaforo SysV
semget - ottiene l'insieme dei semafori SysV
semop - operazioni sul semaforo di SysV
send - invia un messaggio tramite un socket
setgrent - prepara il file di gruppo per l'uso
sethostent - prepara il file hosts per l'uso
setnetent - prepara il file di rete per l'uso
setpgrp - imposta il gruppo di processi di un processo
setpriority - imposta il valore corretto di un processo
setprotoent - prepara il file dei protocolli per l'uso
setpwent - prepara il file passwd per l'uso
setservent - prepara il file dei servizi per l'uso
setsockopt - imposta alcune opzioni del socket
shift : rimuove il primo elemento di un array e lo restituisce
shmctl - operazioni di memoria condivisa SysV
shmget - ottiene l'identificatore del segmento di memoria condivisa SysV
shmread - legge la memoria condivisa di SysV
shmwrite - scrive la memoria condivisa SysV
shutdown - chiude solo la metà di una connessione socket
sin - restituisce il seno di un numero
sleep - blocca per un certo numero di secondi
socket : crea un socket
socketpair : crea una coppia di socket
sort - ordina un elenco di valori
splice : aggiungi o rimuovi elementi ovunque in un array
split - divide una stringa usando un delimitatore regexp
sprintf - stampa formattata in una stringa
sqrt - funzione radice quadrata
srand - seed il generatore di numeri casuali
stat - ottiene le informazioni sullo stato di un file
studio : ottimizza i dati di input per ricerche ripetute
sub - dichiara una subroutine, possibilmente anonima
substr - ottiene o altera una porzione di un mescolamento
collegamento simbolico : crea un collegamento simbolico a un file
syscall - esegue una chiamata di sistema arbitraria
sysopen : apre un file, pipe o descrittore
sysread - input senza buffer di lunghezza fissa da un filehandle
sysseek - posiziona il puntatore I / O sull'handle usato con sysread e syswrite
sistema - esegui un programma separato
syswrite - output non bufferizzato a lunghezza fissa in un filehandle
tell - ottiene il seekpointer corrente su un filehandle
telldir - ottiene il seekpointer corrente su un handle di directory
tie - lega una variabile a una classe di oggetti
legato - ottiene un riferimento all'oggetto sottostante una variabile legata
time - restituisce il numero di secondi dal 1970
volte - restituisce il tempo trascorso per i processi personali e figli
tr - traslittera una stringa
truncate - accorcia un file
uc - restituisce la versione in maiuscolo di una stringa
ucfirst - restituisce una stringa con solo la lettera successiva in maiuscolo
umask - imposta la maschera della modalità di creazione del file
undef - rimuove una definizione di variabile o funzione
scollega : rimuove un collegamento a un file
unpack - converte la struttura binaria in normali variabili Perl
unshift : antepone più elementi all'inizio di un elenco
untie - interrompe un legame vincolante a una variabile
use - carica un modulo in fase di compilazione
utime - imposta l'ultimo accesso di un file e modifica i tempi
valori : restituisce un elenco dei valori in un hash
vec - verifica o imposta particolari bit in una stringa
aspetta - aspetta che muoia qualsiasi processo figlio
waitpid - aspetta che un particolare processo figlio muoia
wantarray - ottiene il contesto void vs scalare vs elenco della chiamata di subroutine corrente
warn - stampa le informazioni di debug
scrivi : stampa una registrazione dell'immagine
-X - un file di test (-r, -x, ecc.)
y - traslittera una stringa