Successivo: Funzione join, Precedente: Funzione random Cliff, Su: Funzioni di tipo generale [Contenuti][Indice]
Un’implementazione commerciale di awk fornisce una funzione
predefinita ord(), che prende un carattere e restituisce il valore
numerico per quel carattere nella rappresentazione dei caratteri
di quella particolare macchina. Se la
stringa passata a ord() ha più di un carattere, viene usato solo il
primo.
L’inverso di questa funzione è chr() (dalla funzione con lo stesso nome
in Pascal), che, dato un numero, restituisce il corrispondente carattere.
Entrambe le funzioni si possono scrivere molto bene usando awk;
non vi è nessun reale motivo per inglobarle come funzioni predefinite
awk:
# ord.awk --- implementa ord e chr
# Identificativi globali:
# _ord_: valori numerici indicizzati da caratteri
# _ord_init: funzione per inizializzare _ord_
BEGIN { _ord_init() }
function _ord_init( basso, alto, i, t)
{
basso = sprintf("%c", 7) # BEL è ascii 7
if (basso == "\a") { # ascii regolare
basso = 0
alto = 127
} else if (sprintf("%c", 128 + 7) == "\a") {
# ascii, con il primo bit a 1 (mark)
basso = 128
alto = 255
} else { # ebcdic(!)
basso = 0
alto = 255
}
for (i = basso; i <= alto; i++) {
t = sprintf("%c", i)
_ord_[t] = i
}
}
Alcune spiegazioni riguardo ai numeri usati da _ord_init()
non guastano.
La serie di caratteri più importante oggi in uso è nota come
ASCII.70
Sebbene un byte a
8 bit possa contenere 256 valori distinti (da 0 a 255), ASCII definisce solo i
caratteri che usano i valori da 0 a 127.71 Nel lontano passato,
almeno un produttore di microcomputer
ha usato ASCII, ma con una parità di tipo mark, cioè con il bit più a
sinistra sempre a 1. Questo significa che su questi sistemi i caratteri
ASCII hanno valori numerici da 128 a 255.
Infine, i grandi elaboratori centrali usano la serie di caratteri EBCDIC, che
prevede tutti i 256 valori.
Ci sono altre serie di caratteri in uso su alcuni sistemi più vecchi, ma non
vale la pena di considerarli:
function ord(str, c)
{
# solo il primo carattere è d'interesse
c = substr(str, 1, 1)
return _ord_[c]
}
function chr(c)
{
# trasforma c in un numero aggiungendo uno 0
return sprintf("%c", c + 0)
}
#### programma di verifica ####
# BEGIN {
# for (;;) {
# printf("immetti un carattere: ")
# if (getline var <= 0)
# break
# printf("ord(%s) = %d\n", var, ord(var))
# }
# }
Un ovvio miglioramento a queste funzioni è quello di spostare il codice per la
funzione _ord_init nel corpo della regola BEGIN.
Il programma è
stato scritto inizialmente in questo modo per comodità di sviluppo.
C’è un “programma di verifica” in una regola BEGIN, per verificare
la funzione. È commentato, per poter essere eventualmente usato in produzione.
La situazione sta però cambiando: molti sistemi usano Unicode, una serie di caratteri molto ampia che comprende ASCII al suo interno. Nei sistemi che supportano interamente Unicode, un carattere può occupare fino a 32 bit, facendo diventare i semplici test usati qui eccessivamente complessi.
ASCII
è stato esteso in molti paesi per usare i valori da 128 a 255 includendo
i caratteri specifici del paese. Se il sistema in uso si avvale di queste
estensioni, si può semplificare _ord_init() per eseguire un ciclo da
0 a 255.
Successivo: Funzione join, Precedente: Funzione random Cliff, Su: Funzioni di tipo generale [Contenuti][Indice]