Question programmation PERL

lavm01 Messages postés 72 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour, j'ai une petite question de programmation PERL. Voici un bout de mon code et plus bas je vous explique qu'est-ce que je veux faire.

$joursec = 0;
$jf="Non Ferie";
$caldat = time() - $joursec;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($caldat);
$wday=$wday;
$RTJOUR=(qw(Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi))[$wday];
$year=$year+1900;
$mon = sprintf("%02d", $mon+1); # Convert to 2-digit 1-based $mday.
$mday = sprintf("%02d", $mday); # Convert to 2-digit $mday.

$DATE1=("$year-$mon-$mday");

open (TL, "$FICHTOLIST"); #fichier de format txt qui contient des dates un en dessous de l'autre.
@CVectolist=<TL>;
close(TL);
@FERIE=("2006-01-02","2005-01-03","2006-04-14","2006-04-17","2006-05-22","2006-06-23","2006-06-30","2006-09-04","2006-10-09","2006-12-22","2006-12-25","2006-12-26","2006-12-29","2007-01-01","2007-01-02","X");
foreach $jferie (@CVectolist) {
#print "Le jferie:$jferie et la DATE1:$DATE1\n";
if ($jferie eq $DATE1) {
print "je suis dans le eq\n";
$jf="Ferie";
$DATE1=("$year-$mon-$mday");
}
}

Ce que je veux faire, c'est de reproduire le tableau @FERIE mais a partir d'un fichier TXT. Comme vous le voyez ci-haut je fais un open sur mon fichier TXT et je le mets dans un tableau. Mais quand je fais mon foreach avec ce tableau, un fois rendu au if il ne fait pas la condition par contre si je prends le tableau @FERIE dans mon foreach la il fait la condition if. Y a-t-il un moyen de faire en sorte que lorsque je lis mon fichier TXT il devienne pareil à mon tableau @FERIE.

Merci de votre aide et de me répondre.

5 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Y a-t-il un moyen de faire en sorte que lorsque je lis mon fichier TXT il devienne pareil à mon tableau @FERIE.

    En principe oui. Fait voir le fichier pour pouvoir repondre. Mets le sur https://www.cjoint.com/

    Et pourquoi pas un hachage avec la date et le nom de jour férie?

    lami20j

    P.S. j'ai une heure de RER, je peux en profiter ;)

    Et si tu diras exactement ce que tu veux obtenir peut être on pourra faire mieux. Bien sûr si ça t'interesses. Merci

    0
  2. lavm01 Messages postés 72 Statut Membre
     
    Bonjour, le fichier est sur le lien https://www.cjoint.com/?idsU7EpegT

    En fait, ce que je veux faire exactement est de lire un fichier texte sous la forme:
    2006-01-02
    2005-01-03
    2006-04-14
    2006-04-17
    2006-05-22
    2006-06-21
    2006-06-30
    2006-08-02
    2006-10-09
    2006-12-22
    2006-12-25
    2006-12-26
    2006-12-29
    2007-01-01
    2007-01-02

    ce fichier contient les jours fériés 2006 et le début de l'année 2007 (mais il se peut que j'en mettre plus). Ensuite prendre la date du jour et venir la comparer avec les dates de mon fichiers texte. Si la date du jour correspond à une des dates de mon fichiers texte et bien j'affecte une valeure à une variable (Ex: $jf='jour férié';).Donc au début de mon programme j'exécute la sous routine de vérification pour la date et si la variable $jf est égale à jour férié et bien je quitte le programme donc aucune exécution. C'est un peu long à expliquer pourquoi je dois faire cela mais il faut que je réussise à le faire.

    Merci de votre réponse.
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    je crois qu'on c'est déjà vu perl tk

    Pendant que je vais regarder ton fichier voilà quelque conseils

    #!/usr/bin/perl
    #
    # à utiliser dans le script; les messages d'erreurs ou warnings nous peuvent aider
    #
    use warnings;use strict;
    
    # on peut convenir que j veut dire jour, on evite d'écrire beaucoup
    # aa pour année et mm pour mois
    # en revanche on mets des commentaries pour ne pas oublier (ça sers pour la maintenace)
    #
    my $jsec = 0;
    my $jf = "Non Ferie";
    my $caldat = time() - $jsec;
    # si tu n'as pas besoin que de jour, mois et année tu peux
    # utiliser une tranche
    # my ($j,$mm,$aa) = (localtime)[3,4,5]
    #
    my ($s,$m,$h,$mj,$mm,$aa,$wj,$yj,$isdst) = localtime($caldat);
    #$wday=$wday; cette ligne sers à quoi?
    
    # a eviter des noms des variables en majuscules
    my $rtj=(qw(Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi))[$wday];
    my $aa += 1900;
    my $mm = sprintf("%02d", $mon+1); # Convert to 2-digit 1-based $mday.
    my $mj = sprintf("%02d", $mday); # Convert to 2-digit $mday.
    
    # on va utiliser d au lieu de date
    my $d1 = "$aa-$mm-$mj";
    
    open TL, "$fichtolist"
       or die "E/S : $!\n"; # à retourné une execptions si problème avec le fichier
    
    my @cvectolist=<TL>;
    close(TL);
    
    my @ferie = qw( 2006-01-02 2005-01-03 2006-04-14 2006-04-17
                   2006-05-22 2006-06-23 2006-06-30 2006-09-04
                   2006-10-09 2006-12-22 2006-12-25 2006-12-26
                   2006-12-29 2007-01-01 2007-01-02 X
                 ); # ce n'est pas mieux comme ça?
    
    foreach my $jferie ( @cvectolist ) {
    #print "Le jferie:$jferie et la DATE1:$DATE1\n";
       if ( $jferie eq $d1 ) {
           print "je suis dans le eq\n";# il manque quelque chose ici
           $jf = "Ferie";
           $d1 = "$year-$mon-$mday";
       }
    }
    __END__
    ce n'est pas un code opérationnel
    je me suis permit de te donner quelque conseils pour
    écrire ton code
    
    A la place d'écrire autant de my tu peux declaré les variables
    en utilisant une liste
    
    my ($var1, $var2,.....)
    my (@t1, @t2,....)
    my (%h1, %h2, ....)
    A toi de voir.
    dans ton code et ne le prends pas mal que je dit ça
    
    
    lami20j
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    j'ai remplacé dans ton fichier 2006-08-02 avec 2006-08-03 pour tester.

    Ca te va comme ça?
    #!/usr/bin/perl
    #
    use warnings;use strict;
    
    my ($j,$m,$a) = (localtime)[3..5];
    my $jf;
    
    $a += 1900;
    $m = sprintf ( "%02d", $m + 1 );
    $j = sprintf ( "%02d", $j );
    
    my $jj = "$a-$m-$j";
    
    open FERIE, "ferie.txt"
        or die "E/S : $!\n";
    
    while ( <FERIE> ) {
        $jf = $_  if $_ =~ /$jj/;
    }
    print "$jf";
    
    lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    au lieu de
    while ( <FERIE> ) {
        $jf = $_  if $_ =~ /$jj/;
    }
    print "$jf";
    mets
    while ( <FERIE> ) {
        chomp;
        $jf = $_  if $_ eq $jj;
    }
    print $jf,"\n";
    lami20j
    0