Perl/Variabili vettori: differenze tra le versioni

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Riga 1: Riga 1:
{{Perl}}
{{Perl}}


I vettori o array si possono immaginare come un treno.Ogni treno ha un certo numero di vagoni.
I vettori o array si possono immaginare come un treno.
Ogni treno ha un certo numero di vagoni.
Analogamente gli array sono in insieme di scalari.Come nel treno le carrozze sono numerate , così negli array per identificare una informazione si usa un numero intero.La numerazione parte da 0 ed arriva fino al numero di elementi - 1.Cioè la prima carrozza ha il numero 0 (e non 1)
Analogamente gli array sono in insieme di scalari.
Come nel treno le carrozze sono numerate , così negli array per identificare una informazione si usa un numero intero.
La numerazione parte da 0 ed arriva fino al numero di elementi - 1.
Cioè la prima carrozza ha il numero 0 (e non 1)
Quindi un vettore con 5 elementi, l'ultimo sarà identificato come 4 infatti 0,1,2,3,4 sono 5 elementi.
Vediamo un altro esempio di 100 elementi:


treno - vagoni : 1 2 3 4 5 ... 100
treno - vagoni : 1 2 3 4 5 ... 100
Riga 10: Riga 16:
===Il nome===
===Il nome===


Come per le scalari, per identificare una variabile vettore (più valori in fila) occorre anteporre al nome il carattere @. Il nome di una variabile DEVE iniziare con "lettere", "_" , "'", mentre dal secondo carattere oltre ai precedenti si possono usare i "numeri" fino ad un massimo di 256 caratteri.
Come per le variabili scalari , per identificare una variabile vettore (più valori in fila) occorre anteporre al nome il carattere @ (sigillo). Il nome di una variabile DEVE iniziare con "lettere", "_" , "'", mentre dal secondo carattere oltre ai precedenti si possono usare i "numeri" fino ad un massimo di 256 caratteri.
NOTA: Essendo un linguaggio "case sensitive" le lettere maiuscole e le lettere minuscole sono differenti.
NOTA: Essendo un linguaggio "case sensitive" le lettere maiuscole e le lettere minuscole sono differenti.
Riga 57: Riga 63:
questo scriverà : 3 per il primo array, 1 per il secondo array, mercoledì per il terzo array.
questo scriverà : 3 per il primo array, 1 per il secondo array, mercoledì per il terzo array.


Notate che la gestione dei simboli è corretta: se intendo gestire l'array nella sua "totalità" uso il simbolo @ mentre se ne voglio uno scalare allora uso $ il nome e l'identificatore della posizione racchiuso fra parentesi quadre.
Notare che la gestione dei simboli è corretta: se intendo gestire l'array nella sua "totalità" uso il simbolo @ mentre se ne voglio un elemeto, quindi una variabile scalare, allora uso "$" con il nome del vettore e l'identificatore della posizione racchiuso fra parentesi quadre.


Il Perl ha adottato la particolarità del contesto per sapere di quanti elementi è composto un array:
Il Perl ha adottato la particolarità del contesto per sapere di quanti elementi è composto un array:
Riga 79: Riga 85:
</source>
</source>
Ora @a ha ben 10 elementi.
Ora @a ha ben 10 elementi, di scalari di valore undef.


'''NOTA''' se l'array ha un numero inferiore di elementi rispetto a quelli presenti , gli elementi che sono stati "aggiunti" hanno valore undef.
'''NOTA''' se l'array ha un numero inferiore di elementi rispetto a quelli presenti , gli elementi che sono stati "aggiunti" hanno valore undef.
Riga 98: Riga 104:
Questo è possibile perché è possibile identificare sintatticamente più informazioni.
Questo è possibile perché è possibile identificare sintatticamente più informazioni.
#nel caso della notazione [ x , y , z ] si indicano gli elementi alla posizione x,y,z (nell'esempio 3 ma possono essere di più o di meno!).
#nel caso della notazione [ x , y , z ] si indicano gli elementi alla posizione x,y,z (nell'esempio 3 ma possono essere di più o di meno!).
#nel caso della notazione [ x .. y ] si indicano tutti gli elementi che vanno all'elemento x a y.Se l'elemento x e Y sono numeri sono tutti i numeri (incrementati di 1) che intercorrono fra x e y.Nel caso di stringhe sono tutti i caratteri far una stringa e l'altra: 'a' .. 'f' equivale ad a, b, c, d, e, f.
#nel caso della notazione [ x .. y ] si indicano tutti gli elementi che vanno all'elemento x a y.
Se l'elemento x e y sono numeri sono tutti i numeri (incrementati di 1) che intercorrono fra x e y.
Nel caso di stringhe sono tutti i caratteri far una stringa e l'altra: 'a' .. 'f' equivale ad a, b, c, d, e, f.


@alfabeto = ('A' .. 'Z');
@alfabeto = ('A' .. 'Z');
Riga 111: Riga 119:
in giorni del mese ci saranno tutti i numeri da 01 a 31 (compreso 05, 11 , 21 etc)
in giorni del mese ci saranno tutti i numeri da 01 a 31 (compreso 05, 11 , 21 etc)


in @ACD contiene ( 'A' , 'C' , 'D' )
in @ACD contiene ( 'A' , 'C' , 'D' ) prelevate da alfabeto dalle posizioni 0,2,3


in @s contiene ( undef , undef , 'PIPPO' , 'pluto' , undef , 'CIAO' )
in @s contiene ( undef , undef , 'PIPPO' , 'pluto' , undef , 'CIAO' )


in @k contiene ( 'mario' , 'giuseppe' )
in @k contiene ( 'mario' , 'giuseppe' )
NOTA: in quest'ultimo assegnamento lo si poteva ottenere anche con il seguente codice:


@k = ( 'mario' , 'giuseppe' );


=== funzioni per immettere informazioni nei vettori===


Oltre ai metodi precedentemente esposti è possibile utilizzare delle funzioni che trattano i vettori come file dalle quali estrarre informazioni dall'inizio o dalla coda
ecco che inizia a delinearsi la possibilità di utilizzare in modo flessibile le informazioni senza dover utilizzare dei "cicli" per inserire dei valori.
Le funzioni sono push, pop, shift e unshift.


===push , pop , shift , unshift===
push e pop lavorano sulla "coda del treno".
shift e unshift lavorano sulla "testa del treno".


push mette le informazioni in fondo
Queste funzioni consentono l'inserimento/estrazione di valori in un array in "testa" o in "coda" .
pop estrae le informazioni dal fondo
push
shift estrae le informazioni dalla testa
e pop lavorano sulla "coda del treno".
unshift mette le informazioni dalla testa
shift e unshift lavorano sulla "testa".


@a = ( 2 , 3, 4, 5 );
@a = ( 2 , 3, 4, 5 );
Riga 159: Riga 173:
@p = split ( " " , "questo testo verrà diviso in ogni parola" );
@p = split ( " " , "questo testo verrà diviso in ogni parola" );
$c = delete ( $p[3] );
$c = delete ( $p[3] );
print "$c , @p\n";
print "$c , ".join("_" , @p)."\n";
che mostrerà:
che mostrerà:
diviso , questo testo verrà in ogni parola
diviso , questo_testo_verrà__in_ogni_parola

'''NOTA''': da notare lo spazio fra la parola verrà e la parola in : in quel punto c'è un elemento undef e quindi vengono aggiunti 2 spazi (uno per undef e uno per la parola in)
'''NOTA''': da notare lo "__" fra la parola "verrà" e la parola "in" : in quel punto c'è un elemento undef e quindi vengono aggiunti 2 "_" (uno per il valore "undef" e uno per il valore "in")


[[Categoria:Perl|Vettori]]
[[Categoria:Perl|Vettori]]

Versione delle 12:14, 28 lug 2009

Indice del libro


I vettori o array si possono immaginare come un treno. Ogni treno ha un certo numero di vagoni. Analogamente gli array sono in insieme di scalari. Come nel treno le carrozze sono numerate , così negli array per identificare una informazione si usa un numero intero. La numerazione parte da 0 ed arriva fino al numero di elementi - 1. Cioè la prima carrozza ha il numero 0 (e non 1) Quindi un vettore con 5 elementi, l'ultimo sarà identificato come 4 infatti 0,1,2,3,4 sono 5 elementi. Vediamo un altro esempio di 100 elementi:

treno - vagoni  : 1 2 3 4 5 ... 100

array - scalari : 0 1 2 3 4 ... 99

Il nome

Come per le variabili scalari , per identificare una variabile vettore (più valori in fila) occorre anteporre al nome il carattere @ (sigillo). Il nome di una variabile DEVE iniziare con "lettere", "_" , "'", mentre dal secondo carattere oltre ai precedenti si possono usare i "numeri" fino ad un massimo di 256 caratteri. NOTA: Essendo un linguaggio "case sensitive" le lettere maiuscole e le lettere minuscole sono differenti.

@a; # è il vettore a
@A; # è il vettore A diverso da a

NOTA: il nome di un vettore non può iniziare con numeri !!!

Il contenuto

Il contenuto è un qualsiasi scalare.

Vediamo la sintassi per creare un array:

  
 @a;           #Ho definito un array ma non l'ho riempito
 @a = ();      #Ho definito un array ed è vuoto
 # PRIMO ARRAY
 @a = ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 );
               #Ho definito un array ed è riempito con  9 valori da 1 a 9 
               #     che occupano le posizioni da 0 a 8 ! 
 # SECONDO ARRAY
 @b = ( 4 , "pippo" , 1 , "pluto" , 2 , "paperino" , 3 , "minni" , 4 );
               #Ho definito un array ed è riempito con  9 valori fra stringhe e numeri 
               #     che occupano le posizioni da 0 a 8 ! 
 # TERZO ARRAY
 $lun = "lunedì";
 $mar = "martedì";
 @c = ( $lun , $mar , "mercoledì" , "giovedì" , "venerdì" , "sabato" , "domenica" );
               #Ho definito un array ed è riempito con  7 valori di stringhe 
               #     che occupano le posizioni da 0 a 6 !

Per poter usare i valori dell'array occorre poter selezionare il dato singolo. Per far questo si utilizza il metodo dell'indice. L'indice rappresenta la posizione del dato. Nel nostro caso la sintassi prevede l'uso delle parantesi quadre come identificatore dell'indice. Vediamo ora se volessi scrivere il terzo valore dell'array (è alla posizione 2 perché si conta da 0):

  
 print "posizione 3 primo array :$a[2]\n"; 
 print "posizione 3 secondo array :$b[2]\n"; 
 print "posizione 3 terzo array :$c[2]\n";

questo scriverà : 3 per il primo array, 1 per il secondo array, mercoledì per il terzo array.

Notare che la gestione dei simboli è corretta: se intendo gestire l'array nella sua "totalità" uso il simbolo @ mentre se ne voglio un elemeto, quindi una variabile scalare, allora uso "$" con il nome del vettore e l'identificatore della posizione racchiuso fra parentesi quadre.

Il Perl ha adottato la particolarità del contesto per sapere di quanti elementi è composto un array:

   $numero_elementi = @a;
 print "numero di elementi di primo array e' : $numero_elementi\n";

Tuttavia esiste una sintassi specifica per sapere il valore dell'ultimo indice o per "forzare" la quantità di elementi di un array:

   $numero_elementi = $#a;
 print "numero di elementi di primo array e' : $numero_elementi\n";

Mentre se si usa l'istruzione:

   $#a = 10;

Ora @a ha ben 10 elementi, di scalari di valore undef.

NOTA se l'array ha un numero inferiore di elementi rispetto a quelli presenti , gli elementi che sono stati "aggiunti" hanno valore undef.

Linerizzazione

Con questa parola intendo la "trasformazione" che il linguaggio opera automaticamente nel trattare nel contesto gli array. Vediamo questo esempio:

@a = ( 2 , 3 , 4 );
@b = ( 1 , @a , 5 , 6 );

Nell'esempio trattato, @b ha i valori ( 1 , 2 , 3 , 4 , 5 , 6 ), quindi al posto di @a sono stati inseriti i suoi valori. Quindi in @a non è stato messo il numero di elementi di @a ma gli elementi stessi che costituiscono il vettore. Questo che può apparire strano in realtà è molto utile per "sommare" elementi e giuntarli. Se si volesse inserire un array è necessario mettere un reference (e quindi lo scalare che punta alle informazioni di "tipo" array). Se si volesse mettere il numero di elementi di un array è obbligatorio usare $#a.

Notazione [ x , y , z ] e [ x .. y ]

In Perl esiste la possibilità di estrarre o trattare contemporaneamente più informazioni da un array. Questo è possibile perché è possibile identificare sintatticamente più informazioni.

  1. nel caso della notazione [ x , y , z ] si indicano gli elementi alla posizione x,y,z (nell'esempio 3 ma possono essere di più o di meno!).
  2. nel caso della notazione [ x .. y ] si indicano tutti gli elementi che vanno all'elemento x a y.

Se l'elemento x e y sono numeri sono tutti i numeri (incrementati di 1) che intercorrono fra x e y. Nel caso di stringhe sono tutti i caratteri far una stringa e l'altra: 'a' .. 'f' equivale ad a, b, c, d, e, f.

@alfabeto = ('A' .. 'Z');
@giorni_del_mese = ('01' .. '31');
@ACD = @alfabeto[0 , 2 ,3 ];
@s = ();
@s[2,3,5] = ( 'PIPPO' , 'pluto' , 'CIAO' );
@k[0 .. 1] = ( 'mario' , 'giuseppe' );

in @alfabeto ci saranno tutte le lettere dalla A alla Z

in giorni del mese ci saranno tutti i numeri da 01 a 31 (compreso 05, 11 , 21 etc)

in @ACD contiene ( 'A' , 'C' , 'D' ) prelevate da alfabeto dalle posizioni 0,2,3

in @s contiene ( undef , undef , 'PIPPO' , 'pluto' , undef , 'CIAO' )

in @k contiene ( 'mario' , 'giuseppe' ) NOTA: in quest'ultimo assegnamento lo si poteva ottenere anche con il seguente codice:

@k = ( 'mario' , 'giuseppe' );
 

funzioni per immettere informazioni nei vettori

Oltre ai metodi precedentemente esposti è possibile utilizzare delle funzioni che trattano i vettori come file dalle quali estrarre informazioni dall'inizio o dalla coda Le funzioni sono push, pop, shift e unshift.

push e pop lavorano sulla "coda del treno". shift e unshift lavorano sulla "testa del treno".

push    mette  le informazioni in fondo
pop     estrae le informazioni dal fondo  
shift   estrae le informazioni dalla testa
unshift mette  le informazioni dalla testa
@a = ( 2 , 3, 4, 5 );
push ( @a , 6 , 7 );     #ora @a contiene ( 2 , 3, 4, 5 , 6 , 7 ) 
$b = pop (@a);           # $b = 7 ,  @a contiene ( 2 , 3, 4, 5 , 6 )
$c = shift ( @a );       # $c = 2 ,  @a contiene ( 3, 4, 5 , 6 )
unshift( @a , 0 , 1, 2); # ora @a contiene ( 0 , 1, 2 , 3, 4, 5 , 6 )

join e split

Queste due funzioni consentono:

  • di aggregare array in stringhe (join)
  • di separare una stringa in array

In particolare join "unisce" i valori dell'array mettendo fra loro la stringa indicata dall'utente:

@a = ( 1 , 2, 3 );
print join("_" , @a); # scrive 1_2_3
print "\n";

NOTA: se l'array passato non ha elementi torna una stringa vuota.

Per split il discorso è più articolato in quanto come elemento separatore accetta una espressione regolare che al momento è prematuro introdurre.Semplificando si può dire che accetta una stringa che risulta essere il separatore. Limitando l'esempio a strighe statiche :

@a = split ( " " , "questo testo verrà diviso in ogni parola" );
print @a."\n";

quindi in @a avremo ( "questo" , "testo" , "verrà" , "diviso" , "in" , "ogni" , "parola" ) per fare l'operazione contraria basterà scrivere:

$a = join( " " , @a );

delete

Questa funzione consente di cancellare un dato da un array.Tuttavia, se non è all'ultima posizione , non riduce la dimensione dell'array.

@p = split ( " " , "questo testo verrà diviso in ogni parola" );
$c = delete ( $p[3] );
print "$c , ".join("_" , @p)."\n";

che mostrerà:

diviso , questo_testo_verrà__in_ogni_parola

NOTA: da notare lo "__" fra la parola "verrà" e la parola "in" : in quel punto c'è un elemento undef e quindi vengono aggiunti 2 "_" (uno per il valore "undef" e uno per il valore "in")