[root@wx03 5]# cat test1.pl sub fun1 { $var=100; # return $var; }; $var=10; print "first.......... "; print "$var is $var "; print "second........... "; &fun1; print "$var is $var "; [root@wx03 5]# perl test1.pl first.......... $var is 10 second........... $var is 100 没有使用包的时候 函数里的全局变量 会覆盖当前$var同名变量: [root@wx03 5]# cat test1.pm package test1; sub new { my $invocant = shift; my $self={}; my $class = ref($invocant) || $invocant; bless $self, $class; return $self; }; sub fun1 { my $self=shift; $var=300; return $var; }; 1; [root@wx03 5]# cat test1.pl sub fun1 { $var=100; # return $var; }; $var=10; print "first.......... "; print "$var is $var "; print "second........... "; &fun1; print "$var is $var "; use test1; my $ua=test1->new(); my $str=$ua->fun1; print $str; print " "; print "third............ "; print "$var is $var "; [root@wx03 5]# perl test1.pl first.......... $var is 10 second........... $var is 100 300 third............ $var is 100 此时包里的变量不会覆盖外面的变量: [root@wx03 5]# cat test1.pm package test1; sub new { my $invocant = shift; my $self={}; my $class = ref($invocant) || $invocant; bless $self, $class; return $self; }; our $Version=199; sub fun1 { my $self=shift; our $var=300; return $var; }; 1; [root@wx03 5]# cat test1.pm package test1; sub new { my $invocant = shift; my $self={}; my $class = ref($invocant) || $invocant; bless $self, $class; return $self; }; my $Version=199; ##此处必须是全局变量 sub fun1 { my $self=shift; our $var=300; return $var; }; 1; 所有随后的标识符(包括那些用 our 声明的,但是不包括那些用 my 或者那些用其他包 名字修饰的的变量。)都将放到属于当前包的符号表中。(用 my 声明的变量独立于包; 它们总是属于包围它们的闭合范围,而且也只属于这个范围,不管有什么包声明。) use 是加载一个 .pm 文件, package 是切换当前名字空间, our 是在当前名字空间中创建一个变量,如果该变量已经存在,则 our 只起到一个声明的作 用。 --------------------------------------------------------------------------------- --- our (或者什么修饰都没有)声明的是“包全局变量”,它的是“依附”在“包”上面的, 它的存储位置是“包符号表”, my 声明的是“词法变量”,它是“依附”在“代码块”上的,它的存储位置是“代码块”的 “变量标签薄”,所以词法变量不可以从代码块之外访问(除了传递引用)。 但是包全局变量就不同了,用全限定就可以访问。 10.1 符号表: [root@wx03 5]# cat t1.pl $ref=*var; $var=10; print "first.......... "; print $$ref; print " "; @var=qw/a1 b2 c3 d4/; print @$ref; print " "; [root@wx03 5]# perl t1.pl first.......... 10 a1b2c3d4 [root@wx03 5]# cat t1.pl *ref=*var; $var=10; print "first.......... "; print $ref; print " "; @var=qw/a1 b2 c3 d4/; print @ref; print " "; [root@wx03 5]# perl t1.pl first.......... 10 a1b2c3d4 10.2 自动装载: