Variabili scalari ed operatori

Da Hacknowledge.

Indice

[modifica] Hello world

Il primo script che scriviamo in Perl è il classico "Hello world". Osservate che non serve dichiarare una funzione principale.

#!/usr/bin/perl
print "Hello world\n";

Questo script stampa a schermo "Hello world" seguito dal carattere speciale (o sequenza di escape) di newline \n che provoca il ritorno a capo. Per riuscire ad eseguire uno script Perl bisogna seguire i passi seguenti:

  1. Aprire un editore di testi (ad es. Vim).
  2. Digitare il codice sorgente.
  3. Salvare il file, con estensione .pl se si lavora in ambiente Windows, o con un nome qualsiasi se si lavora in ambiente Unix (NOTA: Gnix usa l'estensione .pl anche in ambiente Unix).
  4. Eseguire lo script.

Vediamo come fare in questo caso, supponendo di lavorare sotto Linux. Apriamo il nostro editore di testi.

vim script_perl.pl

Digitiamo il codice sorgente visto in precedenza e usciamo salvando (premere ESC e quindi digitare :wq prima di premere RETURN). Per eseguire il nostro script, basta passarlo all'interprete, digitando:

perl script_perl.pl

In questo caso l'output sarà quello atteso. Esiste tuttavia un'alternativa se si è in ambiente Unix, ossia si può decidere di rendere lo script eseguibile utilizzando:

chmod +x script_perl.pl

In questo modo lo script può essere eseguito digitando:

./script_perl.pl

Il lettore più attento potrebbe chiedersi, come sia possibile eseguire un file di testo? In realtà è l'ambiente Unix (nel nostro caso Linux) che legge l'istruzione commentata

#!/usr/bin/perl

e la interpreta; in modo tale che possa sapere a chi passare lo script. In questo caso il file eseguibile a cui sarà passato lo script è perl, che si trova nella directory /usr/bin. Se per un qualche motivo non dovesse trovarsi li, dovreste modificare la prima riga con il path corretto, affinché l'esecuzioni funzioni correttamente.

NOTA: Per sapere dove si trova l'interprete Perl usare il comando whereis. Esempio:
      [gnix@localhost ~]$ whereis perl
      perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz

In un linguaggio di scripting può essere difficile scovare errori o dimenticanze, per questo motivo è consigliato richiamare l'interprete con l'opzione "-w" (Warning). Vediamo un esempio:

perl -w script_perl.pl

eventualmente se si lavora in ambiente Unix si può inserire l'opzione direttamente all'interno dello script.

#!/usr/bin/perl -w
print "Hello world\n";

Per informazioni più dettagliate sulle opzioni, consultare il capitolo sull'Interprete Perl.


[modifica] Variabili scalari

Consideriamo ora uno script che estende il precedente "Hello world" introducendo alcuni nuovi concetti.

#!/usr/bin/perl -w
#
# 2_1_nuovi_concetti.pl
# 
# by Gnix <gnixmail@gmail.com>
# http://gnix.netsons.org
# 
# Questo script prende il classico "Hello world" e lo rielabora 
# introducendo nuovi concetti.
 
# Variabili
$sentence = 'Hello world';
$length   = 11;
 
print "'$sentence' ha $length caratteri.\n";

L'esecuzione di questo script provoca il seguente output:

[gnix@localhost variabili_scalari_ed_operatori]$ perl 2_1_nuovi_concetti.pl 
'Hello world' ha 11 caratteri.

Andiamo ora a studiare le aggiunte fatte. Fin dai primi linguaggi di programmazione è stato introdotto il concetto di variabile. Le variabili sono locazioni di memoria a cui ci si riferisce con un nome ($sentence e $length nell'esempio 2.1). Attraverso il nome associato alla variabile si può settare il contenuto della locazione di memoria, come fatto nelle prime due istruzioni:

# Variabili
$sentence = 'Hello world';
$length   = 11;

Oppure si può accedere al valore contenuto, come fatto nell'ultima istruzione:

print "'$sentence' ha $length caratteri.\n";

Il Perl a differenza di altri linguaggi che assegnano ad ogni variabile un tipo, come ad esempio intero o virgola mobile, distingue le variabile tra singolari e plurali. Una variabile scalare può contenere un solo valore, che può essere: numerico, carattere o stringa. Al contrario variabili come array o hash possono contenere una lista di valori, tuttavia saranno studiati nei capitoli successivi. Una variabile scalare deve iniziare con il simbolo $ (che ricorda la S di scalare) e deve avere un nome composto da lettere,numeri,_ e ' lungo al massimo 256 caratteri.

ATTENZIONE: Perl è case sensitive, pertanto $Gnix e $gnix sono due variabili distinte.

Vediamo alcuni esempi di variabili scalare:

$pi       = 3.14159;                  # numero reale
$num      = 7.5e12;                   # notazione scientifica
$name     = "Newton";                 # stringa
$sentence = "Adoro il cane $name\n";  # stringa con interpolazione
$costly   = 'Il pc costa $2500';      # stringa senza interpolazione
$cwd      = `pwd`;                    # output di un comando
$exit     = system("emacs $name");    # stato numerico di un comando
$cat      = new Cat "mao"             # creazione di un oggetto

Come si vede esistono diversi tipi di apici (quotes):

  • Double quotes: effettuano la cosiddetta interpolazione (sostituzione) delle variabili e l'interpetazione dei caratteri di escape (caratteri con backslash).
  • Single quotes: elimina sia l'interpolazione che l'interpretazione.
  • Backquotes: esegue un comando esterno e restituisce l'output come stringa.

Se tuttavia vogliamo usufruire dell'interpolazione, ma vogliamo stampare il simbolo $, allora basta far precedere backslash ('\') al carattere $.

print "Ho vinto \$2500\n";

Altri caratteri di escape sono riportati nella tabella seguente.

Costrutti e significati
Costrutto Significato
\n Newline
\r Carriage return
\t Tabulazione orizzontale
\f Form feed
\b Backspace
\a Bell (beep)
\e Escape
\033 Escape in ottale
\x7f Delete in esadecimale
\cC CTRL-C
\\ Backslash
\" Doppio apice
\u Forza il carattere seguente maiuscolo (upper)
\l Forza il carattere seguente minuscolo (lower)
\U Forza tutti i carattere seguenti maiuscoli
\L Forza tutti i caratteri seguenti minuscoli
\Q Preponi backslash a caratteri non alfanumerici fino a \E
\E Termina \U, \L, o \Q


[modifica] Operatori scalari

Una variabile scalare può essere un numero o una stringa. Un operatore scalare si aspetta un numero o una stringa. Se si aspetta un numero invece di una stringa o viceversa, Perl provvede alla conversione. Il Perl dispone di tre tipi di operatori scalari, quelli su numeri, quelli su stringe e gli altri.


[modifica] Numeri

Il programmatore Perl non deve preoccuparsi di gestire valori interi, decimali a singola e doppia precisione, poiché i numeri vengono gestiti come valori numerici tralasciando il "tipo". Internamente, l'interprete, gestisce i valori numerici come numeri a doppia precisione, tuttavia il programmatore può benissimo lavorare con interi astraendo dell'implementazione interna. I numeri in Perl sono rappresentati con simboli, detti in generale letterali. Vediamo alcuni esempi di numeri:

69          # numero intero positivo
-273        # numero intero negativo
1_000_000   # un milione
3.14        # numero a virgola mobile positivo
-3.14       # numero a virgola mobile negativo
0.0314e2    # numero in notazione scientifica (= 0.0314 * 10^2 = 3.14)
314.0e-2    # numero in notazione scientifica (= 314.0 * 10^(-2) = 3.14)
0666        # numero ottale secondo la notazione del C
0xabcd      # numero esadecimale secondo la notazione del C
0b0110_1001 # numero binario

Quando si scrivono grossi numeri interi può essere comodo un carattere di "separazione", in questo caso il linguaggio offre il carattere di sottolineatura ('_'), che assieme ai caratteri '0' dei numeri in notazione ottale, '0x' dei numeri in notazione esadecimale e '0b' dei numeri in notazione binaria, può essere utilizzato solo all'interno di numeri letterali specificati nel programma. Non è quindi possibile acquisire dall'esterno numeri con questi caratteri, in quanto la conversione automatica di una stringa in un numero non riconosce questi prefissi. Se si vuole utilizzare queste notazioni all'interno di stringhe o input del programma, allora vanno effettuate delle conversioni esplicite.


[modifica] Operazioni numeriche

Le operazioni numeriche in Perl sono tutte quelle tradizionali: somma, sottrazione, moltiplicazione, divisione, modulo, elevamento a potenza.

$a = 5;
$b = 10;
 
$c = $a + $b;   # $c vale 15
$c = $a - $b;   # $c vale -5
$c = $a * $b;   # $c vale 50
$c = $a / $b;   # $c vale 0.5
$c = $a % $b;   # $c vale 5
$c = $a**2;     # $c vale 25 (ossia 5 elevato alla seconda)

Va ricordato che la divisione è definita sempre per numeri reali, pertanto 5 / 2 restituisce 2.5 come risultato. Alle operazioni numeriche classiche si aggiungono gli operatori di autoincremento e autodecremento: ++ e --. Questi operatori a differenza dei precedenti (che erano binari) sono unari, ossia coinvolgono un solo termine.

$a = 5;
 
$a++;   # $a vale 6. Operazione equivalente a: $a = $a + 1;

Gli operatori di autoincremento e autodecremento permettono di risparmiare battiture rispetto alla scrittura equivalente (vedi sorgente).


IN COSTRUZIONE

[modifica] Operatori di confronto tra numeri

[modifica] Stringhe

In perl le stringhe si possono scrivere in diversi modi ed ogni modo avra' effetti diversi sulle variabili.

Come e' stato detto in precedenza l'interpolazione serve ad escapare e sostituire le variabili con i loro valori, l'interpolazione nelle stringhe si ottiene con diversi metodi di dichiarazione di stringa:


[modifica] Quotes types

[modifica] Single quotes

$days = 45;
$string = 'Sono passati $days giorni.'. "\n".

Lo scalare $string conterra' "Sono passati $days giorni.\n".


[modifica] Double quotes

$days = 45;
$string = "Sono passati $days giorni.". "\n";

Lo scalare $string conterra' quindi "Sono passati 45 giorni.\n"


[modifica] Heredoc

$days  = 45;
$years = 12;
 
$string = <<STRING;
Sono passati $days giorni.
 
Pero' mancano ancora $years anni al giorno del giudizio :D
STRING

Lo scalare $string in questo caso conterra' "Sono passati 45 giorni.\n\nPero' mancano ancora 12 ani al giorno del giudizio :D\n".

L'heredoc e' molto utile quando si deve stampare una stringa molto grande e descrittiva che conterra' diverse linee e diverse variabili.


[modifica] Altro

Una stringa in perl e' un semplice scalare, quindi non si potra' usare una stringa come la si usa nella maggior parte dei linguaggi, quindi come un array di caratteri, pero' c'e' un modo per sopperire a questo problema:

$string = "Domani vado al mare.";
@array  = split //, $string;

Cosi' facendo otterremo un array con un char per ogni elemento.


[modifica] Altri operatori

[modifica] Funzioni scalari

[modifica] Precedenza e associatività degli operatori

Strumenti personali