IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

passage d'un tableau comme argument d'une fonction


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Bioinformaticien
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 7
    Points
    7
    Par défaut passage d'un tableau comme argument d'une fonction
    Bonjour,
    Je cherche à passer proprement un tableau comme argument d'une fonction, c'est-à-dire sous la forme d'une référence. Le code qui suit fonctionne très bien mais comme vous le constaterez, c'est bien un tableau que je passe en argument de la fonction mystd() pas une référence...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    #!/usr/bin/perl
    use strict;
     
    my %hashx;
    my %hashy;
    my $std;
    my $cor;
     
    %hashx=(
    '103904950' => 6.1,
    '103905269' => 5.5,
    '103905308' => 5.5,
    '103905458' => 5.8,
    '103905264' => 5.8,
    '103905270' => 5.6);
     
    %hashy=(
    '103904950' => -6.1,
    '103905269' => -6.3,
    '103905308' => -5.7,
    '103905458' => -6.6,
    '103905264' => -6.8,
    '103905270' => -6.6);
     
    $std=mystd(values %hashx);
    $cor=mycor(\%hashx, \%hashy);
     
    print "STD= $std\nCC= $cor\n";
     
    sub mysum
    {
      my ($refvaluelist)=@_;
      my @valuelist=@{$refvaluelist};
      my $sum=0;
      foreach my $value (@valuelist)
      {$sum+=$value;}
      return $sum;
    }
     
    sub mymean
    {
      my @valuelist=@_;
      my $mean=0;
      $mean=mysum(\@valuelist)/@valuelist;
      return $mean;
    }
     
     
    sub myvar
    {
      my @values=@_;
      my $var=0;
      my $mean=mymean(@values);
      foreach my $v (@values)
      {$var+=($v-$mean)*($v-$mean);}
      $var=$var/@values;
      return $var;
    }
     
     
    sub mystd
    {
      #my ($refvalues)=@_;
      my @values=@_; #@{$refvalues};
      my $std=myvar(@values);
      $std=sqrt($std);
      return $std;
    }
     
    sub mycov
    {
      my ($refx, $refy)=@_;
      my %xvalues=%$refx;
      my %yvalues=%$refy;
      my $nb=(values %xvalues);
      my $meanx=mymean(values %xvalues);
      my $meany=mymean(values %yvalues);
      my $cov=0;
      foreach my $x (keys %xvalues)
      {$cov+=($xvalues{$x}-$meanx)*($yvalues{$x}-$meany);}
      $cov=$cov/$nb;
      return $cov;
     
    }
     
    sub mycor
    {
      my ($refx, $refy)=@_;
      my %xvalues=%$refx;
      my %yvalues=%$refy;
      my $cor=0;
      my $stdx=mystd(\values %xvalues);
      my $stdy=mystd(\values %yvalues);
      if ($stdx!=0 && $stdy!=0)
      {$cor=mycov(\%xvalues, \%yvalues)/($stdx*$stdy);}
      else
      {$cor="";}
      return $cor;
    }
    Dès que j'essaye de passer une référence, telle que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $std=mystd(\values %hashx);
     
    sub mystd
    {
      my ($refvalues)=@_;
      my @values=@{$refvalues};
      my $std=myvar(@values);
      $std=sqrt($std);
      return $std;
    }
    La console me dit:
    Not an ARRAY reference at ./moyennepka_LPE_forum.pl line (celle de "my @values=@{$refvalues};")
    Alors que ça fonctionne pour mysum()...
    Je n'y comprends rien :'( Le pire c'est que ça fonctionne pour mysum()...
    Quelqu'un peut-il m'aider SVP?

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Lorsque vous programmez, apprenez à :
    1. respecter l'écriture du langage ;
    2. lire la documentation ;
    3. commenter son code ;
    4. indenter son code ;
    5. ...


    Voici votre code corrigé. Je ne sais pas si le résultat en sortie est bon, j'ai juste effectué quelques corrections. À vous de les comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    my %hashx = (
    	'103904950' => 6.1,
    	'103905269' => 5.5,
    	'103905308' => 5.5,
    	'103905458' => 5.8,
    	'103905264' => 5.8,
    	'103905270' => 5.6
    );
     
    my %hashy = (
    	'103904950' => -6.1,
    	'103905269' => -6.3,
    	'103905308' => -5.7,
    	'103905458' => -6.6,
    	'103905264' => -6.8,
    	'103905270' => -6.6
    );
     
    my $std = mystd( \%hashx );
    my $cor = mycor( \%hashx, \%hashy );
     
    print "STD= $std\nCC= $cor\n";
     
    sub mysum {
    	my ($refvaluelist) = @_;
    	my @valuelist      = @{$refvaluelist};
    	my $sum            = 0;
    	foreach my $value (@valuelist) {
    		$sum += $value;
    	}
    	return $sum;
    }
     
    sub mymean {
    	my @valuelist = @_;
    	my $mean      = 0;
    	$mean = mysum( \@valuelist ) / @valuelist;
    	return $mean;
    }
     
    sub myvar {
    	my $ref_values = shift;
    	my $var        = 0;
    	my $mean       = mymean($ref_values);
    	foreach my $v ( @{$ref_values} ) {
    		$var += ( $v - $mean ) * ( $v - $mean );
    	}
    	$var = $var / scalar( @{$ref_values} );
    	return $var;
    }
     
    sub mystd {
    	my $refvalues = shift;
    	my @values    = values %{$refvalues};
    	my $std       = myvar( \@values );
    	$std = sqrt $std;
    	return $std;
    }
     
    sub mycov {
    	my ( $refx, $refy ) = @_;
    	my %xvalues = %$refx;
    	my %yvalues = %$refy;
    	my $nb      = ( values %xvalues );
    	my $meanx   = mymean( values %xvalues );
    	my $meany   = mymean( values %yvalues );
    	my $cov     = 0;
    	foreach my $x ( keys %xvalues ) {
    		$cov += ( $xvalues{$x} - $meanx ) * ( $yvalues{$x} - $meany );
    	}
    	$cov = $cov / $nb;
    	return $cov;
     
    }
     
    sub mycor {
    	my ( $refx, $refy ) = @_;
    	my %xvalues = %$refx;
    	my %yvalues = %$refy;
    	my $cor     = 0;
    	my $stdx    = mystd( \%xvalues );
    	my $stdy    = mystd( \%yvalues );
    	if ( $stdx != 0 && $stdy != 0 ) {
    		$cor = mycov( \%xvalues, \%yvalues ) / ( $stdx * $stdy );
    	}
    	else {
    		$cor = "";
    	}
    	return $cor;
    }

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Bioinformaticien
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Je vous remercie beaucoup pour vos conseils.
    Utilisant "use strict", j'avoue être très étonnée par celui de "respecter l'écriture du langage". En effet, parmi la nombreuse documentation que j'ai lue, je n'ai trouvé nul par le règlement du programmeur perlien, lequel m'aurait très certainement beaucoup aidé car, sachant qu'il existe beaucoup de façons différentes d'écrire une même instruction, en particulier dans ce langage, il est difficile de ne pas en perdre la tête parfois. Votre conseil de "commenter son code" est excellent. Je n'ai cessé de le clamer à mes étudiants! Il est vrai que je n'en ai pas pris la peine ici, pensant que le nom de mes fonctions (mysum(), mymean(), etc.) étaient suffisamment explicite. Je m'en excuse donc. Par contre, mon code est indenté. Là non plus, je n'ai trouvé aucun texte déclarant l'unique et incontournable façon d'indenter son code. J'en ai d'ailleurs vu de toutes les couleurs quelque soit le langage! Le 5ème point est obscur pour moi...

    Je vous remercie beaucoup pour vos corrections. Tel quel, le code ne fonctionne pas.
    La fonction mymean() est appelée une fois avec comme argument une référence, 2 autres fois avec un tableau. Il manquait aussi les "()" à la "réception" de l'argument dans la fonction mymean(). Avec les fonctions mymean() et mycor() corrigées comme suit, cela fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    sub mymean {
    	my ($refvaluelist)= @_;
    	my @valuelist = @{$refvaluelist};
    	my $mean      = 0;
    	$mean = mysum( \@valuelist ) / @valuelist;
    	return $mean;
    }
    
    sub mycov {
    	my ( $refx, $refy ) = @_;
    	my %xvalues = %$refx;
    	my %yvalues = %$refy;
    	my $nb      = ( values %xvalues );
    	my @xvalues = values %xvalues;
    	my @yvalues = values %yvalues;
    	my $meanx   = mymean( \@xvalues );
    	my $meany   = mymean( \@yvalues );
    	my $cov     = 0;
    	foreach my $x ( keys %xvalues ) {
    		$cov += ( $xvalues{$x} - $meanx ) * ( $yvalues{$x} - $meany );
    	}
    	$cov = $cov / $nb;
    	return $cov;
     
    }
    Il y a certainement une plus jolie façon d'écrire ce code, mais je ne suis qu'une débutante.
    En tous les cas, merci encore pour cette correction qui m'a bien dépannée. J'ai au moins compris qu'on ne pouvait pas référencer de cette façon "\values @tab" et appris que l'on déférençait un tableau comme cela "@{$reftab}" (et non pas "@$reftab" comme lu dans la documentation...) bien que cela fonctionne pour les hash (comme vous écrivez "my %xvalues = %$refx;"), il y a de quoi être perdue...

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arwen76 Voir le message
    J'ai au moins compris qu'on ne pouvait pas référencer de cette façon "\values @tab" et appris que l'on déférençait un tableau comme cela "@{$reftab}" (et non pas "@$reftab" comme lu dans la documentation...) bien que cela fonctionne pour les hash (comme vous écrivez "my %xvalues = %$refx;"), il y a de quoi être perdue...
    Dans le premier cas, values est une fonction interne de Perl, on ne peut pas vraiment prendre une référence sur cette fonction, ça n'aurait pas de sens. Mais on peut construire une référence sur le résultat produit par cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $stdx=mystd( [values %xvalues] );
    est sémantiquement équivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @temp_val = values %xvalues;
    my $stdx=mystd(\@temp_val);
    Sinon, on peut tout-à-fait déréférencer une référence de tableau avec la syntaxe @$reftab, l'ajout des accolades peut être considéré comme un peu plus clair. Dans le cas de structures de données imbriquées (du genre tableaux de hachages de tableaux), les accolades sont parfois nécessaires pour que le compilateur s'y retrouve sur l'intention du développeur.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Bioinformaticien
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci Lolo78, c'est plus clair.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par arwen76 Voir le message
    Bonjour,
    Je vous remercie beaucoup pour vos conseils.
    Utilisant "use strict", j'avoue être très étonnée par celui de "respecter l'écriture du langage". En effet, parmi la nombreuse documentation que j'ai lue, je n'ai trouvé nul par le règlement du programmeur perlien, lequel m'aurait très certainement beaucoup aidé car, sachant qu'il existe beaucoup de façons différentes d'écrire une même instruction, en particulier dans ce langage, il est difficile de ne pas en perdre la tête parfois.
    Quelques éléments de réponses à ce que j'ai surligné en gras :
    - perldoc strict
    - perldoc perlstyle
    - perldoc Perl::Critic
    - Perl Best Practicies (D. Conway)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Bioinformaticien
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci Philou pour ces références.
    J'étais quelque peu ironique car perl est un langage très (trop à mon goût) souple mais je sais bien qu'il existe des "bonnes pratiques" et pourtant personne ne vous tapera sur les doigts si vous n'en faites qu'à votre tête...

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    La souplesse du langage, c'est aussi la liberté qu'il offre.
    Et comme toute liberté, elle nécessite de ces utilisateurs, une certaine responsabilité.

    D'autres langages sont des dictatures où la liberté d'expression est limitée, où les schémas de pensée sont préformatés.

    C'est ça le bonheur dans l'informatique : on a le choix de savoir à quelle sauce on va être mangé
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Bioinformaticien
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je suis bien d'accord!
    merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'un tableau en argument d'une fonction d'une dll
    Par _LBS_ dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 16/02/2010, 18h26
  2. passage d'un tableau en argument dans une procédure
    Par cati_78 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 23/11/2008, 18h11
  3. Réponses: 14
    Dernier message: 16/05/2006, 11h26
  4. passage d'un tableau en parametre d'une fonction
    Par ataya dans le forum C++Builder
    Réponses: 10
    Dernier message: 26/10/2005, 13h30
  5. une url comme argument d'une fonction
    Par khayyam90 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/10/2004, 20h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo