Successivo: Costanti regexp forti, Su: Usare le costanti regexp [Contenuti][Indice]
awk
.Quand’è usata a destra degli operatori ‘~’ o ‘!~’,
una costante regexp rappresenta semplicemente l’espressione regolare che
dev’essere confrontata. Comunque, le costanti regexp (come /pippo/
)
possono essere usate come semplici espressioni.
Quando una
costante regexp compare da sola, ha lo stesso significato di quando
compare in un criterio di ricerca (cioè ‘($0 ~ /pippo/)’).
(a.b.)
Vedi la sezione Espressioni come criteri di ricerca.
Ciò vuol dire che i due frammenti di codice seguenti:
if ($0 ~ /barfly/ || $0 ~ /camelot/) print "trovato"
e:
if (/barfly/ || /camelot/) print "trovato"
sono esattamente equivalenti. Una conseguenza piuttosto bizzarra di questa regola è che la seguente espressione booleana è valida, ma non fa quel che probabilmente l’autore si aspettava:
# Notare che /pippo/ è alla sinistra della ~ if (/pippo/ ~ $1) print "trovato pippo"
Questo codice “ovviamente” intende verificare se $1
contiene
l’espressione regolare /pippo/
. Ma in effetti l’espressione
‘/pippo/ ~ $1’ significa realmente ‘($0 ~ /pippo/) ~ $1’. In altre
parole, prima confronta il record in input con l’espressione regolare
/pippo/
. Il risultato è zero o uno, a seconda che il confronto dia esito
positivo o negativo. Questo risultato
è poi confrontato col primo campo nel record.
Siccome è improbabile che qualcuno voglia mai fare realmente questo genere di
test, gawk
emette un avvertimento quando vede questo costrutto in
un programma.
Un’altra conseguenza di questa regola è che l’istruzione di assegnamento:
confronta = /pippo/
assegna zero o uno alla variabile confronta
, a seconda
del contenuto del record in input corrente.
Le espressioni regolari costanti possono essere usate anche come primo
argomento delle
funzioni gensub()
, sub()
, e gsub()
, come secondo argomento
della funzione match()
,
e come terzo argomento delle funzioni split()
e patsplit()
(vedi la sezione Funzioni di manipolazione di stringhe).
Le moderne implementazioni di awk
, incluso gawk
, permettono
di usare come terzo argomento di split()
una costante regexp, ma
alcune implementazioni più vecchie non lo consentono.
(a.b.)
Poiché alcune funzioni predefinite accettano costanti regexp come
argomenti, può generare confusione l’uso di costanti regexp come
argomenti di funzioni definite dall’utente
(vedi la sezione Funzioni definite dall’utente). Per esempio:
function mysub(modello, sostituzione, stringa, globale) { if (globale) gsub(modello, sostituzione, stringa) else sub(modello, sostituzione, stringa) return stringa }
{ … text = "salve! salve a te!" mysub(/salve/, "ciao", text, 1) … }
In quest’esempio, il programmatore vuol passare una costante regexp alla
funzione definita dall’utente mysub()
, che a sua volta la passa o a
sub()
o a gsub()
. Comunque, quel che realmente succede è che
al parametro modello
è assegnato un valore di uno o zero, a seconda
che $0
corrisponda a /salve/
o no.
gawk
emette un avvertimento quando vede una costante regexp
usata come parametro di una funzione definita dall’utente, poiché
passare un valore vero/falso in questo modo probabilmente non è quello che
si intendeva fare.
Successivo: Costanti regexp forti, Su: Usare le costanti regexp [Contenuti][Indice]