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

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

Marsh Posté le 17-03-2004 à 12:16:42    

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
Reply

Marsh Posté le 17-03-2004 à 12:16:42   

Reply

Marsh Posté le 17-03-2004 à 12:26:24    

c'est pas normal
montre ton code

Reply

Marsh Posté le 17-03-2004 à 12:42:39    

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 !" ...

Reply

Marsh Posté le 17-03-2004 à 13:43:30    

tu la ferme pas ta subroutine?

Reply

Marsh Posté le 17-03-2004 à 13:45:56    

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
Reply

Marsh Posté le 17-03-2004 à 13:50:17    

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

Reply

Marsh Posté le 17-03-2004 à 14:07:53    

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

Reply

Marsh Posté le 17-03-2004 à 14:14:47    

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
 

Reply

Marsh Posté le 17-03-2004 à 15:15:19    

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
 
++

Reply

Marsh Posté le 17-03-2004 à 17:22:14    

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.

Reply

Marsh Posté le 17-03-2004 à 17:22:14   

Reply

Marsh Posté le 17-03-2004 à 18:11:14    

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é :-)
 
++

Reply

Marsh Posté le 17-03-2004 à 19:09:11    

surtout search.cpan.org


Message édité par pospos le 17-03-2004 à 19:09:23
Reply

Marsh Posté le 19-03-2004 à 14:30:35    

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

Reply

Marsh Posté le 19-03-2004 à 17:12:27    

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

Reply

Marsh Posté le 06-04-2004 à 11:21:25    

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

Reply

Marsh Posté le 28-04-2004 à 11:16:22    

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
@+

Reply

Marsh Posté le 28-04-2004 à 11:36:00    

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

Reply

Marsh Posté le 28-04-2004 à 11:44:43    

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
Reply

Marsh Posté le 28-04-2004 à 11:53:02    

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...

Reply

Marsh Posté le 28-04-2004 à 12:08:18    

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

Reply

Marsh Posté le 28-04-2004 à 14:07:12    

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. }


Reply

Marsh Posté le 29-04-2004 à 12:28:30    

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

Reply

Marsh Posté le 29-04-2004 à 13:11:40    

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

Reply

Marsh Posté le 29-04-2004 à 14:04:30    

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?
 
 
 

Reply

Marsh Posté le 29-04-2004 à 14:04:33    

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

Reply

Marsh Posté le 29-04-2004 à 14:07:45    

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. }

Reply

Marsh Posté le 29-04-2004 à 16:13:12    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed