Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1491 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] probleme avec sub - subroutine [résolu -> howto inside]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Perl] probleme avec sub - subroutine [résolu -> howto inside]

n°676038
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 12:16:42  profilanswer
 

Salut a tous !
 
Voila je suis un debutant sur perl (linux). Je dev un petit programme de mass traitement de données en perl. Mais la j'ai un probleme a la con que je ne vois pas comment resoudre.
En effet je veux faire des subroutines. Normalement on peut les placer n'importe ou dans le code. Je les place donc au debut mais ce con rentre dans les subroutines pour les executer ? Je ne comprends rien. Merci d'éclairer ma lanterne.
 
++
foiro


Message édité par enfoiro le 19-03-2004 à 14:29:54
mood
Publicité
Posté le 17-03-2004 à 12:16:42  profilanswer
 

n°676050
pospos
Posté le 17-03-2004 à 12:26:24  profilanswer
 

c'est pas normal
montre ton code

n°676067
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 12:42:39  profilanswer
 

Salut
 
Voici le code
 
[script]
#!/usr/bin/perl
 
use strict;
use Statistics::LineFit; # Package de regression lineaire
my $comp = 0;
 
if (@ARGV <5 ) {
die "script.pl basename tps_debut time_int num_col graph_decal";
}
 
system("ls | sort -t = -k 1,1 -k 3,3n > fichiers.txt" );
 
 
my $basename = $ARGV[0];
my $tps_debut = $ARGV[1];
my $time_int = $ARGV[2];
my $num_col = $ARGV[3];
my $graph_decal = $ARGV[4];
 
#______________________________________SUBROUTINES____________________________________________
 
# Impression de fichier
# WriteDestFile
 
# Permet d'ecrire dans un fichier le contenu d'un tableau associatif
# WriteDestFile(@premColonne,%main_hash,$nomDest) => crée le fichier $nomDest dans le repertoire courant
 
sub WriteDestFile{
 
printf "Motherfucker was here\n";
 
my @premColonne = $_[0];
my %main_hash = $_[1];
my $nomDest = $_[2];
[/script]
 
et il imprime le "motherfucker was here !" ...

n°676115
pospos
Posté le 17-03-2004 à 13:43:30  profilanswer
 

tu la ferme pas ta subroutine?

n°676117
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 13:45:56  profilanswer
 

si, voici la totalité du code de la subroutine
 
[script]
#!/usr/bin/perl
 
use strict;
use Statistics::LineFit; # Package de regression lineaire
my $comp = 0;
 
if (@ARGV <5 ) {
die "script.pl basename tps_debut time_int num_col graph_decal";
}
 
system("ls | sort -t = -k 1,1 -k 3,3n > fichiers.txt" );
 
 
my $basename = $ARGV[0];
my $tps_debut = $ARGV[1];
my $time_int = $ARGV[2];
my $num_col = $ARGV[3];
my $graph_decal = $ARGV[4];
 
#______________________________________SUBROUTINES____________________________________________
 
# Impression de fichier
# WriteDestFile
 
# Permet d'ecrire dans un fichier le contenu d'un tableau associatif
# WriteDestFile(@premColonne,%main_hash,$nomDest) => cre le fichier $nomDest dans le repertoire courant
 
sub WriteDestFile{
 
printf "Motherfucker was here\n";
 
my @premColonne = $_[0];
my %main_hash = $_[1];
my $nomDest = $_[2];
 
# @keys est l'ensemble des cls utilises dans %main_hash, ordonnes.
 
my @keys = sort {$a <=> $b} keys %main_hash;
 
my $elt;
my $key;
my $i;
 
my $currentRow;
my @currentSplit;
my $currentValue;
 
open(RES,">$nomDest" ) || die "Cannot open file $nomDest to write records to";
 
printf RES "\n";
 
my $chaineTMP = "";
my $columnSize = @premColonne;
 
for( $i=0; $i < $columnSize ; $i++ ){
 
  $chaineTMP =  "$chaineTMP"."$premColonne[$i]\t";
 
    foreach $elt (@keys){
      $currentRow = $main_hash{$elt};
      @currentSplit = split(/ +/,$currentRow);
      $currentValue = $currentSplit[$i];
      $chaineTMP = "$chaineTMP"."$currentValue\t";
   }
 
  if ($i%100 ==0){
    printf RES "$chaineTMP\n";
    $chaineTMP = "";
  }
  else {
    $chaineTMP =  "$chaineTMP \n";
  }
  printf "une ligne de faite $i\n";
}
printf RES "$chaineTMP\n";
close(RES);
 
};
 
#_____________________________________________________________________________________________
[/script]


Message édité par enfoiro le 17-03-2004 à 13:46:27
n°676125
pospos
Posté le 17-03-2004 à 13:50:17  profilanswer
 

je vois vraiment pas d'ou ca peut venir...
 
essay de faire ca dans ta sub:

Code :
  1. print "Caller: \n", join("\n", caller()), "\n";


ca va afficher dans l'ordre le nom de package, le nom de fichier, et le numero de ligne de la ou a été appelé ta sub

n°676168
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 14:07:53  profilanswer
 

Ben en tout cas je sais pas ce qui s'est passé mais maintenant ca marche... Sauf que je viens de me rendre compte que ca fait de la grosse merde a cause du passage d'un hash dans une subroutine, ca transmet une reference pourrie et g plus acces au hash ce qui fait que tous les fichiers de resultats c ARRAY(0x...) et puis c tt...
 
Merci pr ton aide
 
joa

n°676191
pospos
Posté le 17-03-2004 à 14:14:47  profilanswer
 

fait ca:

Code :
  1. WriteDestFile(\@premColonne,\%main_hash,$nomDest)


 
comme ca tu recupere des references à ton array et ta hash:

Code :
  1. my @premColonne = @{$_[0]};
  2. my %main_hash = %{$_[1]};
  3. my $nomDest = $_[2];


 
le mieux ce serait de carrement utiliser les references directement dans ta sub plutot que de recopier le tableau et le hash. Pour ca regarde un tutoriel sur la manipulation des references de tableau et de hash
 

n°676307
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 15:15:19  profilanswer
 

ok, j'ai compris le passage par reference et maintenant ca marche. Une autre question : Es-ce possible de nester des appels aux subroutines pour ne pas avoir a mettre en memoire trop longtemps des hashes
 
ex
AddGraphDecal(\%inputHash) retourne %outputHash
 
WriteDestFile(\@premColonne,\%main_hash,$nomDest)
 
En fait ma question c'est  : es-ce que je peux utiliser un passage par reference dans ce cas :  
WriteDestFile(\@premColonne,\{AddGraphDecal(\%inputHash)},$nomDest}
 
L'adresse du hash ne va t-elle pas etre perdue etant donné la portée de la variable ?
 
(cette syntaxe ne parche pas)
J'ai pr le moment resolu le pb en créeant une variable globale
 
++

n°676393
pospos
Posté le 17-03-2004 à 17:22:14  profilanswer
 

si tu passe des references tu n'a pas de probleme de portée: la variable originale ne sera pas detruite tant qu'au moins une variable existante y fera reference.
 
je vois pas trop ce que tu veux faire avec ton appel imbriqué, mais si tu veux tu peu aussi faire retourner une reference à ta fonction AddGraphDecal, et renvoyer simplement cette reference à WriteDestFile.

mood
Publicité
Posté le 17-03-2004 à 17:22:14  profilanswer
 

n°676442
enfoiro
a nickname is just a nickname
Posté le 17-03-2004 à 18:11:14  profilanswer
 

Désolé je suis un peu confus, c'est l'apanage du noob, mais pour le moment ce qui compte c que je fasse du code qui marche et c'est le cas.
En tout cas pour perl un truc qui roxxe vraiment c www.cpan.org des librairies à gogo c le bonheur assuré :-)
 
++

n°676476
pospos
Posté le 17-03-2004 à 19:09:11  profilanswer
 

surtout search.cpan.org


Message édité par pospos le 17-03-2004 à 19:09:23
n°678133
enfoiro
a nickname is just a nickname
Posté le 19-03-2004 à 14:30:35  profilanswer
 

Re !
 
J'ai trouvé la réponse à ma question a l'adresse suivante et il se trouve que le problème n'est pas du tout trivial : http://www.troubleshooters.com/cod [...] corder.htm
 
++
joa

n°678298
pospos
Posté le 19-03-2004 à 17:12:27  profilanswer
 

je vois pas exactement le rapport avec ton probleme (le tout premier probleme que t'avais) ??
tu ne fais pas de prototypage en plus

n°693343
enfoiro
a nickname is just a nickname
Posté le 06-04-2004 à 11:21:25  profilanswer
 

Je connais pas le rapport : en fait g rien compris :)
 
++
joa

n°710564
loothoof
Posté le 28-04-2004 à 11:16:22  profilanswer
 

Salut a tous moi je voudrai savoir un truc.
je doit écrire dans un fichier deux ligne contenant des chiffres.
Jusque la tout vas bien.
Mais ces chiffres doivent etre alignés et je ne connait pas a l'avance les chiffres de la 2ieme ligne.
ex
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 125 4 5 789 456 123 456 789 4 5 8 6 789
 
Vous voyer que cela n'est plus du tout compréhensible
Avez vous des idées.?
merci
@+

n°710637
pospos
Posté le 28-04-2004 à 11:36:00  profilanswer
 

utilise printf (ou sprintf) :
 
printf("%4d "x15 . "\n", @ligne);

n°710651
burgergold
5$? va chez l'diable!
Posté le 28-04-2004 à 11:44:43  profilanswer
 

je sais pas si le problème de subroutine a été résolu, mais une subroutine ca se fini par "}" et non par "};" il me semble


---------------
http://www.boincstats.com/signature/user_664861.gif
n°710672
pospos
Posté le 28-04-2004 à 11:53:02  profilanswer
 

non ca change rien le ";", tu peux en mettre à peut pret ou tu veux en fait
 
par exemple
 
sub a {
};
 
ca revient à  
 
sub a {
}
;
 
donc une sub suivi d'une instruction vide...

n°710693
loothoof
Posté le 28-04-2004 à 12:08:18  profilanswer
 

ok mais avant je ne vois pas trop comment mettre tous mes chiffres dans le tableau.
il faut que je fasse un tableau de scalaire.
J'obtien mes chiffres par une boucle et je voulais savoir s'il étais d'ajouter ces chiffres au bout de mon scalaire.
 
Euh je ne c pas si j'ai été tres clair.
merci

n°710833
pospos
Posté le 28-04-2004 à 14:07:12  profilanswer
 

dans ce cas tu peux faire ca:
 

Code :
  1. my $i;
  2. for (...) {
  3.   ...
  4.   printf("%4d", $valeur);
  5.   # retour ligne toutes les 15 valeur, sinon espace
  6.   print ++$i%15 ? ' ' : "\n";
  7. }


n°711676
loothoof
Posté le 29-04-2004 à 12:28:30  profilanswer
 

Salut es -t-il possible d'écrire dans un fichier de façon organiser (alphabétique par exemple) un hachage?

n°711696
anapajari
s/travail/glanding on hfr/gs;
Posté le 29-04-2004 à 13:11:40  profilanswer
 

je suppute que tu veux classer ta hash selon la valeur des clés donc: sort

n°711773
loothoof
Posté le 29-04-2004 à 14:04:30  profilanswer
 

oui c sa.
Mais sa ne me donne pas ce que je veut:
voici mon code
je veut trier liste:
 
my %listes = sort %liste;
while (my ($clef,$valeur)=each(%listes))
 {
  printf ECRIRE ("$clef , $valeur\n" );
 }
 
Ai'j fait une erreur?
 
 
 

n°711774
pospos
Posté le 29-04-2004 à 14:04:33  profilanswer
 

loothoof, tu devrais creer un nouveau topic pour chaque question (avec un titre explicite!)

n°711782
pospos
Posté le 29-04-2004 à 14:07:45  profilanswer
 

sort ne marche que sur les listes!
un hash n'a pas d'ordre (sauf à utiliser un tie special, ya pleins de modules sur CPAN qui le font, mais pour ton probleme c'est pas utile)
 
donc tu peux trier "keys %liste" qui est une liste, mais pas directement %liste
 
donc pour ce que tu veux:

Code :
  1. foreach my $cle (sort keys %liste) {
  2.   print ECRIRE "$clef, $liste{$cle}\n";
  3. }

n°711962
loothoof
Posté le 29-04-2004 à 16:13:12  profilanswer
 

Cbon j'ai réussi a faire ce que je voulais et ce grace a vous
merci.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] probleme avec sub - subroutine [résolu -> howto inside]

 

Sujets relatifs
[Perl] parcourir un fichier à partir d'une certaine ligne[import] encore 1 problème d'import ...
Lancer un script perl avec du php[CSS] mise en page !!RESOLU!!
probleme avec les packages.[Perl] utilisé une librairie Win32 dans un script pouvant rouler unix
[Perl] Fonction find, en plus d'utilisation de simili-objet[RESOLU] [ORACLE] pb de trigger à l'insertion pl-sql
[perl-cgi] Passage de parametresProblème de design objet
Plus de sujets relatifs à : [Perl] probleme avec sub - subroutine [résolu -> howto inside]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR