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?