自己的代码
sub insHash{
my $filenm=@_[0];
my $ref_hash_field=@_[1];
open(INFILE, "<$filenm" )||die("can't open describe/$filenm \n");
while ( $line=<INFILE>) {
my @field_all=split(/\s+/,$line);
my $field_type=@field_all[1];
my $field_nm=@field_all[2];
my $field_len=@field_all[3];
#将字段名、类型、长度记录到hash中
my %hash_tmp=("type"=>"$field_type","len"=>"$field_len");
$$ref_hash_field{"$field_nm"}="1";
}
close(INFILE);
#while(($key,$value)=each%ref_hash_field){
# print "$key $value\n";
#}
}
insHash($tmp_filenm_src_2,\%hash_field_src);
perl中的是如何在函数中使用引用参数的。有时不想返回数组或者其他形式,希望直接修改函数的参数的实例的具体的值,作为返回,就C中的传递引用参数一样。
这样在perl中是怎么写的呢? 查了一下文档,perl中的引用应该是通过”\“ 来写的,就像C中&操作符取地址一样。
所以你写
$var1= \$var2 ;
就创建了一个名字$var1的引用,引用的是$var2; 有了引用你就可以修改原有的变量的值了,但还要通过的一个类似c中的* 操作符的 "$"符号,表示对引用再取值,所以当
$$var1="11111" ;
这样的语句的到执行的时候,$var2的值就被修改了。不过注意的是如果你使用的是数组的引用,像这样:
$var1= \@var2 ;
那么你等会要获取$var1指向的数组,应该写 @$var1 这样了。
知道了perl的引用语法,所以想传引用的话,就可以像下面的myFunc1 那样写就行了。
但我们又知道在子过程中@_ 这个数组其实也是指向具体的参数的实例的,不是参数的拷贝。
所以你在函数里面写$var1 = \$_[0];的时候其实也是获得了参数的引用。所以就可以写出
myFunc2那样的函数,注意传给myFunc2的参数没有加上\ 来表示引用了。不过竟然@_ 就可以直接
返问参数的原有实例了,那么我们直接给他赋值不就行了吗,我们还需要引用干什么呢,就像myFunc3做的那样。它直接修改了参数的第一个参数的值,也达到了c中传引用的效果啦。
perl这个东西真是难用,语法奇怪的很!!!
--------------------------------
my $var1 ='0000000';
sub myFunc1{
my $var1 = shift;
#print "var1 = $$var1\n";
$$var1 = "1111111";
}
sub myFunc2{
my $var1 = \$_[0];
#print "var1 = $$var1\n";
$$var1 = "2222222";
}
sub myFunc3{
$_[0] = "33333";
}
print "var1 = $var1\n";
myFunc1(\$var1);
print "var1 = $var1\n";
myFunc2($var1);
print "var1 = $var1\n";
myFunc3($var1);
print "var1 = $var1\n";
------------------------------
运行后输出:
var1 = 0000000
var1 = 1111111
var1 = 2222222
var1 = 33333