IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Modifier un objet


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut Modifier un objet
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    use DateTime::Format::Duration;
     
    my $debut = 
    DateTime->new(
    year=>"2012", month=>"7", day=>"2", 
    hour=>"19", minute=>"0", second=>"0");
     
    $debut->month = "6";
    m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't modify non-lvalue subroutine call at ./test.pl line 272.
    Comment puis-je résoudre ce problème?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Bonjour,

    Pour pouvoir modifier un ou plusieurs champs d'un objet DateTime, il faut utiliser les fonctions appelés "setters" (ou set). Les "getters" (ou get) ne sont fait que pour accéder à une valeur, pas la modifier. Regarde du côté des fonctions get et set du module DateTime pour avoir des exemples.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    use strict;
    use warnings;
    use DateTime;
     
    my $debut = DateTime->new(year=>2012,
    			  month=>7,
    			  day=>2,
    			  hour=>19,
    			  minute=>0,
    			  second=>0);
     
    print "Before => month = ".$debut->month."\n"; # On accède à la valeur du mois => 7
     
    $debut->set_month(6); # On modifie la valeur pour le mois ( 7 => 6)
     
    print "After => month = ".$debut->month."\n"; # On accède à la valeur du mois qui vient d'être changée => 6

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Merci.

    Ma situation est en fait différente et plus complexe.
    Voici un extrait simplifié de mon algorithme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $debut = 
    DateTime->new(
    year=>"$an", month=>"$mois", day=>"$jour", 
    hour=>"$heure", minute=>"$minute", second=>"$seconde");
     
    my $fin = 
    DateTime->new(
    year=>"$an", month=>"$mois", day=>"$jour",
    hour=>"$heure", minute=>"$minute", second=>"$seconde");
     
    my $val = $fin->subtract_datetime($debut);
    $val = $val->add_duration($hash{$util});
    où $hash{$util} contient le résultat d'un 'subtract_datetime' précédent.

    Mon premier problème est que j'obtiens des valeurs telles que : 0 jours, 30 heures, 2 minutes, 70 secondes
    alors que j'aimerai obtenir : 1 jour, 6 heures, 3 minutes, 10 secondes.
    Et ce problème provient de 'add_duration' qui ne convertit pas les 70 secondes en 1minutes10 par exemple.

    Je voulais donc modifier ses valeurs manuellement, de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (($val->seconds) >= 60) {
    $val = $val - 60;
    ($val->minutes)++;
    }
    while (($val->minutes) >= 60) {
    $val->minutes = $val->minutes - 60;
    ($val->hours)++;
    }
    while (($val->hours) >= 24) {
    $val->hours = $val->hours - 60;
    ($val->days)++;
    }
    D'où mon post précédent, mais je viens de me rendre compte que le "set" ne peut pas marcher car 'add_duration' me donne un objet DateTime:uration et non pas un objet DateTime.

    Je suis donc preneur d'une quelconque solution, même d'une solution se passant de 'add_duration' par exemple, et donc de contourner ce problème.

    Merci d'avance.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Ne serait-il pas plus simple de tout convertir en secondes, de faire les additions au fur et à mesure en secondes et, à la fin seulement, de reconvertir en JHMS?

    Plusieurs fonctions permettent de convertir les dates en secondes depuis l'Epoque (la date origine du système). On peut donc faire aussi bien les soustractions (pour calculer les durées de chaque session) que les additions (pour cumuler les durées de connexion) en secondes.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Par défaut
    Oui exact, je vais m'orienter vers cette méthode, merci.

    Mon code devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    my $debut = 
    DateTime->new(
    year=>"$an", month=>"$mois", day=>"$jour", 
    hour=>"$heure", minute=>"$minute", second=>"$seconde");
     
    my $fin = 
    DateTime->new(
    year=>"$an", month=>"$mois", day=>"$jour",
    hour=>"$heure", minute=>"$minute", second=>"$seconde");
     
    my $debut_secondes = ?
    my $fin_secondes = ?
     
    my $val_secondes = ($fin_secondes - $debut_secondes) + $hash{$util};
     
    my $val = ?
    Ma question est donc : quelle fonction utiliser pour convertir une DateTime en secondes et inversement ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Regarde notamment les fonctions timelocal et timegm du module standard Time::Local, qui convertissent des dates en secondes ecoulées depuis la date origine.

    Pour la conversion inverse de durées en seconde en JHMS, je ne sais pas s'il existe une fonction toute faite dans l'un des nombreux modules Time:xx, mais c'est assez facile à coder soi-même car il n'y a plus de difficultés liées au calendrier.

    Tu peux coder quelque chose comme cela (non testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub convert_sec {
         my $delta = shift; # l'argument de la fonction est la durée de connexion en secondes
         my $secondes = $delta % 60;
         $delta = ($delta - $secondes) /60;
         my $minutes = $delta % 60;
         $delta = ($delta - $minutes) /60;
         my $heures = $delta % 24;
         $delta = ($delta - $heures) /24;
         my $jours = $delta % 24;
        return ($jours, $heures, $minutes, $secondes);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Modifier un objet [références]
    Par MorganStern dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2007, 12h44
  2. Réponses: 6
    Dernier message: 08/12/2006, 03h13
  3. [vb.net]modifier un objet dans un arrayList
    Par Golzinne dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/10/2006, 13h23
  4. Réponses: 6
    Dernier message: 21/05/2006, 20h37
  5. Modifier un objet dhtml
    Par roger_owc dans le forum ASP
    Réponses: 1
    Dernier message: 26/08/2005, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo