Newsgroup: it.comp.lang.perl
Titolo: effetto strano

Ciao a tutti.
ho necessita' di ottenere la data in formato gg mm e di incrementare poi il
giorno,verificando se fine mese e quindi ripartire da 1.
ho buttato giu' un po di righe (scusate la forma ma sono un neofita) che
pare funfionino, ma ottengo uno strano effetto e cioe'
la numerazione e' giusta per i primi 2 (dopo la fine mese cioe' a 4 cifre)
poi passa a 3 cifre g mm ?
dove sbaglio?
ecco il listato
$a = 28;
$b = '01';
$c = $a.$b;
print "quanti giorni vuoi contare ?";
print " \n";
chop($gg=<stdin>);
while ($gg >0) {
 $a ++;
 if ($a > 31){
     $a = '01';
     $b ++;
     $c = $a.$b;
     print "\t\t\t $c\n";
 }
 $c = $a.$b;
 print $c;
 $gg --;
 print " \n";
 }
Grazie e ciao

 poi passa a 3 cifre g mm ?
Non so se ho capito e poi anch'io sono un novellino, prova così:
$day = <STDIN>;
@array = localtime(time + $day * 86400);
print sprintf("%02d %02d\n", $array[3], $array[4] + 1);
Ciao
Massimo



Dalla tua mail non si capisce se devi lavorare con la data di oggi o
con delle date in generale che ottieni in forma numerica da una
qualche fonte.
In questo secodo caso, il problema occorre nel punto in cui scrivi:
$a++;
Infatti in questo caso il valore '01' da te impostato come stringa
viene convertito in numero e diviene '2'.
Il tuo codice potrebbe essere riscritto grosso modo in questa forma:
$a = 28;
$b = '01';
$c = $a.$b;
print "quanti giorni vuoi contare ?";
print " \n";
chop($gg=<stdin>);
while ($gg >0) {
  ($a > 31)?$a++:$a=1;
  $a='0$a' if ($a<10;
  print "\t\t\t $a$b\n";
}
$gg --;
print " \n";
}		
Spero di esserti stato utile.
Dominic Flandry
Scrivimi a: giovan.s(lumachina)
libero.it
"Prima che la Lunga Notte scenda"

  $a='0$a' if ($a<10;
Che va invece scritto come:   $a='0$a' if ($a<10);
Inoltre non volevo dire che il problema si verifica solo se non lavori
con la data odierna, volevo dire che nella risposta non ho messo
riferimenti a 'time' e 'localtime'.
Ciao


 $a='0$a' if ($a<10;
Naaa... che brutto...
$a=sprintf('%02d',$a);
-- 
Saluti,
Giancarlo


wrote:

Effettivamente, giusto per non chiamare la printf
lo si potrebbe dire cosi:
$a =~ s/^(\d)$/0$1/;
Qualcuno sa se costa di piu' (in termini di efficienza) la sprintf o
le regexp?


 le regexp?
Penso sia piu' efficiente la regex, magari di poco, pero' sprintf e', 
IMHO, piu' "adatta" a fare questo lavoro.
-- 
Saluti,
Giancarlo

 IMHO, piu' "adatta" a fare questo lavoro.
sbagliato, è decisamente più efficiente sprintf:
    use Benchmark;
    sub test_sprintf {
        for my $i (0..99) {
            my $a = sprintf("%02d", $i);
        }
    }
    sub test_regex {
        for my $i (0..99) {
            (my $a = $i) =~ s/^(\d)$/0$1/;
        }
    }
    timethese( 10_000, {
        sprintf => 'test_sprintf',
        regex   => 'test_regex',
    });
mi dà come risultato:
  Benchmark: timing 10000 iterations of regex, sprintf...
     regex:  4 wallclock secs ( 3.92 usr +  0.00 sys =  3.92 CPU) @
2554.28/s
   sprintf:  3 wallclock secs ( 2.41 usr +  0.03 sys =  2.44 CPU) @
4091.65/s
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;

 
Che infatti avvicina, percentualmente i due risultati, io trovo:
Benchmark: timing 10000 iterations of regex, sprintf...
     regex:  3 wallclock secs ( 2.09 usr +  0.00 sys =  2.09 CPU) @ 
4784.69/s (n=10000)
   sprintf:  1 wallclock secs ( 1.59 usr +  0.00 sys =  1.59 CPU) @ 
6289.31/s (n=10000)
Comunque sia, io non ne faccio una quastione di efficienza (la 
differenza non e' poi cosi'rlevante in fondo) ma di correttezza: 
sprintf server a fare quello allora usiamola, d'accordo che TIMTOWTDT, 
ma senza esagerare :-)
Comunque, tanto per giocare, che ne dite di queste allora:
$i+=100;
$i=~/^1//;
oppure
$i='0' x (2-length($i)) . $i;
(con sorpresa troco che questa ultima e' poco piu' lenta della 
sprintf....)
il risultato e' sempre lo stesso lo stesso :-)
-- 
Saluti,
Giancarlo