Ruby Language and some applications - Dott. Giovanni Nigita
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Panoramica u Introduzione u Gli strumenti in Ruby u Convenzioni e programmazione ad oggetti u Tipi di dati u Strutture di controllo u Ereditarietà ?!? u Gestione file e directory u Espressioni regolari u Altre cose… u Pacchetti di Ruby u Il pacchetto “HPRICOT”
Introduzione – La storia (I)
• Il linguaggio di programmazione Ruby è stato progettato nel
1993 dal giapponese Yukihiro Matsumoto
• Ma inizialmente non ebbe molto successo!Introduzione – La storia (II)
• Per più di un decennio non prese mai il decollo
• Inizialmente la documentazione era esclusivamente in
giapponese!!!Introduzione – La storia (III)
• L’anno di svolta fu il 2006!
• Anno in cui si affermarono i framework Ruby on Rails.
http://rubyonrails.org/Introduzione – La storia (IV)
• Adesso abbiamo veramente tanta documentazione, sia
in inglese
http://www.ruby-lang.org/en/
• che in italiano!
http://www.ruby-lang.org/it/Introduzione – Alcune
caratteristiche (I)
• Ruby è un linguaggio:
• open source
• general purpose
• interpretato
• orientato agli oggetti
• Possiamo definirlo come un linguaggio che ha acquisito tanto da parte
di altri linguaggi come: Smalltalk, Perl, Python, C, C++, PHP, Phyton
…
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/
• Infatti uno dei primi slogan era il seguente:
(Smalltalk + Perl) / 2Introduzione – Alcune
caratteristiche (II)
• Per cui avendo preso qualcosa da altri linguaggi di certo
molti aspetti sintattici ritorneranno familiari.
• Per cui dovrebbe essere relativamente semplice la
comprensione di tale linguaggio!Gli strumenti in Ruby –
Interprete di Ruby (I)
• Quello di cui abbiamo bisogno è di un editor di teso e
di un interprete.
• Per vedere le varie opzioni dell’interprete lanciamo
dalla shell il comando - -help
ruby --helpGli strumenti in Ruby –
Interprete di Ruby (II)
• -c: avviene un controllo della sintassi del codice, e se tutto
corretto ritorna “Syntax OK”. In questo caso il codice non
viene eseguito.
• -d, -debug: se si vuole effettuare un debug
• -e ‘command’: avviene l’esecuzione del comando passato
come argomento
• -v, --verbose: vengono mostrate in output delle
informazioni addizionali quali la versione dell’interprete,
warning in fase di compilazione,
• …Gli strumenti in Ruby –
Interactive Ruby
• Oltre all’interprete troviamo pure una shell interattiva!
• Permette di sperimentare in real time le potenzialità di questo
linguaggio ed è molto utile in fasi di sperimentazione.
• Tra le funzionalità di questa shell abbiamo la “Tab
Completation”!
• Per sfruttare questo utile strumento, basta eseguire da
terminare il comando “irb”
• In particolare con il comando “irb -- help”, è possibile
avere una lista di opzioni che si possono affiancare al
comando irb.Gli strumenti in Ruby – RDoc
and Ri (I)
• Tramite lo strumento RDoc (Ruby Documentation System) si
può avere la documentazione completa estratta dai file
sorgenti
• Tale documentazione viene fornita sia in formato html sia
formattata per l’utility “ri”, quest’ultimo è un tool che
permette di visualizzare di visualizzare la documetazione da
linea di comando
• Potete scaricare l’ultima versione andando nel seguente link:
http://rdoc.rubyforge.org/Gli strumenti in Ruby – RDoc
and Ri (II)
• Esempio, eseguendo dal terminale il comando:
ri String.chomp
• otterremo la documentazione relativa alla funzione
chomp:Gli strumenti in Ruby – eRuby (I)
• Tramite lo strumento eRuby (embedded Ruby) è
possibile inserire codice Ruby all’interno di pagine
HTML. Per cui, come nel caso di PHP, si possono
creare delle pagine dinamiche.
• Il codice Ruby viene incorporato all’interno dei
delimitatori
• Ovviamente, i blocchi di codici inseriti vengono
valutati sul posto e vengono sostituiti dal risultato della
loro valutazione.Gli strumenti in Ruby – eRuby (II)
• Una linea di Ruby:
• Linee multiple:
Hello guys
Output:
• Hello guys
• Hello guysGli strumenti in Ruby – eRuby (III)
• Se si incontra la linea di codice:
• allora viene valutata l’espressione e ne restituisce il
valore, inoltre ogni linea di questo tipo
• rappresenta un commento.Gli strumenti in Ruby – eRuby (IV)
• Abbiamo diverse implementazioni di eRuby:
• eruby: è un implementazione di eRuby scritta in C
• erb: è una implementazione di eRuby scritto
puramente Ruby ed include le sue librerie standard
• erubis: è una implementazione di eRuby in Ruby e
in Java
• Queste implementazioni rappresenta una buona
alternativi agli altri linguaggi come PHP, Perl,
ASP…Gli strumenti in Ruby – Le
librerie di base
• In ambiente Unix le librerie di base si troveranno nel seguente percorso:
/usr/lib/ruby
• mentre in ambiente Windows risiedono nella directory
c:\ruby\lib\ruby\
• In entrambi i percorsi possiamo trovare le seguenti cartelle:
• 1.8: (attualmente siamo alla versione 1.9, anche se vi ritroverete sicuramente
pre-installata la 1.8) contiene i moduli e le estensioni standard
• gems: contiene le librerie e le applicazioni installate con l’utility RubyGems
• site_ruby: contiene i moduli e le estensioni aggiunte dal programmatore e che
non sono incluse nella distribuzione di baseGli strumenti in Ruby – RubyGems
• RubyGems è un framework che gestisce le applicazioni
e le librerie sotto forma di pacchetti chiamati “gems”.
• Esso permette di cercare, installare, disinstallare e
aggiornare le librerie.
• Nel link sottostante si possono trovare le librerie dalla
A allo Zinco…
http://rubygems.org/Convenzioni e
programmazione OO –
I nomi(I)
• I nomi in Ruby fanno riferimento a costanti, variabili, metodi, classsi
e moduli, nonostante alcune parole sono riservate:
• Tramite il primo carattere del nome, Ruby distingue il modo in
cui viene utilizzato.
• Un nome può essere una lettera minuscola, maiuscola o un
underscore, seguito da qualsiasi altro carattere che sia una
combinazione dei simboli appartenenti alle tre precedenti
categorie.Convenzioni e
programmazione OO –
I nomi(II)
• Le variabili non sono tipizzate, per cui possono contenere
qualsiasi tipo di dato.
• Dal nome della variabile viene dedotto il suo scopo, ossia se
essa stessa sia locale, globale, istanza, ecc…:
• il nome di variabili locali devono essere dichiarate con un
lettera minuscola o con un carattere underscore
• le variabili globali iniziano con il simbolo $
• le variabili di istanza con il simbolo @
• quelle di classe con due simboli @
• se si vuole specificare una costante il nome deve iniziare con
una lettera maiuscolaConvenzioni e
programmazione OO –
I nomi(III)
• Il nome di classe e di modulo sono costanti, e seguono la
convenzione utilizzata per le variabili costanti.
• Il nome del metodo inizia con un lettera minuscola seguita
da altri caratteri. Come caratteri speciali possono contenere,
come suffisso, solo il simbolo “!” e quello “?”.Convenzioni e
programmazione OO –
I commenti
• I commenti all’interno di un codice vengono inseriti
attraverso il carattere “#”. Tutto quello che seguirà tale
carattere non verrà considerato.
• Inoltre, è possibile fare un commento multiriga, e questo è
possibile farlo mettendo il testo che si vuole commentare tra
i tag =begin e =end:Convenzioni e
programmazione OO –
Qualche nozione non guasta mai! (I)
In Ruby ogni cosa è un
oggetto!!!Convenzioni e
programmazione OO –
Qualche nozione non guasta mai! (II)
• Questo paradigma di programmazione prevede di
raggruppare in un porzione circoscritta (classe) del codice
sorgente la dichiarazione delle strutture dati e delle procedure
che operano su di esse.
• Nella programmazione orientata agli oggetti (OOP, Object
Oriented Programming) un oggetto può essere visto come un
contenitore di dati dotato di attributi (dati) dotato di una
serie di metodi (procedure) secondo quanto dichiarato dalle
rispettive classi.
• Un linguaggio è definito ad oggetti quando permette di
implementare tre meccanismi chiamati incapsulamento,
ereditarietà e polimorfismo.Convenzioni e
programmazione OO –
Qualche nozione non guasta mai! (III)
• L’oggetto è una istanza di una classe!
• Esso è dotato di tutti gli attributi e i metodi definiti
dalla classe.
• Dal lato del calcolatore, ogni oggetto è rappresentato
da un certa locazione di memoria, nella quale si trovano
memorizzati gli attributi, il valore di questi determinano
lo stato interno di una dell’oggetto.
• Istanziare un oggetto vuol dire allocare memoria ed
inizializzarla in base alle specifiche della classe
definisce.Convenzioni e
programmazione OO –
Gli oggetti in Ruby (I)
• Riportiamo un semplice esempio…Convenzioni e
programmazione OO –
Gli oggetti in Ruby (II)
• Ancora un altro esempio…Convenzioni e
programmazione OO –
Gli oggetti in Ruby (III)
Gestione degli attributi
• Ruby fornisce delle scorciatoie per la gestione degli attributi: attr_reader,
attr_writer, attr_accessor e attr.
• Il valore true che segue il nome dell’attributo indica che la variabile è
pure scrivibile, in modo analogo avremmo potuto utilizzare attr_accessorTipi di dati – I numeri (I)
Le classi che definiscono i numeri
• Nel linguaggio Ruby abbiamo la presenza di numeri interi e
in virgola mobile.
• I numeri interi sono oggetti o della classe Fixnum o della
classe Bignum
• i numeri che possono essere rappresentati da una word sono
oggetti della classe Fixnum, altrimenti appartengono alla classe
Bignum.
• I numeri in virgola mobile sono oggetti della classe Float.Tipi di dati – I numeri (II)
Rappresentazione di numeri non decimali
• Affinché si abbia una rappresentazione non decimale
di un numero, a quest’ultimo bisogna far precedere un
indicatore di base, in particolare:
• 0b per i binari;
• 0 per gli ottali;
• 0d per i decimali;
• 0x per gli esadecimaliTipi di dati – I numeri (III)
Alcuni metodi per le classi Fixnum e Bignum
• Operazioni aritmetiche (+,-,*,/,div,%,modulo,**)
• Operazioni bitwise (~,|,&,^,)
• Altre operazione:
• dimensione in byte (size): 1.size => 4
• operazioni di conversione (to_f, to_s)
• valore assoluto (abs)Tipi di dati – I numeri (IV)
La classe Float
• I numeri in virgola mobile appartengono alla classe Float
• Questa classe, oltre ad avere i metodi poc’anzi visto, ha:
• infinite? : tale metodo restituisce
• -1 se il numero è meno infinito,
• +1 se il numero è più infinito,
• nil se il numero è finito.
• nan? : ritorna
• true se il valore è un numero non valido,
• false altrimentiTipi di dati – Le stringhe (I)
• Le stringhe sono delle istanze della classe String, e sono
rappresentate da un successione di caratteri racchiusi tra singoli
apici (‘) o tra le virgolette (“)
• Si può accedere ad ogni singolo carattere della stringa []:Tipi di dati – Le stringhe (II)
• Esempio:
• Per visualizzare un carattere invece del codice ASCII, possiamo
utilizzare il metodo chr:Tipi di dati – Le stringhe (III)
Accedere a sottostringhe (I)
• Per questo utilizziamo le []:
• Se utilizziamo i “…” escludiamo il secondo estremo:
• Possiamo pure specificare il range tramite un qualsiasi numero
intero:Tipi di dati – Le stringhe (IV)
Accedere a sottostringhe (II)
• Può essere specificata all’interno delle [] la sottostringa da
ricercare:
• Inoltre, possono essere specificate delle espressioni regolari J!
• Ci ritorneremo!!Tipi di dati – Le stringhe (V)
• L’assegnazione viene effettuata attraverso il metodo []=, abbiamo
una situazione analoga a metodo [] visto prima…
• Giusto qualche esempio…Tipi di dati – Le stringhe (VI)
Alcuni importanti metodi applicabili alle
stringhe (I)
• *
• +
•Tipi di dati – Le stringhe (VI)
Alcuni importanti metodi applicabili alle
stringhe (II)
• downcase
• swapcase
• chop
• chompTipi di dati – Le stringhe (VI)
Alcuni importanti metodi applicabili alle
stringhe (III)
• sub e gsub
• split
• trTipi di dati – Le stringhe (VII)
Alcuni importanti metodi applicabili alle stringhe (IV)
• strip
• lstrip
• rstrip
• ljust
• rjust
• centerTipi di dati – Blocchi e iteratori (I)
• I blocchi sono delle regioni di codice racchiuse tra due parole do e end
oppure tra due parentesi { }.
• Un iteratore è un un metodo che prende come argomento un blocco.
• Esempio…
• Possiamo inoltre passare dei parametri all’iteratore. Ad esempio, l’iteratore
each della classe String prende come parametro il separatore, che di default è
il carattere \n. Riprendendo l’esempio avremo:Tipi di dati – Blocchi e iteratori (II)
• Vediamo adesso un esempio in cui possiamo richiamare un
blocco all’interno di un metodo, attraverso l’istruzione yield:Tipi di dati – Array (I)
• Gli array sono istanze della classe Array e vengono creati in questo
modo:
• o in alternativa:
• In questi due casi creeremo un array vuoto, per la creazione di un
array non vuoto basta semplicemente passare i valori separati da
virgole:
• N.B. Un array è una lista di oggetti non necessariamente dello stesso
tipoTipi di dati – Array (II)
• Al comando new è possibile passare due parametri, il primo
indica la dimensione dell’array mentre il secondo il valore con il
quale verrà inizializzato:
• Attraverso il metodo []= è possibile inserire nell’array nuovi
elementi o modificare quelli già presenti:Tipi di dati – Array (III)
• E’ possibile indicare come indice due interi che rappresentano
rispettivamente l’inizio e il numero di elementi da sostituire con
il valore passato:
• Allo stesso modo può essere usato il range:Tipi di dati – Array (IV)
• Un metodo alternativo per inserire elementi in un array è dato
dai metodiTipi di dati – Array (V)
• Adesso vediamo un ultima tecnica per l’inserimento di elementi
all’interno di un array. Per fare questo, utilizziamo il metodo
insert:
• inoltre è possibile inserire più elementi a partire dall’indice
specificato come primo parametro:Tipi di dati – Array (VI)
Operazioni sugli array (I)
• “+” concatenazione:
• “-” differenza:Tipi di dati – Array (VII)
Operazioni sugli array (II)
• “&” intersezione:
• “*”: questo metodo si comporta modo differente in base al parametro
che gli si viene passato.Tipi di dati – Array (VIII)
Alcuni importanti metodi applicabili alle stringhe (I)
• clear
• compact
• delete
• empty?
• include?Tipi di dati – Array (IX)
Alcuni importanti metodi applicabili alle stringhe (II)
• index
• join
• lenght, nitems
• reverse
• sortTipi di dati – Array (IX)
Altri metodi…
• each
• reverse_each
• each_index
• collect!
• delete_ifTipi di dati – Hash (I)
• Sono liste di coppie di chiavi e valori e sono istanze della classe
Hash
• Ogni coppia è separata dall’altra tramite una virgola, inoltre tra le
chiavi e il valore deve esserci il simbolo “=>”
• A differenza degli array gli indici possono essere di qualsiasi tipo
• Gli hash in Ruby sono racchiusi tra le parentesi { e }
• Come creare un array:Tipi di dati – Hash (II)
• Per popolare un hash basta utilizzare il metodo []=, visto nel caso degli array
con la differenza che al posto dell’indice bisogna specificare la chiave:
• Per accedere ad un specifico valore si utilizza il metodo []:
• Tramite il metodo keys e values possibile elencare rispettivamente tutti le
chiavi e tutti i valori:Tipi di dati – Hash (III)
• Diversi metodi visti in precedenza per gli array sono presenti
anche negli hash!
• Uno in particolare che possiamo vedere, molto utile, è il metodo
each che passa al blocco come parametri sia la chiave che il valore
dell’hash. Inoltre, esistono i metodi each_key e each_value che
passano rispettivamente al blocco la chiave e il valore.Strutture di controllo – if e unless (I)
If (I)
• Ovviamente chiunque il significato di tale costrutto, per cui
evitiamo di parlarne e la sua sintassi:Strutture di controllo – if e unless (II)
If (II)
• Osserviamo un rapido esempio J:Strutture di controllo – if e unless (III)
If (III)
• Se il nostro if si trova in più linee allora si può anche omettere a
per cui il nostro esempio diventa:
• Inoltre, è possibile inserire un’espressione if anche in coda ad
una istruzione:Strutture di controllo – if e unless (IV)
Unless (I)
• L’opposto dell’if esiste il costrutto unless che esegue le istruzioni
associati all’espressione booleana che risulta falsa:Strutture di controllo – if e unless (V)
Unless (II)
• Vediamo un piccolo esempio…
• Anche in questo caso possiamo mettere il costrutto unless alla
fine dell’istruzione:Strutture di controllo – if e unless (VI)
• Vediamo adesso un’altra forma più particolare che richiede l’uso
dell’operatore “?”:
• In questo caso assegneremo alla variabile segno la stringa
“negativo” se la variabile numero è negativa, altrimenti
assegneremo la stringa “positivo”.Strutture di controllo – case (I)
• A volte per una questione di comodità e di chiarezza nel codice
si preferisce utilizzare l’istruzione case in alternativa a if e unless.
Il costrutto case ha la seguente sintassi:Strutture di controllo – case (II)
• Vediamo subito un esempio…
• L’istruzione che si trova dopo la parola else è quella che viene
eseguita di default nel momento in cui falliscono tutte le altre
istruzioni.Strutture di controllo – case (III)
• E’ possibile fare uso della parola chiave then e dei due punti
qualora la condizione si trovi nella stessa linea dell’istruzione:Strutture di controllo – case (IV)
• In ultima analisi, considerando che il costrutto case restituisce il
valore dell’ultima espressione valutata allora è possibile assegnare
tale risultato ad un variabile:Strutture di controllo –
while, until e for (I)
While
• Esempio:Strutture di controllo –
while, until e for (II)
Until
• Esempio:
• In questo caso viene eseguita l’espressione finché è falsaStrutture di controllo –
while, until e for (III)
For
• Esempio:Strutture di controllo –
while, until e for (IV)
Come uscire dai cicli – break
• Il comando break fa terminare il ciclo e l’esecuzione del
programma riparte dall’istruzione che segue il ciclo:Strutture di controllo –
while, until e for (V)
Come saltare una iterazione – next
• Attraverso il comando next è possibile saltare una
iterazione del ciclo e il programma riprenderà
dall’iterazione successiva:Gestione File – Apertura e chiusura (I)
• File è la classe che contiene i metodi per la gestione dei file
(apertura, chiusura, lettura, scrittura…)
• Abbiamo a disposizione due metodi per aprire un file:
Metodo classico – File.new
• A questo punto tutto le operazioni vanno eseguite sull’oggetto
my_file di tipo File.
• Una volta concluse le operazioni, per chiudere il file basta
semplicemente il seguente comandoGestione File – Apertura e chiusura (II)
• Il metodo File.new ha la seguente sintassi:
• Tale metodo può prendere da uno a tre parametri:
• il primo rappresenta il nome del file da aprire,
• il secondo la modalità di apertura,
• il terzo i permessi che verranno associati al file.
• Di default il file viene aperto in solo lettura.Gestione File – Apertura e chiusura (III)
• La modalità di apertura può essere espressa sia come stringa:
• r: apertura a solo lettura
• r+: apertura per lettura e scrittura dall’inizio del file
• w: apertura a solo scrittura, in particolare se il file non esiste ne viene creato uno
nuovo, altrimenti viene azzerato
• w+: apertura per lettura e scrittura, se il file non esiste ne viene creato uno nuovo,
altrimenti viene azzerato
• a: apertura a solo scrittura dalla fine del file, inoltre se il file non esiste allora viene
creato
• a+: apertura
• sia come “or” di flag (sono costanti della classe File)
• APPEND: apertura in modalità append;
• CREAT: viene creato il file se non esiste;
• RDONLY: apertura a solo lettura;
• RDWR: apertura per lettura e scrittura;
• TRUNC: apre il file e se già esiste lo azzera;
• WRONLY: apertura a solo scrittura.Gestione File – Apertura e chiusura (IV)
• Per quanto riguarda il terzo argomento, i permessi vengono
indicati, nei sistemi Unix-like, nella forma Owner-Group-Other.
• Vediamo subito un piccolo esempio…
• In questo caso, il file se non esiste viene creato, se esiste lo apre e lo
azzera, ed inoltre viene aperto in lettura e scrittura.
• Per quanto riguarda i permessi, possiamo leggere e scrivere nel file,
mentre il nostro gruppo e chiunque altro può solamente leggerlo.Gestione File – Apertura e chiusura (V)
Apertura tramite il metodo open
• Al metodo open può essere associato un blocco al quale viene
passato il file appena aperto. Senza il blocco associato open è
sinonimo di File.new.
• Quando viene utilizzato open non è richiesta la chiamata di close al
termine delle operazioni, in quanto esso verrà chiuso
automaticamente all’uscita del blocco.Gestione File – Lettura e scrittura (I)
• Le operazioni base sui file appena aperto sono la lettura e la scrittura.
• Per la lettura possiamo utilizzare il metodo gets che viene ereditato dalla
classe IO (precisiamo che la classe File è un sottoclasse della classe IO).
• Altrimenti possiamo fare ricorso agli iteratori nel momento in cui
utilizziamo il metodo open per aprire il file:
• each_byte: chiama il blocco per ogni byte
• each_line (anche each): chiama il blocco per ogni rigaGestione File – Lettura e scrittura (II)
• Attraverso gli iteratori each_line e each possiamo iterare su ogni
linea del file:
• risparmiamo qualche riga di codice J …Gestione File – Lettura e scrittura (III)
• Un ulteriore modo al quanto elegante per aprire un file è dato dal
metodo foreach della classe IO. Ad esso viene passato come
argomento un file, il metodo apre tale file, chiama il blocco per
ogni linea e alla fine chiude automaticamente il file:
• Per la scrittura su un file viene utilizzato il metodo write il quale
prende come argomento la stringa da scrivere sul file:Gestione File – Lettura e scrittura (IV)
• In alternativa a write possiamo utilizzare:
• l’operatoreGestione File – Alcuni metodi utili (I)
• Vediamo alcuni metodi utili per la gestione di file:
• atime, ctime, mtime: rispettivamente restituisco la data di ultimo
accesso, di creazione e di modifica.
• chmod, chown: modificano i permessi di proprietariorename:
• delete: cancella il file
• rename: rinomina il file
• size: restituisce la dimensione del file in byte
• read: restituisce il contenuto del file in un’unica stringa
• readlines: restituisce in un array le linee del fileGestione File – Alcuni metodi utili (II)
• Vi sono alcuni metodi interrogativi come:
• exist? : restituisce true se il file esiste
• executable? : restituisce true se il file è eseguibile
• readable? : restituisce true se il file è leggibile
• writable? : restituisce true se il file è scrivibile
• file? : restituisce true se il file è regolare, ossia se non è una directory,
ecc.
• owned? : restituisce true se l’user ID del processo è lo stesso del file.Gestione directory
• La classe della gestione delle directory è Dir.
• Per questa classe esistono pure i metodi new, open e close visti
in precedenza per la classe File:
• Anche in questo caso si può utilizzare il metodo open senza
ricorrere successivamente a close per chiudere la directory una
volta concluse le operazioniEspressioni Regolari (I)
• Le espressioni regolari sono uno strumento molto
potente per la gestione del testo. Esse forniscono dei
modelli per ricercare all’interno di un testo espressioni
letterali.
• Come nel caso degli array e degli hash, gli oggetti della
classe Regexp possono essere creati in diversi modi:
• utilizzando il metodo new nel quale viene passata
l’espressione regolare:
• oppure tra i doppi slash //:Espressioni Regolari (II)
• Nel momento in cui viene creata un’espressione
regolare possiamo confrontarla con una stringa. Questo
lo possiamo fare attraverso l’operatore =~ o il suo
negato !~
• L’operatore =~ restituisce la posizione del primo
carattere che fa match con l’espressione regolareEspressioni Regolari (III)
• Nelle espressioni oltre ai normali caratteri possono
essere usate delle sequenze di simboli che indicano
determinate categorie di caratteri
. un carattere qualsiasi
\w lettera o numero
\W il contrario di \W, né lettera né cifra
\s spazio, come \t \n \r, ecc..
\S carattere non spazio
\d cifra numerica
\D carattere non numerico
\A match con l’inizio della stringa
\Z match con la fine della stringaEspressioni Regolari (IV)
• Come nel caso di \A e \Z, esistono due particolari
elementi ^ e $ che vengono usati rispettivamente per
cercare l’espressione regolare all’inizio della stringa o
alla fine.+
• Esistono anche dei simboli di quantità
* zero o più ripetizioni del carattere precedente
+ una o più ripetizioni del carattere precedente
{m,n} almeno m e massimo n ripetizioni del carattere
precedente
? al massimo una ripetizione del carattere precedenteEspressioni Regolari (V)
• Possiamo indicare la classe di caratteri all’interno di un
espressione regolare nel seguente modo:
/[Rr]uby/ “Ruby” o “ruby”
/rub[ye]/ “ruby” o “rube”
/[aeiou]/ una qualsiasi vocale minuscola
/[0-9]/ un qualsiasi numero compreso fra 0 e 9
/[a-z]/ una qualsiasi lettera minuscola
/[A-Z]/ una qualsiasi lettera maiuscola
/[a-zA-Z0-9]/ la qualunque cosa
/[^aeiou]/ qualcos’altro rispetto ad una vocale minuscola
/[^0-9]/ qualcos’altro rispetto ad un numero compreso
fra 0 e 9Espressioni Regolari (VI)
La classe String (I)
• Vediamo adesso come possiamo utilizzare le espressioni
regolare per le stringhe
• In questo caso index restituisce l’indice della prima
occorrenza della sottostringa che verifica il pattern, in
modo analogo il metodo rindex restituisce l’ultima
occorrenza:Espressioni Regolari (VI)
La classe String (II)
• E’ possibile utilizzare le espressioni regolari anche con
il metodo split:
• Infine, possiamo sfruttare le potenzialità delle regexp
con il metodo scan, in questo caso tale metodo
scansiona tutta la stringa presa in esame e inserisce in
un array tutti i risultati che verificano il pattern:Pacchetti in Ruby – Introduzione a RubyGems (I)
• RubyGems è un framework per la gestione in modo automatica
dei pacchetti.
• Esso si occupa dell’installazione, dell’aggiornamento e della
distruzione…
• Esso va installato a parte in quanto non fa parte dei programmi
distribuiti direttamente da Ruby
• Nel seguente link trovate i sorgenti attualmente disponibili:
http://docs.rubygems.org/Pacchetti in Ruby – Introduzione a RubyGems (II)
• Per l’installazione di RubyGems basta eseguire il
seguente comando:
• Se eseguiamo dal terminale in comando gem senza
alcuna opzione figurerà lista di informazioni per l’uso
di RubyGems
• Per avere una lista completa dei comandi basta lanciare
il seguente comandoPacchetti in Ruby – Comandi per RubyGems (I)
• Per installare una nuova gemma basta utilizzare il
comando install:
• Per avere una lista completa delle opzioni che si
possono utilizzare con il comando install basta lanciare
il seguente comando:Pacchetti in Ruby – Comandi per RubyGems (II)
• Per poter utilizzare le librerie nel codice sorgente occorre caricare la
gemma, per fare ciò si utilizza il comando require:
• Per disinstallare un pacchetto attraverso RubyGems basta utilizzare il
comando unistall
• Attraverso il comando list invece è possibile vedere le gemme installate
attualmente nella propria macchina.
• Indicando l’opzione –remote è possibile avere una lista completa dei
pacchetti presenti nel repository. Di default quello ufficiale è
rubyforge.org
• Infine, attraverso il comando update possiamo aggiornare la versione di
un pacchetto se viene specificato il suo nome, altrimenti vengono
aggiornati tutti quelli presenti nella propria macchina.Pacchetto “HPRICOT” (I)
• Hpricot (v 0.8.6) è una gemma che può essere scaricata
dal sito: http://rubygems.org/
• Al link http://rubygems.org/gems/hpricot
• In alternativa può essere installato dalla shell di ruby
con il seguente comando:
gem install hpricotPacchetto “HPRICOT” (II)
• Hpricot è un parser HTML, scritto in C, veloce e
flessibile.
• Le ricerche possono basarsi su diversi elementi:
• ID degli elementi
• Selettori CSS
• Tag
• Ed in generale tutti gli elementi che compongono una
pagina htmlPacchetto “HPRICOT” (III)
• Documentazione
• http://rubydoc.info/gems/hpricot/0.8.6/frames
• Demo on line
• http://hpricot.com/
• Competitor, sempre una ruby gems:
• Nokogiri (http://nokogiri.org/)Pacchetto “HPRICOT” (IV)
• Input:
• Dal www
require 'open-uri'
doc = open("http://www.sdai.unict.it/") { |f| Hpricot(f) }
• Da file locali
doc = open("index.html") { |f| Hpricot(f) }
• Oppure una generica stringa
doc = Hpricot("A simple test string.“)Pacchetto “HPRICOT” (V)
• Ricerca degli elementi all’interno del documento
vengono effettuati tramite il comando d o c . s e a r c h
• Per ottenere il contenuto dell’elemento cercato si usa il
comando . i n n e r _ h t m l
ADESSO
SCRIPT DI ESEMPIOPuoi anche leggere