Una funzione di uso molto comune nel mondo delle stringhe è chop(). Il suo scopo è semplicemente quello di tagliare l'ultimo carattere della stringa passata come argomento, e solitamente viene utilizzata per rimuovere il newline (\n) posto al termine. Se ad esempio leggiamo, come visto nella scorsa lezione, un file riga per riga, ci troviamo ad avere una serie di stringhe terminate da newline, carattere di cui potremmo volerci sbarazzare. Scriveremmo quindi:
$c = chop($a);
Come si nota, la funzione ha anche un valore di ritorno, che è il carattere tagliato. È fondamentale notare che chop() rimuove l'ultimo carattere qualunque esso sia, quindi se per caso manca il newline, verrà tagliato l'ultimo carattere valido. C'è tuttavia l'alternativa intelligente: chomp(). Questa rimuove l'ultimo carattere solo se è un newline, altrimenti non ha effetto; inoltre, se i newline sono più di uno, li rimuove tutti e ritorna il numero di caratteri tagliati.
La coppia join() e split() permette, abbastanza prevedibilmente, rispettivamente di unire o separare stringhe basandosi su un'espressione. Vediamo subito un esempio:
@a = ('Michele', 'Andrea', 'Anna', 'Luca');
$tutti = join '_', @a;
$tutti contiene Michele_Andrea_Anna_Luca, cioè tutti gli elementi della lista uniti tra loro e separati da un underscore. Esattamente il contrario fa split(): ponendo di avere a disposizione la stringa $tutti appena creata, possiamo ottenere di nuovo le singole parti con:
@a = split /_/, $tutti;
Come si vede, in questo caso il primo parametro, anziché una semplice stringa come in join(), è un pattern: questo rendere possibile effettuare separazioni sulla base di regular expression, e quindi anche ad esempio considerando più di un carattere come separatore. Infatti:
split /[_,;]/, $tutti;
considera separatori sia l'underscore che la virgola che il punto e virgola. Simili a join() e split(), ma solo per il fatto che uniscono e separano dati, sono pack() ed unpack(). Queste sono funzioni di straordinaria potenza che, tra le altre cose, permettono di unire una lista in una stringa di lunghezza fissa: non vi sono cioè dei separatori ma un numero di caratteri fisso che determina quando finisce una parte ed inizia l'altra. Vediamo un esempio che utilizza lo stesso array @a di cui prima:
$string = pack ("A60A20A15A50", @a);
Il risultato è una stringa di ben 145 caratteri contenente i quattro elementi dell'array in uno schema fisso: il primo occupa 60 caratteri, il secondo 20, il terzo 15 ed il quarto 50. Visto che sono tutti più corti rispetto alla lunghezza dichiarata, il carattere A fa si che a destra vengano inseriti degli spazi. Dovesse uno degli elementi superare la lunghezza dichiarata, la parte di esso che non sta verrebbe troncata. Tramite unpack() si fa l'esatto contrario:
@a = unpack ("A60A20A15A50", $string);
La funzione più importante di pack() ed unpack() non è tuttavia questa appena vista, ma quella di permettere l'accesso a file dal contenuto binario (ad esempio numeri memorizzati come tali, e non come stringhe). Chiunque fosse interessato ad accedere a questo tipo di file, troverà queste funzioni indispensabili.
A volte può essere necessario creare un output un po' più "curato" di quanto print() permette. Allo scopo sono disponibili la funzione write() ed i formati, che però qui non analizziamo, ma ci limitiamo a citare in modo che il lettore interessato sappia della loro esistenza. Essi permettono di creare un output completamente formattato, gestibile in ogni suo aspetto. Vediamo invece funzioni di uso più generale, ed in particolare printf() e sprintf(). Chi conosce almeno i rudimenti della programmazione in C le ha sicuramente già incontrate, in quanto fondamentali per gestire l'input/output in tale linguaggio. Probabilmente anche chi programma in C++ le ha incontrare almeno qualche volta, benché in quest'ultimo linguaggio esse siano state di fatto sostituite dallo stream cout. printf() crea e stampa una stringa formattata dati i parametri di formattazione e la lista di cosa va stampato. Se ad esempio vogliamo visualizzare un numero accertandoci che sia arrotondato alla seconda cifra decimale, scriviamo:
printf "Il numero è: %.2f", $num;
Se $num è 2.432874, esso verrà visualizzato come 2.43; di contro, se è semplicemente 2, verrà visualizzato come 2.00. Così come i numeri in virgola mobile, è possibile formattare qualsiasi altro tipo di dato, secondo i formati riportati in Tabella 1
| Carattere |
Descrizione |
%% | Segno di percentuale |
%c | Carattere corrispondente al numero indicato |
%s | Stringa |
%d | Intero decimale con segno |
%u | Intero decimale senza segno |
%o | Intero ottale senza segno |
%x | Intero esadecimale senza segno |
%b | Intero binario senza segno |
%e | Numero in virgola mobile, notazione scientifica |
%f | Numero in virgola mobile, notazione decimale fissa |
%g | Numero in virgola mobile, notazione scientifica o decimale fissa |
%X | Come %x, ma con lettere maiuscole |
%E | Come %e, ma con la E maiuscola |
%G | Come %g, ma con la E maiuscola (se presente) |
%p | Puntatore (indirizzo in esadecimale) |
%n | Memorizza il numero di caratteri stampati finora nella variabile passata come argomento |
ed i flag visibili in Tabella 2.
| Flag |
Descrizione |
spazio | Mette uno spazio prima di un numero positivo |
+ | Mette un + prima di un numero positivo |
- | Giustifica il campo a sinistra |
0 | Usa zeri anziché spazi per giustificare a destra |
# | Mette uno 0 prima di un ottale diverso da zero, o uno 0x prima di un esadecimale diverso da zero |
num | Lunghezza minima del campo |
.num | Per gli interi: lunghezza minima. Per le stringhe: lunghezza massima. Per i decimali: cifre dopo la virgola |
l | Considera l'intero un long o unsigned long come in C |
h | Considera l'intero un short o unsigned short come in C (senza flag considera int o unsigned int) |
In questo caso il formato è f, ed è stato utilizzato il flag .numero per stabilire quante cifre dopo la virgola andassero stampate. sprintf() è identica a printf(), solo che anziché stampare la stringa creata, la ritorna:
$a = sprintf "Il numero è: %.2f", $num;
Il tipico "re dell'officina" per quanto riguarda la gestione delle stringhe è substr(). Questa funzione rende possibile tutta una serie di operazioni, le quali sostanzialmente permettono, come il nome della funzione lascia intuire, di gestire le parti, i singoli caratteri, di una stringa. Vediamo brevemente alcuni esempi del suo utilizzo:
# Taglia l'ultimo carattere (come chop())
substr($a, -1, 1) = '';
# Ritorna il terzo e quarto carattere
$b = substr($a, 2, 2);
# Sostituisce il primo carattere con "casa"
substr ($a, 0, 1) = "casa";
Come si vede gli impieghi possibili sono molteplici, e la funzione si occupa automaticamente di ridimensionare la stringa quando necessario. I parametri da passare a substr() sono il nome della variabile contenente la stringa, l'offset al quale si desidera iniziare a leggere o scrivere ed il numero di caratteri da prendere in considerazione. Un offset negativo indica di partire dalla fine della stringa, mentre un numero di caratteri negativo indica di considerare l'intera stringa a partire dall'offset lasciando però da parte quel numero di caratteri alla fine della stringa.
L'ultima e semplicissima funzione che analizziamo per quanto riguarda la gestione delle stringhe è length(), che ritorna il numero di caratteri di cui una stringa è composta:
$n = length $a;
|