Newsgroup: it.comp.lang.perl
Titolo: Tempo dall'ultimo accesso a file. stat(xxx)[x]

Volendo ricavare i seguenti dati da un determinato file:
 1  Numero di inode
2  Tipo e permessi del file
3  Numero di link (non simbolici) al file
4  UID numerico del proprietario del file
5  GID numerico del gruppo a cui appartiene il file
6  Identificativo del device (applicabile solo ai file speciali)
7  Dimensione in byte del file
8  Timestamp contenente data ed ora dell'ultimo accesso al file
9  Timestamp contenente data ed ora dell'ultima modifica al file
10  Timestamp contenente data ed ora dell'ultimo cambiamento all'inode
11  Dimensione del blocco preferibile per l'input/output
12  Numero di blocchi allocati per il file
e volendo usare la funzione "stat"  ho notato che, mentre:
$b=(stat("/root/dati"))[7];
mi dà correttamente la dimensione in byte del file,
$b=(stat("/root/dati"))[9];
restituisce una timestamp consistente in un grosso numero decimale che
non so come trasformare in una qualsiasi unità di tempo.
Il quesito è, non solo come ottenere un dato leggibile, ma anche come
mai la dimensione in byte funziona e il tempo dall' ultimo accesso
al file no.
-----------------------
Avevo erroneamente aggiunto il  quesito al mio precedente thread "Il
fantasma". Lo ripropongo alla diretta attenzione di tutti in questo.
-
Qui si usa Linux.
http://www.puppylinux.org


Dal manuale (perldoc -f stat):
   9 mtime    last modify time in seconds since the epoch
"the epoch" rappresenta l'origine convenzionale dei tempi Unix,
consistente nelle 00:00:00 del primo gennaio del 1970. Quindi, il
"grosso numero decimale" è il numero di secondi passati a partire da
quella data (più o meno qualche secondo se non erro in relazione a non
ricordo cosa, ma niente di drammatico per applicazioni "pratiche",
guardati Wikipedia se sei curioso).
Per ottenere una data puoi usare localtime oppure gmtime; ad esempio:
   my $data_epoch = (stat('/root/dati'))[9];
   # Contesto scalare
   my $data_leggibile = localtime($data_epoch);
   # Contesto di lista
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
      localtime($data_epoch);
Consulta il manuale per sapere come utilizzarle (perldoc -f localtime
e perldoc -f gmtime).
Consiglio infine un'occhiata al modulo File::stat (distribuito insieme
a Perl da lungo tempo) e, per manipolazioni su date, DateTime.
Ciao,
   Flavio.

 ha scritto:
|Dal manuale (perldoc -f stat):
|
|   9 mtime    last modify time in seconds since the epoch
|
|"the epoch" rappresenta l'origine convenzionale dei tempi Unix,
|consistente nelle 00:00:00 del primo gennaio del 1970. Quindi, il
|"grosso numero decimale" è il numero di secondi passati a partire da
|quella data (più o meno qualche secondo se non erro in relazione a non
|ricordo cosa, ma niente di drammatico per applicazioni "pratiche",
|guardati Wikipedia se sei curioso).
|
|Per ottenere una data puoi usare localtime oppure gmtime; ad esempio:
|
|   my $data_epoch = (stat('/root/dati'))[9];
|   # Contesto scalare
|   my $data_leggibile = localtime($data_epoch);
|   # Contesto di lista
|   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
|      localtime($data_epoch);
|
|Consulta il manuale per sapere come utilizzarle (perldoc -f localtime
|e perldoc -f gmtime).
|
|Consiglio infine un'occhiata al modulo File::stat (distribuito insieme
|a Perl da lungo tempo) e, per manipolazioni su date, DateTime.
|
|Ciao,
|
|   Flavio.
Molte grazie. 
Quindi per trasformare una timestamp in data e ora
locali bisogna usare "localtime(timestamp)" .
come ad esempio: $a=localtime('2987654354') restituisce:Sun Jul 29 02:30:58 1928
--------------------
Con comodo bisognerebbe sapere qualcosa sul perché la stringa è in
inglese e non in italiano, sia come lingua che come formato. Ma nel
frattempo ho scoperto l'esistenza, sul terminale, di "perldoc", e spero
di scoprirne una versione italiana sul web. Saluti.
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
17/11/2009 ore 08:07:06

    Flavio.
Grazie mille. Dunque per tradurre una timestamp in linguaggio
umano (inglese): localtime(timestamp)
Ho scoperto solo adesso l'esistenza di "perldoc" sul terminale.
Saluti.
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://www.opera.com/browser