Perl considera tali i numeri ottali ed esadecimali solo quando compaiono
in maniera letterale all'interno del vostro programma. Gli ottali letterali
in perl devono iniziare con uno "0", mentre quelli esadecimali
devono essere preceduti da "0x". Se i valori vengono letti da qualche parte
e poi assegnati, non viene effettuata alcuna conversione. Dovete
esplicitamente usare oct() oppure hex() se desiderate che tali valori
siano convertiti in decimale. oct() interpreta sia numeri esadecimali
("0x350") che ottali ("0350" o anche senza lo zero all'inizio, come "377"),
mentre hex() converte solo gli esadecimali, con o senza "0x" all'inizio,
come "0x255", "3A", "ff", oppure "deadbeef". La conversione inversa da
decimale ad ottale può essere effettuata con i formati "%o" o "%O" di
sprintf(). Per convertire da decimale ad esadecimale provate i formati
"%x" o "%X" di sprintf().
Questo problema si presenta spesso quando si cercano di usare chmod(), mkdir(),
umask(), oppure sysopen(), a cui i permessi vengono forniti in ottale per diffusa tradizione.
chmod(644, $file); # SBAGLIATO
chmod(0644, $file); # corretto
Notate che l'errore nella prima linea è stato quello di specificare il
decimale 644, anziché l'ottale 0644. Il problema può essere
meglio osservato così:
printf("%#o",644); # stampa 01204
Sicuramente non intendevate eseguire chmod(01204, $file); - o sì?
Se volete usare valori numerici come argomenti a chmod() e simili,
cercate di esprimerli come ottali letterali, cioè con
uno zero all'inizio e con le cifre successive limitate all'intervallo
0..7.
|
|
AUTORE E COPYRIGHT
Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan
Torkington. Tutti i diritti riservati.
Questa documentazione è libera; puoi ridistribuirla e/o
modificarla secondo gli stessi termini applicati al Perl.
Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di
codice in questo file sono rilasciati al pubblico dominio. Potete, e
siete incoraggiati a farlo, utilizzare il presente codice o qualunque
forma derivata da esso nei vostri programmi per divertimento o per profitto.
Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese
ma non è obbligatorio. |