Question programmation PERL

Fermé
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012 - 3 août 2006 à 14:19
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 3 août 2006 à 20:25
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.
A voir également:

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 août 2006 à 16:24
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
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
3 août 2006 à 18:59
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 août 2006 à 19:22
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 août 2006 à 20:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 août 2006 à 20:25
Re,

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