Newsgroup: it.comp.lang.perl
Titolo: timestamps più recenti

Salve,
     ho una cartella dove vengono uploadate periodicamente ogni 10 
secondi delle immagini png. Ora vorrei prendere in considerazione solo 
la più recente (timestamp più vicino a time) ... secondo voi qual'è la 
migliore soluzione?
Dato che arrivano ogni 10 secondi (un immagine a 10 secs di distanza 
dall'altra) dovrei vedere qual'è che ha il ((time - timestamp) <= 10) ? 
cmq se non vengono uploadate devo tuttavia prendere la più recente...in 
oltre tutte quelle che vengono scartate devono essere eliminate...
qualche idea?
...la prima cosa che mi viene in mente sarebbe la seguente:
#!/perl
use strict;
use warnings;
use File::stat;
my @images = <*.png>;
foreach my $image (@images)
{
   my $sb = stat($image);
 
   if ( (time - $sb->mtime) < 10 ) # ? boh ?
   {
      push @ok , $image;
   } else {
      push @no, $image;
   }
}
# cancella tutte le immagini in @no
# le immagini in @ok vanno bene...
# ma se non c'è nessuna immagine che rientra in (time - $sb->mtime) < 10 
) come faccio a prendere cmq la più recente?
grazie

 migliore soluzione?
Trovato!!!
    tuttavia non viene fatto in perl ma tramite il comando "ls" di unix:
#!/usr/bin/perl
use strict;
use warnings;
my ($latest) = qx(ls -1t ~/images); chomp($latest);
print "$latest\n";
# $latest contiene l'immagine piů recentemente uploadata...

) come faccio a prendere cmq la più recente?
Invece di prendere quella di 10 secondi fa e poi cercare la più
recente, prendi innanzi tutto la più recente e poi controlla se è di
dieci secondi fa.
L'algoritmo può variare, anche in dipendenza dal sistema operativo
sotto cui lavori (se, per esempio, è in grado di fornirti nativamente
la lista di file già ordinata per data), ma il succo è questo: ottieni
o costruisci la lista dei file ordinata dal più al meno recente e la
scorri conservando o scartando quello che c'è da scartare o
conservare. Se il sistema operativo non ti aiuta, puoi ordinare un
hash o un array con i nomi e le date dei file.
Ciao.

 ) come faccio a prendere cmq la più recente?
Come hai poi notato nella tua soluzione con il comando ls, i 10
secondi non hanno nulla a che vedere con il  problema, che può essere
sintetizzato in "devo prendere il nome del file più recente
all'interno di una directory". E' conveniente riflettere su questo
tipo di implicazioni, perché come vedi hai provato a dare una
soluzione piuttosto complicata che, alla fine, risolveva solamente una
parte del problema.
La tua soluzione con ls è ovviamente comoda e non è in sé sbagliata;
ovviamente soffre di alcune pecche "architetturali", tipo la non
portabilità, il fatto di doversi affidare ad un processo esterno per
qualcosa che può essere fatto tranquillamente da dentro Perl, e così
via. Personalmente, avrei probabilmente fatto qualcosa tipo:
# CODICE NON PROVATO!!!
if (@images) {
   my $best = shift @images;
   my $best_mtime = stat($image)->mtime();
   for my $image (@images) { # confronta con le altre
      my $mtime = stat($image)->mtime();
      if ($mtime > $best_mtime) {
         $best = $image;
         $best_mtime = $mtime;
      }
   }
# ora $best contiene il nome dell'immagine più recente
}
Se però a te va bene... ok! :)
Ciao,
   Flavio.

 }
Mi piace proprio questo codice, mi fa pensare agli ordinamenti a bolla 
in qui ad uno ad uno il valore giusto prima o poi salta fuori...
Io avevo anche pensato di fare una hash con nome file e mtime e poi 
ordinare in base a mtime...
sono curioso ora di cronometrare entrambi gli scripts!
grazie