Sei sulla pagina 1di 100

Ruby Language and some

applications

Dott. Giovanni Nigita

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)

Lanno 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) / 2

Introduzione 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 dellinterprete lanciamo


dalla shell il comando - -help
ruby --help

Gli 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 lesecuzione del comando passato


come argomento

-v, --verbose: vengono mostrate in output delle


informazioni addizionali quali la versione dellinterprete,
warning in fase di compilazione,

Gli strumenti in Ruby


Interactive Ruby

Oltre allinterprete 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 lutility ri, questultimo un tool che
permette di visualizzare di visualizzare la documetazione da
linea di comando

Potete scaricare lultima 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 allinterno di pagine
HTML. Per cui, come nel caso di PHP, si possono
creare delle pagine dinamiche.

Il codice Ruby viene incorporato allinterno dei


delimitatori <% e %>

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:


<% ruby code %>

Linee multiple:
<ul>
<% 2.times do %>
<li>Hello guys</li>
<% end %>
</ul>
Output:
Hello guys
Hello guys

Gli strumenti in Ruby eRuby (III)

Se si incontra la linea di codice:


<%= expression %>

allora viene valutata lespressione 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 lutility RubyGems


site_ruby: contiene i moduli e le estensioni aggiunte dal programmatore e che
non sono incluse nella distribuzione di base

Gli 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 maiuscola

Convenzioni 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 allinterno 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)

Loggetto 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 delloggetto.

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 dellattributo indica che la variabile


pure scrivibile, in modo analogo avremmo potuto utilizzare attr_accessor

Tipi 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 questultimo bisogna far precedere un
indicatore di base, in particolare:

0b per i binari;
0 per gli ottali;
0d per i decimali;
0x per gli esadecimali

Tipi 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 pocanzi 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 altrimenti

Tipi 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 allinterno delle [] la sottostringa da


ricercare:

Inoltre, possono essere specificate delle espressioni regolari J!

Ci ritorneremo!!

Tipi di dati Le stringhe (V)

Lassegnazione 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)

<<

capitalize

Tipi di dati Le stringhe (VI)


Alcuni importanti metodi applicabili alle
stringhe (II)

downcase

swapcase

chop

chomp

Tipi di dati Le stringhe (VI)


Alcuni importanti metodi applicabili alle
stringhe (III)

sub e gsub

split

tr

Tipi di dati Le stringhe (VII)


Alcuni importanti metodi applicabili alle stringhe (IV)

strip

lstrip

rstrip

ljust

rjust

center

Tipi 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 alliteratore. Ad esempio, literatore


each della classe String prende come parametro il separatore, che di default
il carattere \n. Riprendendo lesempio avremo:

Tipi di dati Blocchi e iteratori (II)

Vediamo adesso un esempio in cui possiamo richiamare un


blocco allinterno di un metodo, attraverso listruzione 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


tipo

Tipi di dati Array (II)

Al comando new possibile passare due parametri, il primo


indica la dimensione dellarray mentre il secondo il valore con il
quale verr inizializzato:

Attraverso il metodo []= possibile inserire nellarray nuovi


elementi o modificare quelli gi presenti:

Tipi di dati Array (III)

E possibile indicare come indice due interi che rappresentano


rispettivamente linizio 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 metodi << e push e il loro comportamento simile ad uno
stack:

Attraverso il metodo pop possibile invece eliminare lultimo


elemento di un array:

Tipi di dati Array (V)

Adesso vediamo un ultima tecnica per linserimento di elementi


allinterno di un array. Per fare questo, utilizziamo il metodo
insert:

inoltre possibile inserire pi elementi a partire dallindice


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

sort

Tipi di dati Array (IX)


Altri metodi

each

reverse_each

each_index

collect!

delete_if

Tipi di dati Hash (I)

Sono liste di coppie di chiavi e valori e sono istanze della classe


Hash

Ogni coppia separata dallaltra 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 dellindice 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
dellhash. 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 unespressione if anche in coda ad


una istruzione:

Strutture di controllo if e unless (IV)


Unless (I)

Lopposto dellif esiste il costrutto unless che esegue le istruzioni


associati allespressione 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 dellistruzione:

Strutture di controllo if e unless (VI)

Vediamo adesso unaltra forma pi particolare che richiede luso


delloperatore ?:

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 listruzione case in alternativa a if e unless.
Il costrutto case ha la seguente sintassi:

Strutture di controllo case (II)

Vediamo subito un esempio

Listruzione 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 dellistruzione:

Strutture di controllo case (IV)

In ultima analisi, considerando che il costrutto case restituisce il


valore dellultima 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 lespressione finch falsa

Strutture 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 lesecuzione del


programma riparte dallistruzione 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
dalliterazione 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 sulloggetto


my_file di tipo File.

Una volta concluse le operazioni, per chiudere il file basta


semplicemente il seguente comando

Gestione 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 dallinizio 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 alluscita 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 riga

Gestione 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:

loperatore <<

oppure
il metodo puts

Gestione 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 ununica stringa
readlines: restituisce in un array le linee del file

Gestione 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 luser 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 operazioni

Espressioni Regolari (I)

Le espressioni regolari sono uno strumento molto


potente per la gestione del testo. Esse forniscono dei
modelli per ricercare allinterno 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


lespressione regolare:

oppure tra i doppi slash //:

Espressioni Regolari (II)

Nel momento in cui viene creata unespressione


regolare possiamo confrontarla con una stringa. Questo
lo possiamo fare attraverso loperatore =~ o il suo
negato !~

Loperatore =~ restituisce la posizione del primo


carattere che fa match con lespressione regolare

Espressioni 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 linizio della stringa

\Z

match con la fine della stringa

Espressioni Regolari (IV)

Come nel caso di \A e \Z, esistono due particolari


elementi ^ e $ che vengono usati rispettivamente per
cercare lespressione regolare allinizio 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 precedente

Espressioni Regolari (V)

Possiamo indicare la classe di caratteri allinterno 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]/

qualcosaltro rispetto ad una vocale minuscola

/[^0-9]/

qualcosaltro rispetto ad un numero compreso


fra 0 e 9

Espressioni Regolari (VI)


La classe String (I)

Vediamo adesso come possiamo utilizzare le espressioni


regolare per le stringhe

In questo caso index restituisce lindice della prima


occorrenza della sottostringa che verifica il pattern, in
modo analogo il metodo rindex restituisce lultima
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 dellinstallazione, dellaggiornamento 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 linstallazione di RubyGems basta eseguire il


seguente comando:

Se eseguiamo dal terminale in comando gem senza


alcuna opzione figurer lista di informazioni per luso
di RubyGems

Per avere una lista completa dei comandi basta lanciare


il seguente comando

Pacchetti 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 lopzione 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 hpricot

Pacchetto 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 html

Pacchetto HPRICOT (III)

Documentazione

Demo on line

http://rubydoc.info/gems/hpricot/0.8.6/frames

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("<p>A simple <b>test</b> string.</p>)

Pacchetto HPRICOT (V)

Ricerca degli elementi allinterno del documento


vengono effettuati tramite il comando d o c . s e a r c h

Per ottenere il contenuto dellelemento cercato si usa il


comando . i n n e r _ h t m l

ADESSO
SCRIPT DI ESEMPIO