子过程实践

来源:互联网 发布:c语言课程设计案例 编辑:程序博客网 时间:2024/05/17 05:08
1。数组输入到子过程的是数组存储第一个元素的地址。也就是说不论原始数组中有多少元素,输入的@_中只有一个元素,首地址。接受首地址的变量必须是加括号的比如"($aa)"不能是“$aa"。
而且遍历@_是没有任何意义的(其中只有一个元素,首地址)。" foreach ( @_ ) "
这个和列表有着本质的区别,列表不论输入的元素有多少,输进去的依旧是列表元素,不是列表所在的地址。
可以用$_[$i]表示列表中的元素,但是对于数组却是首地址,不是地址中存放的元素的值。

sub change {
        my ($aa) = @_;
        my $num = @$aa;
        for ( my $i=0; $i<$num; $i++ ) {
                print $_[$i];#会报错,因为@_中只有一个元素,其他的都是非定义的值。
        }
        foreach ( @$aa ) {
                tr/A-Z/a-z/; #对地址中的元素进行大小写替换,原始数据也跟着变换。
                print "$_\n";
        }
}
my @aa = ( "AAAAAAAAAAAAAAAAAAAAAA", "TTTTTTTTTTTTTTTTTTTTTT" );
change ( \@aa );
foreach my $dd ( @aa ) {
        print "$dd\n"; #输出结果为小写,子过程已经修改地址中的值。
}

aaaaaaaaaaaaaaaaaaaaaa
tttttttttttttttttttttt
aaaaaaaaaaaaaaaaaaaaaa
tttttttttttttttttttttt

2。不修改原来数值的方式,依次把输入值赋值到新的地址。本质上说,要想不改变原始值,就必须把原始值备份到新的地址,然后在新的地址进行数值操作。
sub change {
        my ($aa) = @_;
        my @tt;
        push @tt, $$aa[0]; #把数值赋值到新的地址
        push @tt, $$aa[1];

        foreach my $bb ( @tt ) {
                $bb =~ tr/A-Z/a-z/;
                print "$bb\n";
        }
}
my @aa = ( "AAAAAAAAAAAAAAAAAAAAAA", 
"TTTTTTTTTTTTTTTTTTTTTT" );
change ( \@aa );
foreach my $dd ( @aa ) {
        print "$dd\n";
}
aaaaaaaaaaaaaaaaaaaaaa
tttttttttttttttttttttt
AAAAAAAAAAAAAAAAAAAAAA
TTTTTTTTTTTTTTTTTTTTTT