perl函数中的传引用用法

来源:互联网 发布:mac边充电边用好吗 编辑:程序博客网 时间:2024/05/16 14:50

自己的代码


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

原创粉丝点击