Pb script perl extraction paragraphes [Résolu/Fermé]

Signaler
-
 molasson09 -
Bonjour,
j'ai un soucis avec mon script. Je souhaite en effet récupérer de manière récursive les paragraphes des fichiers contenus dans un dossier bien précis et les passer en arguments à un script ruby.
Il me renvoie l'erreur "died on line 21"

#!/usr/bin/perl
use strict;
my $chemin = "textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file);
}
closedir(REP);

foreach $file (@file)
{
open FILE, $file or die $!;
$content = do{local $/; <FILE>};
close(FILE);
@paragraphe = split(/\r?\n\r?\n/, $content);
system "rails ap.rb $paragraphe[0] $paragraphe[1] $paragraphe[2] $paragraphe[3] $paragraphe[4] $paragraphe[5] $paragraphe[6] $paragraphe[7]";
}

15 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Salut,

Exécute et affiche le résultat de
#!/usr/bin/perl 
use strict; 
my $chemin = "textes/"; 
my $compteur=0; 
my $content; 
my $paragraphe; 
my @paragraphe; 
my $file; 
my @file; 
my @infos; 
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister."; 
while($file=readdir(REP)) 

{ 
push (@file,$file); 
} 
closedir(REP); 

print @file+0,"\n";
Merci pour la réponse, le résultat est "256".
Il me retourne 0
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Et celui-là
#!/usr/bin/perl
use strict;
my $chemin = "textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file);
}
closedir(REP);

open FILE, $file[0] or die $!;
$content = do{local $/; <FILE>};
close(FILE);
@paragraphe = split(/\r?\n\r?\n/, $content);
print @paragraphe + 0,"\n";

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Et celui là?
#!/usr/bin/perl
use strict;
my $chemin = "textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file);
}
closedir(REP);

open FILE, $file[0] or die $!;
$content = do{local $/; <FILE>};
print length($content),"\n";
même chose: 0
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Et celui-ci? (je sais que je suis chiant, mais c'est comme ça ;-))
#!/usr/bin/perl
use strict;
my $chemin = "textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
my $content;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file);
}
closedir(REP);

open FILE, $file[0] or die $!;
{
  local $/; 
  $content=<FILE>;
};
print length($content),"\n";
Pareil: 0, mais non tu n'es pas chiant, c'est de se retrouver bloqué pour ce genre de problèmes qui est chiant.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Je pense que je sais pourquoi?
Exécute celui-ci

#!/usr/bin/perl
use strict;
my $chemin = "textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
my $content;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file);
}
closedir(REP);

print "$file[0]\n";

Celui-ci m'affiche "."
Tu sais ce qui cloche? moi je ne vois rien...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Oui, c'est ça
En fait le tableau @file contient le mot de fichier seulement sans l'arborescence
Quand tu fais (dans mon exemple) open FILE, $file[0] or die $!;
$file[0] contient le fichier mais tu n'est pas sur qu'il se trouve dans le répertoire de travail.

Conclusion
- il faut utiliser le chemin complet
- il faut lire les fichiers avec deux exception le . et le ..

Prenons ton script initial, que je ne vais pas tester (les modifications sont en gras)
#!/usr/bin/perl
use strict;
my $chemin = "/chemin/complet/textes/";
my $compteur=0;
my $content;
my $paragraphe;
my @paragraphe;
my $file;
my @file;
my @infos;
opendir(REP,$chemin) or die "Ce repertoire ne semble pas exister.";
while($file=readdir(REP))

{
push (@file,$file) unless $file =~ /^\.\.?$/;
}
closedir(REP);

foreach $file (@file)
{
open FILE, "${chemin}$file" or die $!;
{
  local $/; 
  $content = <FILE>;
};
close(FILE);
@paragraphe = split(/\r?\n\r?\n/, $content);
}
print @paragraphe + 0,"\n";


Merci infiniment!
Je comprends maintenant. Tu vois, j'ai appris le perl ce matin, je ne connais pas encore toutes ces subtilités, mais je suis content de découvrir tout ça!
Merci beaucoup!!!
Ca fonctionne maintenant (j'obtiens ce que je veux grâce à tes modifs et en plaçant l'accolade de fin après la toute dernière instruction, mais sans ton aide je n'y serais pas parvenu de si tôt!!!)

Je ne veux pas abuser, mais connais-tu mechanize? J'ai un autre script que je souhaiterais finaliser, mais je suis bloqué pour remplir des champs de type textarea, qui sont en fait générés par un javascript.
On m'a conseillé d'utiliser mozilla::mechanize au lieu de www::mechanize, mais je suis perdu avec la syntaxe... Si je poste mon code ici, tu peux m'aider?
Bien entendu, je ne vais pas te demander ça à cette heure de la nuit mais quand tu as le temps...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Re,

Si c'est du Perl poste ton code
Je ne connais pas mais je peux toujours regarder ;-)
use strict; use warnings;
use WWW::Mechanize;


my $URL = "https://www.nordnet.com/site-internet";
my $URL2 = "http://monadrese.com/fiche/editer/";
my $URL3 = "https://www.nordnet.com/site-internet";/
my $URL4 = "https://www.nordnet.com/site-internet";
my $m = WWW::Mechanize->new(autocheck => 1);
# Manage cookies
$m->cookie_jar(HTTP::Cookies->new);

# récupération du formulaire
$m->agent_alias("Linux Mozilla");
$m->get( $URL );
die 'Échec de connexion : ' . $m->res->status_line()
unless $m->success();

# remplissage et validation
$m->form_number('2');
$m->set_fields(
login => 'monuser', # entrez vos identifiants de connexion ici
password => 'monpass'
);
# validation formulaire
$m->click();

# connexion réussie ?
die 'Échec de validation du formulaire : ' . $m->res()->status_line()
unless $m->success();

# affichage resultat
# print $m->content( format => 'text' );
$m->get("$URL2");
die 'Échec de validation du formulaire : ' . $m->res()->status_line()
unless $m->success();
$m->form_number('3');
$m->set_fields(
#champs formulaire 3: id=écrire
title => $title;
intro => $intro;
requiers => $requiers;
E1 => $e1;
E2 => $e2;
E3 => e3;
);
mon soucis est au niveau de E1, E2 et E3, qui sont générés par un javascript. Puisque WWW::Mechanize ne comprend pas le javascript, je ne peux absolument rien faire pour compléter le post. Le but était de récupérer les paragraphes du script que tu m'as aidé à compléter dans des variables que je refilerai en boucle à ce morceau de code pour soumettre les formulaires...
Voilà mon soucis... Sinon, je te mets aussi le code javascript qui génère les champs:


<fieldset>
<legend><img src="/img/e.gif" alt="E." /> Étapes de réalisation</legend>
<div id="stepsDiv">
<script type="text/javascript">
<!--
stepsDB.sync();
stepsDB.update();
//-->
</script>

<script type="text/javascript">
<!--
stepsDB.addStep('', 0, 0, 'imageFile', '');
stepsDB.addStep('', 0, 0, 'imageFile', '');
stepsDB.addStep('', 0, 0, 'imageFile', '');
stepsDB.update();
//-->
</script>
</div>
<div id="future_step0">
<p><img src="/img/puce_plus_bleue.gif" alt="" /> <a href="javascript:stepsDB.addStep('', 0, '', 'imageFile', '');stepsDB.update()" title="Ajouter une étape">Ajoutez une étape</a></p>
</div>
</fieldset>

<fieldset>

<legend><img src="/img/f.gif" alt="F." /> Astuces & Mises en garde</legend>
<div>
<label for="tips">Indiquez ici les petites astuces à retenir (passez à la ligne après chaque astuce).</label>
<textarea class="champ" cols="70" rows="5" id="tips" name="tips"></textarea>
</div>
<div>

<label for="warnings">Notez ici les mises en garde importantes à retenir (passez à la ligne après chaque mise en garde).</label>
<textarea class="champ" cols="70" rows="5" id="warnings" name="warnings"></textarea>
</div>
</fieldset>

<div>
<input type="hidden" value="3886" name="authorId" />
<input type="hidden" value="1" name="video" />

<input type="hidden" value="" name="img" />
<input type="hidden" value="" name="siteId" />
<input type="hidden" value="" name="idHowTo" />
<input type="hidden" name="nSteps" id="nSteps" />
</div>
<button type="button" class="bouton" onclick="javascript:spellCheck()"><span><span>Vérifier l'orthographe</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/add?opt=brouillon');"><span><span>Sauver comme brouillon</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/add?opt=test');"><span><span>Prévisualiser</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/add?opt=continue');"><span><span>Enregistrer et continuer</span></span></button>
Merci beaucoup pour ton aide et ta disponibilité!

Ce sont les parties importantes du code
Salut,
après un peu de recherches, j'ai résolu le pb en partie, en me plongeant dans www::mechanize et html::request::common.
Maintenant, il me reste juste une toute petite chose à faire, c'est récupérer un ID dans un fichier html.
En effet, lorsque je lance ma requête, je récupère le contenu de la page html où je suis redirigé dans la variable $res->content.
J'aimerais maintenant pouvoir:
récupérer juste l'ID (un nombre à cinq ou six chiffres) généré par le serveur et accolé à une URL de base.
pouvoir concaténer cet ID à l'URL de base dans une nouvelle variable.

L'ID se trouve dans le code d'une page html et a la forme suivante (en gras):



<p><button type="submit" onclick="setAction('/fiche/lastStep/28687?opt=brouillon');" class="bouton"><span><span>Enregistrer comme brouillon</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/lastStep/28687?opt=test');"><span><span>Pr�visualiser</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/lastStep/28687?opt=continue');"><span><span>Enregistrer et publier</span></span></button></p>
</form>
J'aimerais juste récupérer cet ID, voire pourquoi pas tout le contenu de la parenthèse (de /fiche à continue) puis le concaténer à l'url de base dans la variable $url1.

Comment m'y prendre?

Merci d'avance de votre aide!
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478
Salut,
lami20j@debian:~/trash$ cat recup_chiffre.pl
#!/usr/bin/perl
use strict;use warnings;

while(<DATA>){
  print "$1\n" if /.*setAction\('(.*continue)/;
}
__DATA__
<p><button type="submit" onclick="setAction('/fiche/lastStep/28687?opt=brouillon');" class="bouton"><span><span>Enregistrer comme brouillon</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/lastStep/28687?opt=test');"><span><span>Pr?visualiser</span></span></button>  <button type="submit" class="bouton" onclick="setAction('/fiche/lastStep/28687?opt=continue');"><span><span>Enregistrer et publier</span></span></button></p>
</form>
lami20j@debian:~/trash$ perl recup_chiffre.pl
/fiche/lastStep/28687?opt=continue
Salut,
merci beaucoup! le script fonctionne parfaitement tel quel ou quand j'ouvre directement le fichier.
Maintenant, j'aimerais faire la chose suivante: récupérer directement le contenu depuis la variable "$mavar = $res->decoded_content".
Lorsque je fais ceci:
$donnees=$res->decoded_content;
while($donnees){
$urlcomp = "$1\n" if /.*setAction\('(.*continue)/;
}
j'obtiens "uninitiated value $_ in pattern match (m//)...

Je sais qu'il doit s'agir d'un truc banal, mais j'ai eu beau chercher, je dois dire que je ne m'y connais pas encore assez en perl pour corriger ça tout seul...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 478 > molasson09
Re,

$donnees est juste une chaine de caractère

Donc au lieu de
while($donnees){
$urlcomp = "$1\n" if /.*setAction\('(.*continue)/;
}


Tu peux faire tout simplement
$donnees =~ /.*setAction\('(.*continue)/;
$urlcomp = "$1\n";

>
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019

Merci encore pour ta disponibilité!
Cependant, j'ai utilisé le morceau de code que tu m'as donné, mais je reçois le message "use of unitiated value $1 in concatenation (.) or string at line ...
Voici le bloc de code concerné:

$donnees=$res->decoded_content;
$donnees=~ /.*setAction\('(.*continue)/;
$urlcomp ="$1\n";#~ /.*setAction\('(.*continue)/;
$url2=$url.$urlcomp;
print $url2;
> molasson09
Bon ben j'ai trouvé une solution:
j'écris le contenu de $res->decoded_content dans un fichier temporaire,
j'ouvre ce fichier temporaire et recherche l'url voulue grâce à ton expression régulière,
je réécris par dessus l'ancien fichier tant que nécessaire,
je supprime le fichier une fois la boucle achevée.
Cela fonctionne exactement comme voulu, je peux maintenant faire ce que je voulais.

Ma prochaine étape sera de me mettre à perl/tk pour générer une interface graphique pour ce script.
Une fois cela fait, j'essaierai de voir si je peux convertir cela en php pour en faire un module joomla.

Merci beaucoup de ton aide, sans laquelle je n'aurais pas avancé aussi vite et bien!
Peux-tu m'expliquer l'expression régulière que tu as mise, stp? J'aimerais pouvoir par la suite faire les miennes, mais j'ai toujours du mal...
Merci!