Successivo: , Su: Usare le costanti regexp   [Contenuti][Indice]


6.1.2.1 Costanti regexp normali in 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: , Su: Usare le costanti regexp   [Contenuti][Indice]