子程序调用子程序错误?

子程序调用子程序错误?



[Copy to clipboard] [ - ]
CODE:
sub avg{
   my @array=@_;
   my $sc;
   my $ss;
   foreach(0..$#array){
     $sc+=$array[$_];
      ++$ss;
   }
  return $sc/$ss;
}
my @fred=(1..5);
my $fred_total=avg(@fred);
sub above_average{
     my @array=@_;
     foreach(@array){
      if ($_ > $fred_total) {
      push @scalar,$_;
      }
     }
     return @scalar;
}
print "the tatal of  \@fred is $fred_total.\n";
above_average(@fred);
print "@scalar\n";

假设把上面的程序换成

[Copy to clipboard] [ - ]
CODE:
sub avg{
   my @array=@_;
   my $sc;
   my $ss;
   foreach(0..$#array){
     $sc+=$array[$_];
      ++$ss;
   }
  return $sc/$ss;
}
my @fred=(1..5);
my $fred_total=avg(@fred);
sub above_average{
     my @array=@_;
     foreach(@array){
      if ($_ > avg(@array)) {
      push @scalar,$_;
      }
     }
     return @scalar;
}
print "the tatal of \@fred is $fred_total.\n";
above_average(@fred);
print "@scalar\n";

那么它算出的平均数是1.5,而不是三了!!这是为什么啊!!

因为$ss是全域变量....
你写代码的习惯不好....
建议加上use warnings;或使用 -w後再写.....


QUOTE:
原帖由 songpure520 于 2008-4-25 16:50 发表
sub avg{
   my @array=@_;
   my $sc;
   foreach(0..$#array){
     $sc+=$array[$_];
      ++$ss;
   }
  return $sc/$ss;
}
my @fred=(1..5);
my $fred_total=avg(@fred);
sub above_average{
...

因为你的$ss变量是全局的
真不明白怎么一部分是用my定义,一部分是全局的
$ss在每次调用avg subroutine的时候都是不一样的

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use warnings;
our $num;
sub avg{
   my @array=@_;
      my ($sc,$ss);
      foreach(0..$#array){
      $sc+=$array[$_];
            ++$ss;
       }
       $num=$ss;
         return $sc/$ss;
}
my @fred=(1..5);
my $fred_total=avg(@fred);
sub above_average{
      my @array=@_;
           foreach(@array){
         if ($_ > avg(@array)) {
       push @scalar,$_;
             }
          }
       return @scalar;
      }
       print "the average of $num \@fred is ", avg (@fred),"\n";



QUOTE:
原帖由 apile 于 2008-4-25 21:19 发表
因为$ss是全域变量....
你写代码的习惯不好....
建议加上use warnings;或使用 -w後再写.....

手真快
我本来是把$ss定义为私有变量的,为了方便调试,我想把$ss打印出来,

[Copy to clipboard] [ - ]
CODE:
print "the tatal of $ss\@fred is $fred_total.\n";

但是这个全局变量跟我调用子程序得出的平均数没有关系吧!