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 :

[Probléme] Fonction modification de date


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut [Probléme] Fonction modification de date
    Bonjour,
    ce que j'ai :
    $date="mer 29 jan 1986 00:00:00 "
    ce que je voudrai obtenir :
    #$date="jj/mm/AAAA"
    $date="29/01/1986"
    voici mon code :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    sub date_number() 
    {
    	my @text_date=@_;
    	my @tmp_tab=undef;
     
    	@tmp_tab=split(/ /,$text_date[0]);
     
    	if ($tmp_tab[2] eq "jan") {
    		$tmp_tab[2]=01;
    	}elsif($tmp_tab[2] eq "fév") {
    		$tmp_tab[2]=02;
    	}elsif($tmp_tab[2] eq "mar") {
    		$tmp_tab[2]=03;
    	}elsif($tmp_tab[2] eq "avr") {
    		$tmp_tab[2]=04;
    	}elsif($tmp_tab[2] eq "mai") {
    		$tmp_tab[2]=05;
    	}elsif($tmp_tab[2] eq "jun") {
    		$tmp_tab[2]=06;
    	}elsif($tmp_tab[2] eq "jui") {
    		$tmp_tab[2]=07;
    	}elsif($tmp_tab[2] eq "aoû") {
    		$tmp_tab[2]=08;
    	}elsif($tmp_tab[2] eq "sep") {
    		$tmp_tab[2]=09;
    	}elsif($tmp_tab[2] eq "oct") {
    		$tmp_tab[2]=10;
    	}elsif($tmp_tab[2] eq "nov") {
    		$tmp_tab[2]=11;
    	}elsif($tmp_tab[2] eq "déc") {
    		$tmp_tab[2]=12;
    	}
     
    	return $tmp_tab[1].'/'.$tmp_tab[2].'/'.$tmp_tab[3];
    }
    et l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $date=date_number($date);
    et le message d'erreur :
    Too many arguments for main::date_number at ./sybase.pl line 142, near "$date)"
    Execution of ./sybase.pl aborted due to compilation errors.
    la ligne 142 est l'appel de la fonction

    Je doit me tromper quelque part dans ma fonction ou mon appel mais je ne voit pas aider moi.
    D'avance merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Je corrige ta fonction :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    sub date_number() 
    {
    	my @text_date=@_;
    	my @tmp_tab=undef;
     
    	@tmp_tab=split(/ /,$text_date[0]);
     
    	if ($tmp_tab[2] eq "jan") {
    		$tmp_tab[2]='01';
    	}elsif($tmp_tab[2] eq "fév") {
    		$tmp_tab[2]='02';
    	}elsif($tmp_tab[2] eq "mar") {
    		$tmp_tab[2]='03';
    	}elsif($tmp_tab[2] eq "avr") {
    		$tmp_tab[2]='04';
    	}elsif($tmp_tab[2] eq "mai") {
    		$tmp_tab[2]='05';
    	}elsif($tmp_tab[2] eq "jun") {
    		$tmp_tab[2]='06';
    	}elsif($tmp_tab[2] eq "jui") {
    		$tmp_tab[2]='07';
    	}elsif($tmp_tab[2] eq "aoû") {
    		$tmp_tab[2]='08';
    	}elsif($tmp_tab[2] eq "sep") {
    		$tmp_tab[2]='09';
    	}elsif($tmp_tab[2] eq "oct") {
    		$tmp_tab[2]='10';
    	}elsif($tmp_tab[2] eq "nov") {
    		$tmp_tab[2]='11';
    	}elsif($tmp_tab[2] eq "déc") {
    		$tmp_tab[2]='12';
    	}
     
    	return $tmp_tab[1].'/'.$tmp_tab[2].'/'.$tmp_tab[3];
    }
    J'ai juste mis entre ' ' les n° de mois car la valeur 01 pour janvier, écrite telle quelle, Perl ne doit pas aimer

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Toujours même message
    Too many arguments for main::date_number at ./sybase.pl line 142, near "$date)"
    Execution of ./sybase.pl aborted due to compilation errors.
    je pense que c'est la base de ma variable
    $date="mer 29 jan 1986 00:00:00 "
    dans ma fonction elle ne doit pas trouver les bons champs
    (c'est une supposition)

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    J'ai pris la peine de revoir ta fonction date_number qui maintenant, renvoit soit une date correctement formatée, soit 0. Tu peux donc tester son retour et voir s'il faut poursuivre le traitement ou non.

    Voilà la fonction :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    sub date_number() 
    {
    	my $RawDate = shift();
     
    	my %ConversionMonth;
    		$ConversionMonth{'jan'} = "01";
    		$ConversionMonth{'fév'} = "02";
    		$ConversionMonth{'mar'} = "03";
    		$ConversionMonth{'avr'} = "04";
    		$ConversionMonth{'mai'} = "05";
    		$ConversionMonth{'jun'} = "06";
    		$ConversionMonth{'jui'} = "07";
    		$ConversionMonth{'aoû'} = "08";
    		$ConversionMonth{'sep'} = "09";
    		$ConversionMonth{'oct'} = "10";
    		$ConversionMonth{'nov'} = "11";
    		$ConversionMonth{'déc'} = "12";
     
    	#mer 29 jan 1986 00:00:00 
    	if ($RawDate =~ /.+ +([0-9]{1,2}) +(.+) +([0-9]{4,4}).+/)
    	{
    		my $day = $1;
    		my $month = $ConversionMonth{$2};
    		my $year = $3;
     
    		if (! $month)
    		{
    			print "ERREUR lors de la recuperation de la date : mois non reconnu !\n";
    			return 0;
    		}
     
    		return "$day/$month/$year";
    	}
    	else
    	{
    		print "ERREUR format de date non reconnu\n";
    		return 0;
    	}
    }
    Et son application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use strict;
    use warnings;
     
    $_ = &date_number("mer 29 jan 1986 00:00:00") or die ("pb lors de la recup de la date !\n");
     
    print "$_\n";
    Ce qui donne en résultat :


  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Merci parfait que ferai-je sans toi

    Juste une explication sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($RawDate =~ /.+ +([0-9]{1,2}) +(.+) +([0-9]{4,4}).+/)
    POur le reste je comprend

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par maloute80 Voir le message
    Merci parfait que ferai-je sans toi

    Juste une explication sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($RawDate =~ /.+ +([0-9]{1,2}) +(.+) +([0-9]{4,4}).+/)
    POur le reste je comprend
    Cette ligne est une recherche par le biais d'une expression régulière simple.

    En gros, ça donne ceci :

    si $RawDate contient une chaine de caractère, puis un (ou plusieurs) espaces, puis 1 ou 2 nombres, puis un (ou plusieurs) espaces, puis une chaine de caractères, puis un (ou plusieurs) espaces, puis 4 nombres, puis une chaine de caractères.

    Les 3 choses indiquées en gras représentent exactement ce que tu recherches : le jour (sur 1 ou 2 chiffres), le mois sur 3 caractères et l'année sur 4 chiffres. Ces 3 valeurs sont ensuite mémorisées respectivement dans les variables temporaires $1, $2 et $3.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    merci je comprend mieux maintenant merci pour tout Arioch

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Pourquoi, mais pourquoi mettre un prototype vide à cette fonction !! Omettre le "()" aurait suffit à régler le problème.


    Citation Envoyé par Arioch Voir le message
    Et son application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_ = &date_number("mer 29 jan 1986 00:00:00") or die ("pb lors de la recup de la date !\n");
    Ce "&" avant date_number() n'est nécessaire que pour ignorer le prototype erroné que vous avez donné à date_number(), sinon il ne fait qu'obscurcir le code.

    N'utilisez pas de prototypes si vous ne savez pas vous en servir !!

    --
    Jedaï

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Merci Jedai je vais essayer ce que tu ma proposer même si la solution de Arioch fonctionne si cela peu me permettre de reduire mon code

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

Discussions similaires

  1. [Vba-E]Problème fonction Date
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/05/2007, 10h01
  2. [Dates] problème fonction setlocale()
    Par oceane751 dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2007, 00h48
  3. [Dates] problème fonction rand()
    Par eacute dans le forum Langage
    Réponses: 3
    Dernier message: 09/12/2006, 13h12
  4. fonction modification de date
    Par cormami dans le forum Access
    Réponses: 2
    Dernier message: 03/08/2006, 13h57
  5. Réponses: 19
    Dernier message: 28/10/2005, 17h29

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