关于hash参数传递

关于hash参数传递



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

sub dis{
        my(%hash)=@_;
        my $c=$hash{$a};
        my $d=$hash{$b};
        return $c*$d;
}
print dis($a=>;6,$b=>;5);

result:25
为什么不是30呢?
hash不能這樣傳遞的...你要用
sub dis {
  my($hashref) = @_;

}

dis(\%hash);


sub dis{
  my (*hash) = @_;
   $hash{key} = 222;
}
dis(\%hash);


QUOTE:
原帖由 "bioinfor" 发表:
result:25
为什么不是30呢?

错就错在你的散列表的键是“$a”“$b” 这种怪异的写法上了。
如果你这么写就没有问题:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

sub dis{
   my(%hash)=@_;
   my $c=$hash{a};
   my $d=$hash{b};
   return $c*$d;
}
print dis(a=>;6,b=>;5);

或者如果你非要用“$a”“$b”做键的话,就得这么写:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

sub dis{
   my(%hash)=@_;
   my $c=$hash{'$a'};
   my $d=$hash{'$b'};
   return $c*$d;
}
print dis('$a'=>;6,'$b'=>;5);

Perl 把 $a $b 当作两个变量来处理了,而你又没有定义他们的值。
更加错误的是,你没有用 use strict 和 use warnings,如果用了他们,还有可能给你提示一个错误。
更加更加错误的是,你用 $a $b 来做变量名了,所以即使是你加了 use strict 和 use warnings 也不会报错。
总之,Perl 是一个很敏感的语言,你稍微写错一点,那么 Perl 就会按照它的思路去理解你的程序,最后就会得出和你的想法完全不同的结果。

解决此类问题的唯一办法,就是熟读 Perl 语法!
学习一种语言而不去掌握它的语法,你会很头疼的,尤其是 Perl 这种很灵活的语言。

to apile:
只有当子程序包含有多个复杂结构的参数时,才有必要使用引用来传递散列表和数组。楼主这个情况下不需要使用引用来传递散列表。
謝謝指正...我的習慣..多傳ref..少用hash直接傳進去....
好久沒看書了..


QUOTE:
原帖由 "flw" 发表:
?
只有当子程序包含有多个复杂结构的参数时,才有必要使用引用来传递散列表和数组。楼主这个情况下不需要使用引用来传递散列表。

真是受益匪浅!不过还有一点想请教一下FLW,为什么它输出的是25而不是36或其它的呢?我很想知道perl是怎么解释这个程序的?
如果你写成这样:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

sub dis{
   my(%hash)=@_;
   my $c=$hash{$a};
   my $d=$hash{$b};
   return $c*$d;
}
print dis($a=>;5,$b=>;6);

就应该是 36 了。
$a $b 两个变量的内容都是空字符串(不是 undef,因为 $a $b 是 pre-defined(预定义) 变量),所以构成散列表的时候,后面的一个会把前面的一个的值覆盖掉。
不错
debian01:~/perl# perl 2.pl
syntax error at 2.pl line 9, near "=>;"
syntax error at 2.pl line 9, near "6)"
Execution of 2.pl aborted due to compilation errors.
楼上,你看看提示,,都写得好明了多了个 ; 嘛.