2010-10-11 4 views
1

Dans mon script que je dois faire un cycle comme celui-ci:Comment modifier un objet Perl DateTime?

use DateTime; 
for $j(0..3){ 
    my ($date) = DateTime->now->ymd; 
    my ($k) = 0; 
    while($k <= $j){ 
     $date = ($date->subtract(days => 7)); 
     $k++; 
    } 
print "$date\n"; 
} 

qui devrait obtenir la date actuelle, puis il y a une semaine, etc. Malheureusement, après avoir obtenu la date correcte, il ne fonctionne pas et je ne sais pas ce qui ne va pas.

Error message is "Can't call method "subtract" without a package or object reference [...]", 

mais je n'ai aucune idée de comment résoudre ce problème.

Si possible, je souhaite continuer à utiliser DateTime ou à le remplacer par un autre module (éventuellement pas plus d'un).

+1

Où est fixé $ j? –

+0

Désolé, l'a écrit sans copier. $ i est $ j. – Gurzo

+1

Cette boucle while est mieux écrite 'for (0 .. $ j) {...}' – Ether

Répondre

9

Datetime->now->ymd est un scalaire (une chaîne, il apparaît), pas un objet/une référence. Vous ne pouvez pas appeler le subtract car il n'existe pas. Vous voudrez probablement juste essayer d'omettre la partie ymd lorsque vous attribuez à $date:

my ($date) = DateTime->now; 
... 

for(0..$j) { 
    $date = ($date->subtract(days => 7)); 
} 

... 

Si vous souhaitez accéder à la valeur ymd, faites-le après avoir créé l'objet:

my ($date) = DateTime->now; 
... 
my ($ymd) = $date->ymd; 

Voir la page CPAN pour plus d'informations.

+0

Oui, j'ai foiré ça. =) Merci – Gurzo

6

Si vous avez essayé d'utiliser Data::Dumper sur $date, vous voyez immédiatement quel est le problème: $date est une chaîne, pas un objet. Vous devriez retarder l'appel ymd() jusqu'à ce que vous ayez besoin de le strier.

use strict; 
use warnings; 

use DateTime; 

for my $j (0..3) 
{ 
    my $date = DateTime->now; 
    $date = $date->subtract(days => 7) for (0 .. $j); 
    print $date->ymd, "\n"; 
} 

PS. Ce code peut être encore plus simplifié en combinant les boucles:

my $date = DateTime->now; 
for my $weeks (0..4) 
{ 
    print $date->ymd, "\n"; 
    $date = $date->subtract(days => 7);  
} 
+0

Est-ce que c'est juste cette semaine, ou y at-il eu une acculumation constante de questions par des gens qui ne prennent même pas la peine d'inspecter des valeurs ou de tenter quoi que ce soit de déboguer leurs problèmes? Cela me semble vraiment étrange, car dans la plupart des cas, le niveau de compétence du questionneur semble indiquer qu'il devrait savoir ce genre de choses. –

+0

@brian: il semble qu'il y ait eu une légère hausse ces derniers temps. Je me demande si cela a à voir avec la nouvelle année scolaire qui commence (dans l'hémisphère nord). – Ether

3

Il est préférable de faire l'AMJ lors de l'impression, après les calculs et le travail sur l'objet Date.

Voyez la différence lors du passage quand ymd et subtract sont appelés:

#!/usr/bin/perl -w  

use strict;  
use Data::Dumper; 
use DateTime; 

    sub main{ 
     my $date = DateTime->now->subtract(days=>7)->ymd; 
     print "$date\n\n"; 
    }  

    main(); 
Questions connexes