Successivo: , Precedente: , Su: Spazi-dei-nomi   [Contenuti][Indice]


15.7 Esempio di codice che usa uno spazio-dei-nomi

L’esempio seguente è una versione riveduta dell’insieme di script sviluppati in Leggere la lista degli utenti; lì si può trovare la descrizione del funzionamento del codice.

Questa riformulazione, opera principalmente di Andrew Schorr, è piuttosto elegante. Tutte le funzioni e le variabili di implementazione sono nello spazio-dei-nomi passwd, mentre le funzioni principali di interfaccia sono definite nello spazio-dei-nomi awk.

# ns_passwd.awk --- accedere alle informazioni del file delle password

@namespace "passwd"

BEGIN {
    # modificare per adattarlo al sistema in uso
    Awklib = "/usr/local/libexec/awk/"
}

function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
{
    if (Inizializzato)
        return

    oldfs = FS
    oldrs = RS
    olddol0 = $0
    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
    using_fpat = (PROCINFO["FS"] == "FPAT")
    FS = ":"
    RS = "\n"

    pwcat = Awklib "pwcat"
    while ((pwcat | getline) > 0) {
        Byname[$1] = $0
        Byuid[$3] = $0
        Bycount[++Totale] = $0
    }
    close(pwcat)
    Contatore = 0
    Inizializzato = 1
    FS = oldfs
    if (using_fw)
        FIELDWIDTHS = FIELDWIDTHS
    else if (using_fpat)
        FPAT = FPAT
    RS = oldrs
    $0 = olddol0
}

function awk::getpwnam(nome)
{
    Init()
    return Byname[nome]
}

function awk::getpwuid(uid)
{
    Init()
    return Byuid[uid]
}

function awk::getpwent()
{
    Init()
    if (Contatore < Totale)
        return Bycount[++Contatore]
    return ""
}

function awk::endpwent()
{
    Contatore = 0
}

Come si può vedere, questa versione segue anche la convenzione menzionata in Dare un nome a variabili globali in funzioni di libreria, secondo la quale i nomi di funzione e le variabili globali iniziano con la lettera maiuscola.

Quel che segue è un semplice programma di test. Poiché è in un file separato, gli identificativi non qualificati saranno ricercati all’interno dello spazio-dei-nomi awk:

BEGIN {
    while ((p = getpwent()) != "")
        print p
}

Ecco cosa succede quando il programma viene eseguito:

$ gawk -f ns_passwd.awk -f testpasswd.awk
-| root:x:0:0:root:/root:/bin/bash
-| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
-| bin:x:2:2:bin:/bin:/usr/sbin/nologin
-| sys:x:3:3:sys:/dev:/usr/sbin/nologin
…

Successivo: , Precedente: , Su: Spazi-dei-nomi   [Contenuti][Indice]