Petit problème avec prog perl

Fermé
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012 - 30 juil. 2007 à 18:24
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 2007 à 16:17
Voici mon code:
#!/usr/bin/perl

#
$rep="H:\\rapports_des_seuils\\UNIX";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeA = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
@listeA = map{uc($_)} @listeA;
closedir(DIR);
$cpt = $#listeA;
#
for (my $j=0; $j <= $cpt; $j++) {
$rep="H:\\rapports_des_seuils\\UNIX\\$listeA[$j]";
#print "$rep\n";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeA1 = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
#@listeA+?j = map{uc($_)} @listeA;
closedir(DIR);
$cpt1 = $#listeA1;
#print "Autre\n";
print "$listeA1[2]\n";
}

Ce que j'aimerais faire est de faire incrémenter la table @listeA1 avec la variable $j pour que cela devienne @listeA1 pour la première passe dans le for @listeA2 pour la deuxième passe @listeA3 et ainsi de suite. Comment coder ça. J'ai essayer plusieurs choses mais cela ne fonctionne pas.

Merci !

6 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
31 juil. 2007 à 00:06
Salut,

tu dois utiliser les structures de données
voici un exemple avec tableau de tableaux (à adapter à ta situation)
#!/usr/bin/perl
use strict;use warnings;

my $i;
my @liste;
for ($i=0;$i<3;++$i){
  $liste[$i] = [ map { uc(chr(ord($_) + $i)) } 'a'..'c' ];
}
print @{$liste[0]},"\n";
print @{$liste[1]},"\n";
print @{$liste[2]},"\n";
__END__
0
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
31 juil. 2007 à 19:15
J'ai adapté le petit bout de code ci-haut à mon programme, l'idée est bonne de mettre le tout dans un tableau de tableaux mais le problème est qu'il met toute sur une même ligne, il faudrait qu'il soit un en dessous de l'autre.

Merci !

tu peux revoir mon programme et l'essayer en changeant de répertoire tout simplement i.e. le premier step tu crées un répertoire qui contient juste des répertoires (ex: 5 répertoires) et dans chacun des répertoires tu peux créer 3 ou 4 fichier texte ou html.

revoici le code:

#!/usr/bin/perl

#
$rep="H:\\rapports_des_seuils\\UNIX";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeA = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
@listeA = map{uc($_)} @listeA;
closedir(DIR);
$cpt = $#listeA;
#
for (my $j=0; $j <= $cpt; $j++) {
$rep="H:\\rapports_des_seuils\\UNIX\\$listeA[$j]";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeU1 = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
@listeU1 = map{uc($_)} @listeU1;
closedir(DIR);
$cpt1 = $#listeU1;
print "$listeU1[0]\n";
}
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
31 juil. 2007 à 21:00
il faudrait qu'il soit un en dessous de l'autre.

tu veut dire que le script doit afficher un fichier par ligne?!

je te propose de me dire ce que tu veux faire, et je vais voir pour la partie code, puisque je ne saisie pas très bien ce que tu veux.

Dans mon bout de code pour afficher un par ligne ça suffit d'écrire
#!/usr/bin/perl
use strict;use warnings;

my $i;
my @liste;
for ($i=0;$i<3;++$i){
  $liste[$i] = [ map { uc(chr(ord($_) + $i)) } 'a'..'c' ];
}

foreach (@liste){
  foreach my $e (@{$_}){
    print "$e\n";
  }
}
__END__

0
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
31 juil. 2007 à 21:21
Bonjour,

Dans le fond c'est que:

Je suis en train d'écrire un programme perl qui va lire un répertoire et le mets dans une liste déroulante. Jusque là tout va bien. Sauf que j'aimerais faire plus que ça, je voudrais lire un répertoire (ce répertoire contient seulement des répertoires) et le mettre dans une liste déroulante et quand l'utilisateur sélectionne un répertoire à partir de la liste il affiche dans une autre liste (à côté ou en dessous) le contenu du répertoire. Ex: j'ai un répertoire unix que lui contient seulement des répertoires (ex: Virtualité, Bastion, Virto, etc....) et chaque répertoire contient environ 15 fichiers html (cela change à tous les jours. Donc en résumé l'utilisateur clic dans la liste des répertoires (ex: virtualité) et quand il clic il y a une autre liste qui apparaît qui contient les fichiers html et quand il choisi dans la liste le fichier html voulu, il s'ouvre dans une autre page pour l'affichier.

Voici un bout de mon code perl (il n'est vraiement pas complet et il y a plusieurs test dedans mais il fonctionne)

#!/usr/bin/perl

use CGI_Lite; # Utilisation du module CGI_Lite

$cgi=new CGI_Lite; # Création d'un nouvel objet CGI_Lite pour traiter le formulaire

%in = $cgi->parse_form_data; # Lecture des paramètres dans le tableau associatif %in


#if (document.form2.liste1A.value ne 'Environnement') {
#<select name="liste2">
#for (my $j=0; $j <= $#listeA; $j++) {
#<option value=http://172.27.96.172/unix/$listeA[$j]/$listeA[$j]> $listeA[$j]</option>
# }
#</select>
#}


$rep1="D:\\rapports_des_seuils\\Tous_UNIX";
$i = 0;
opendir(DIR, $rep1) || die "Impossible de lire $rep1 : $!\n";
my @liste = grep { not /^[.][.]?\z/ && -r "$rep1/$_" } readdir(DIR);
@liste = map{lc($_)} @liste;
closedir(DIR);
#
#
$rep="D:\\rapports_des_seuils\\UNIX";
$i = 0;
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeA = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
@listeA = map{uc($_)} @listeA;
closedir(DIR);
$cpt = $#listeA;
#
#
#
for (my $j=0; $j <= $cpt; $j++) {
$rep="D:\\rapports_des_seuils\\UNIX\\$listeA[$j]";
#print "$rep\n";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeU1 = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
#@listeU = map{uc($_)} @listeU;
closedir(DIR);
my @cpt1 = $#listeU1;
#print "$listeU[0]\n";
}
#
#
#print @{$listeU[0][3]},"\n";
#print @{$listeU[7]},"\n";
#for (my $j=0; $j <= $cpt; $j++) {
#$rep="D:\\rapports_des_seuils\\UNIX\\$listeA[$j]";
#$i = 0;
#opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
#my @listeA1 = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
#@listeA1 = map{uc($_)} @listeA1;
#closedir(DIR);
#$cpt1 = $#listeA1;
#print $listeA1[2];
#}
#
print "Content-type: text/html\n\n"; # Affichage de l'entête indispensable
#print "Content-Type: text/javascript\n\n";
print <<"FIN";
<html>
<head>
<title>Rapport des exceptions</title>
<script language="JavaScript">
var Html =""; // mettre la variable html à blanc
d = new Date();
document.write('<p align="right"><font color="black">'+d.toLocaleDateString()+','+d.toLocaleTimeString()+'</font></p>');

function afficherAutre() {
alert("allo");
alert(document.forms.form1.liste1A.value);
if (document.forms.form1.liste1A.value == "http://172.27.96.172/unix/Environnement") {
alert("Je trouve environnement");
}
for (j=0; j <= $cpt; j++) {
document.forms.form1.elements['liste1A'].options[document.forms.form1.elements['liste1A'].selectedIndex].value;
// alert("je passe dans le for " +j);
// <option value=http://172.27.96.172/unix/$listeA[$j]/$listeA[$j]> $listeA[$j]</option>
}
Html += '<b>Choix du rapport: <\/b><font size="4"><\/font>';
Html += ' <select name="dtrap">';
for (i=0; i <= 15; i++) {
Html += '<option value="http://172.27.96.172/unix/$listeA[$i]/$listeA[$i]"> $listeU1[0]<\/option>';
----------------
ne fonctionne pas.
}
Html += ' <\/select>';
//-- ici On écrit le résultat du html
document.write( Html);
}
</script>
</head>
FIN
print "<body>";
print "<img style= 'float: left' src='../bandeau1.jpg' alt='logo'><p align=center><font size=4>RAPPORT D\'ANALYSE DES EXCEPTIONS DES PFI</p></font>";
print "<p> </p>";
print "<p> </p>";
print "<hr>";
#for (my $j=0; $j <= $#liste; $j++) {
# @liste[$j] =~ s/[^0-9-]+//g;
#}
print "Le contenu du répertoire: $rep1<br><br>";
print "<b>Quel rapport voulez-vous voir ?</b><br>";
print "<form name='form1' method='post' action=''>";
print "<select name=liste1>";
for (my $j=0; $j <= $#liste; $j++) {
print "<option value=http://172.27.96.172/tous_unix/$liste[$j]> $liste[$j]</option>\n";
}
print "</select>";
print "<INPUT TYPE='button' VALUE='OK' onClick='location =
form1.liste1.options[form1.liste1.selectedIndex].value;'>";
#print "</form>";
#
print "<hr>";
#for (my $j=0; $j <= $#liste; $j++) {
# @liste[$j] =~ s/[^0-9-]+//g;
#}
print "Le contenu du répertoire: $rep<br><br>";
print "<b>Choisir votre environnement ?</b><br>";
#print "<form name='form2' method='post' action=''>";
print "<select name=liste1A onChange=afficherAutre()>";
for (my $j=0; $j <= $#listeA; $j++) {
print "<option value=http://172.27.96.172/unix/$listeA[$j]> $listeA[$j]</option>";
}
print "</select>";
#print "<INPUT TYPE='button' VALUE='OK' onClick='location =
# form.liste1.options[form.liste1.selectedIndex].value;'>";
print "</form>";
print "</body>\n";
print "</html>\n";
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
31 juil. 2007 à 22:37
Re,

il ne fallait pas doubler le message (ici le 1er perl html javascript )

il me semblais que le bout du code je l'ai vu quelque part

si le script fonctionne alors où et le problème?!

Sauf que j'aimerais faire plus que ça, je voudrais lire un répertoire (ce répertoire contient seulement des répertoires) et le mettre dans une liste déroulante et quand l'utilisateur sélectionne un répertoire à partir de la liste il affiche dans une autre liste (à côté ou en dessous) le contenu du répertoire.

Pour résume :

- tu crées un tableau @rep_pere qui contiendra tout les répertoires
- pour chaque élément de @rep_pere qui est un répertoire tu crées un tableau qui contient les fichiers (voir mon exemple)

En partant de ton code et de mon exemple voici ce que je te propose (à adapter à tes besoins )
#!/usr/bin/perl
use strict;use warnings;

my @liste_rep;

opendir DIR,"/home/lami20j/lavm"
  or die "E/S : $!\n";

my $pwd = "/home/lami20j/lavm";
my @rep_pere = grep { ! /^\./  } 
               sort readdir(DIR);
grep { s/$_/$pwd\/$_/ } @rep_pere;

for(my $i = 0; $i < @rep_pere + 0;++$i){
  opendir SOUSDIR,"$rep_pere[$i]" 
    or warn "E/S : $!\n";
  $liste_rep[$i] = [ grep { ! /^\./ && s/$_/uc($_)/e } 
	                 readdir(SOUSDIR) ];				
}

{
  local $"="\n";
	print "$rep_pere[0]\n";
  print "@{$liste_rep[0]}\n";
	print "$rep_pere[1]\n";
  print "@{$liste_rep[1]}\n";
	print "$rep_pere[2]\n";
  print "@{$liste_rep[2]}\n";
}

__END__


0
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
31 juil. 2007 à 22:58
Merci tu es très gentil, je vais me débrouiller avec ça. Je ne pense pas que le code tu l'ai vu quelque part c'est moi qui l'a fait, c'est pour mon intranet.

Merci encore !

P.S. Peut-être que nous nous sommes déjà croisé mais ton pseudo me dit rien.

Bye
Alp (peut-être) car tu es très bon en perl et moi je commence à peine.
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
31 juil. 2007 à 23:17
Je ne pense pas que le code tu l'ai vu quelque part c'est moi qui l'a fait, c'est pour mon intranet.
En faut je voulais dire que c'est un doublon sur ccm de ta part :-)

Peut-être que nous nous sommes déjà croisé mais ton pseudo me dit rien.
Ben, maintenant je peux te confirmer :-))
regarde ce lien perl tk et tu te rappeleras :-))

En fait je pense que c'est la même chose sauf que maintenant tu veux utiliser le web pour faire ça.
0
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
1 août 2007 à 15:13
Salut,

effectivement pour Perl TK, j'avais commencer avec ce langage puis je suis revenu avec Perl, le Perl TK n'était pas la solution pour moi. Disons que je fait du Perl à temps perdu car je suis programmeur analyste en SAS (c'est ma job). Tu viens de quel coin du monde, moi je suis du Canada, je sais qu'il y a beaucoup de personnes de la France sur ce site.

Merci encore !

A +
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
1 août 2007 à 15:44
Re,

Tu viens de quel coin du monde,
France

Sache que Perl TK c'est un module, mais le langage reste toujours Perl :-))
0
lavm01 Messages postés 69 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 5 octobre 2012
3 août 2007 à 15:37
Salut,

J'ai encore une autre question ou problème, si tu as le temps et si tu veux m'aider j'aimerais bien. Alors voici le problème.

J'écris présentement un programme perl (repertoire.pl) avec une sortie html et une une inclusion de javascript dedans. Le but du programme est de lire un répertoire, ce répertoire contient juste des répertoires et dans chacun des répertoires il y a environ 15 fichiers html. Dans une première liste déroulante il y a le nom des répertoires et quand l'usager clic sur l'un des répertoires qu'il y a dans la liste déroulante il apparaît une autre liste déroulante que lui contient la liste des 15 fichiers html (ce sont des rapports) ensuite il clic sur l'un des 15 fichiers html et là le rapport s'affiche.

Mais le problème est que je suis incapable de passer la liste des 15 fichiers html dans mon javascript. J'ai cherché partout et je n'ai rien trouvé sur ce sujet (ex: FAQ perl, cours perl, sur le site de perl, etc....) Si quelqu'un pouvait m'aider.

Voici mon script perl

#!/usr/bin/perl

use CGI_Lite;

$cgi=new CGI_Lite;

%in = $cgi->parse_form_data;

$rep1="D:\\rapports_des_seuils\\Tous_UNIX";
$i = 0;
opendir(DIR, $rep1) || die "Impossible de lire $rep1 : $!\n";
my @liste = grep { not /^[.][.]?\z/ && -r "$rep1/$_" } readdir(DIR);
@liste = map{lc($_)} @liste;
closedir(DIR);
#
$rep="D:\\rapports_des_seuils\\UNIX";
$i = 0;
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeA = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
@listeA = map{uc($_)} @listeA;
closedir(DIR);
$cpt = $#listeA;
#
for (my $j=0; $j <= $cpt; $j++) {
$rep="D:\\rapports_des_seuils\\UNIX\\$listeA[$j]";
opendir(DIR, $rep) || die "Impossible de lire $rep : $!\n";
my @listeU1 = grep { not /^[.][.]?\z/ && -r "$rep/$_" } readdir(DIR);
# ici il faudrait que @listeU1 puisse s'incrémenter tout seul i.e
# @listeU$j donc deviendrait @listeU1 puis @listeU2 et ainsi de suite..
# ou un autre moyen je ne sais plus...
@listeU1 = map{uc($_)} @listeU1;
closedir(DIR);
my @cpt1 = $#listeU1;
}
#
print "Content-type: text/html\n\n"; # Affichage de l'entête indispensable
print <<"FIN";
<html>
<head>
<title>Rapport des exceptions</title>
<script language="JavaScript">
var Html =""; // mettre la variable html à blanc
d = new Date();
document.write('<p align="right"><font color="black">'+d.toLocaleDateString()+','+d.toLocaleTimeString()+'</font></p>');

function afficherAutre() {
alert("allo");
alert(document.forms.form1.liste1A.value);
if (document.forms.form1.liste1A.value == "http://172.xx.xx.xxx/unix/Environnement") {
alert("Je trouve environnement");
}
for (j=0; j <= $cpt; j++) {
document.forms.form1.elements['liste1A'].options[document.forms.form1.elements['liste1A'].selectedIndex].value;
// alert("je passe dans le for " +j);
// <option value=http://172.xx.xx.xxx/unix/$listeA[$j]/$listeA[$j]> $listeA[$j]</option>
}
Html += '<b>Choix du rapport: <\/b><font size="4"><\/font>';
Html += ' <select name="dtrap">';
for (i=0; i <= 15; i++) {
Html += '<option value="http://172.xx.xx.xxx/unix/$listeA[$i]/$listeA[$i]"> $listeU1[$i]<\/option>';
}
Html += ' <\/select>';
//-- ici On écrit le résultat du html
document.write( Html);
}
</script>
</head>
FIN
print "<body>";
print "<img style= 'float: left' src='../bandeau1.jpg' alt='logo'><p align=center><font size=4>RAPPORT D\'ANALYSE DES EXCEPTIONS DES PFI</p></font>";
print "<p> </p>";
print "<p> </p>";
print "<hr>";
print "Le contenu du répertoire: $rep1<br><br>";
print "<b>Quel rapport voulez-vous voir ?</b><br>";
print "<form name='form1' method='post' action=''>";
print "<select name=liste1>";
for (my $j=0; $j <= $#liste; $j++) {
print "<option value=http://172.xx.xx.xxx/tous_unix/$liste[$j]> $liste[$j]</option>\n";
}
print "</select>";
print "<INPUT TYPE='button' VALUE='OK' onClick='location =
form1.liste1.options[form1.liste1.selectedIndex].value;'>";
#
print "<hr>";
print "Le contenu du répertoire: $rep<br><br>";
print "<b>Choisir votre environnement ?</b><br>";
print "<select name=liste1A onChange=afficherAutre()>";
for (my $j=0; $j <= $#listeA; $j++) {
print "<option value=http://172.27.96.172/unix/$listeA[$j]> $listeA[$j]</option>";
}
print "</select>";
print "</form>";
print "</body>\n";
print "</html>\n";


Merci !
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 2007 à 16:17
Salut,

de passer la liste des 15 fichiers html dans mon javascript
et pourquoi n'utilises tu seulement perl?
comment tu te prends pour utiliser le script java?

Perl and Java
0