Restituisce una lista di 13 elementi che forniscono le informazioni di stato per un file, sia
che il file sia aperto tramite FILEHANDLE, sia che venga fissato da ESPR. Se ESPR viene omessa,
stat viene eseguito su $_. Restituisce una lista nulla se la stat fallisce.
Viene tipicamente usata nella maniera seguente:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($nomefile);
Va notato che tutti i campi sono supportati su tutti i tipi di filesystem. Ecco i significati dei campi:
0 dev numero di device del filesystem 1 ino numero di inode 2 mode modalitE<agrave> del file (tipo e permessi) 3 nlink numero di (hard) link al file 4 uid ID numerico dell'utente del proprietario del file 5 gid ID numerico del gruppo del proprietario del file 6 rdev l'identificativo di device (solo file speciali) 7 size dimensione totale del file, in byte 8 atime istante in secondi dell'ultimo accesso dall'epoch 9 mtime istante in secondi dell'ultima modifica dall'epoch 10 ctime istante in secondi di modifica dell'inode dall'epoch (*) 11 blksize dimensione preferita dei blocchi per l'I/O del filesystem 12 blocks numero di blocchi realmente allocati
(L'epoch è stato alle 00:00 del 1 gennaio 1970 GMT).
(*) Non tutti i campi sono supportati da tutti i tipi di filesystem. Degno di nota il fatto che il campo ctime non è portabile. In particolare non ci si può aspettare esso sia un "tempo di creazione", si veda perlport/"Files and Filesystems" ["File e Filesystem", NdT] per dettagli.
Se a stat viene passato lo speciale filehandle che consiste in un carattere di sottolineatura,
non viene eseguita alcuna stat ma vengono restituiti i contenuti correnti della struttura di
stat provenienti dall'ultima stat, lstat o filestat. Ad esempio:
if (-x $file && (($d) = stat(_)) && $d < 0) {
print "$file E<egrave> un file NFS eseguibile\n";
}
(Questo funziona solo su elaboratori per i quali il numero di device è negativo sotto NFS).
Visto che la modalità contiene sia il tipo di file che i suoi permessi, se volete
vedere gli effettivi permessi dovreste mascherare la porzione relativa al tipo di file e
utilizzare (s)printf usando un "%o".
$modalita = (stat($nomefile))[2];
printf "I permessi sono %04o\n", $modalita & 07777;
In un contesto scalare, stat restituisce un valore booleano che indica il
successo o l'insuccesso e, in caso di succcesso, imposta l'informazione associata con lo
speciale filehandle _.
Il modulo File::stat fornisce un conveniente meccanismo di accesso mediante nome:
use File::stat;
$sb = stat($nomefile);
printf "File is %s, size is %s, perm %04o, mtime %s\n",
$nomefile, $sb->size, $sb->mode & 07777,
scalar localtime $sb->mtime;
Potete importare le costanti (S_IF*) e funzioni (S_IS*) delle
modalità simboliche, dal modulo Fcntl:
use Fcntl ':mode';
$modalita = (stat($nomefile))[2];
$utente_rwx = ($modalita & S_IRWXU) >> 6;
$gruppo_lettura = ($modalita & S_IRGRP) >> 3;
$altri_esecuzione = $modalita & S_IXOTH;
printf "I permessi sono %04o\n", S_IMODE($modalita), "\n";
$e_setuid = $mode & S_ISUID;
$e_setgid = S_ISDIR($modalita);
Potete scrivere le ultime due utilizzando gli operatori -u e -d. Le costanti S_IF*
comunemente disponibili sono
# Permessi: lettura, scrittura, eseczuione, per l'utente, gruppo, altri.
S_IRWXU S_IRUSR S_IWUSR S_IXUSR
S_IRWXG S_IRGRP S_IWGRP S_IXGRP
S_IRWXO S_IROTH S_IWOTH S_IXOTH
# Setuid/Setgid/Relativo allo sticky bit/SaveText.
# Va notato che l'esatto significato di questi, e` dipendente dal sistema.
S_ISUID S_ISGID S_ISVTX S_ISTXT
# Tipi di file. Non tutti sono necessariamente disponibili sul vostro sistema.
S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
# Le seguenti sono alias di compatibilita` per S_IRUSR, S_IWUSR, S_IXUSR.
S_IREAD S_IWRITE S_IEXEC
e le funzioni S_IF* sono
S_IMODE($modalita) la parte di $modalita contenente i bit dei permessi
e i bit di setuid/setgid/sticky
S_IFMT($modalita) la parte di $modalita contenente il tipo del file
che puo` essere fatta oggetto di un and su bit con ad esempio
S_IFREG o con le seguenti funzioni
# Gli operatori -f, -d, -l, -b, -c, -p e -S.
S_ISREG($modalita) S_ISDIR($modalita) S_ISLNK($modalita)
S_ISBLK($modalita) S_ISCHR($modalita) S_ISFIFO($modalita) S_ISSOCK($modalita)
# Non esiste una controparte all'operatore -X ma, per il primo,
# l'operatore -g e` spesso equivalente. L'ENFMT sta per
# record flocking enforcement [l'applicazione forzata del flock ad un record, NdT],
# una caratteristica indipendente dalla piattaforma.
S_ISENFMT($modalita) S_ISWHT($modalita)
Consultate la vostra documentazione locale di chmod(2) e stat(2) per maggiori dettagli sulle
costanti S_*. Per ottenere l'informazione dello stato per un link simbolico, utilizzate la
funzione lstat invece del file puntato dal link.