[root@wx03 5]# cat test1.pl
sub fun1 {
$var=100;
# return $var;
};
$var=10;
print "first..........\n";
print "\$var is $var\n";
print "second...........\n";
&fun1;
print "\$var is $var\n";
[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..........\n";
print "\$var is $var\n";
print "second...........\n";
&fun1;
print "\$var is $var\n";
use test1;
my $ua=test1->new();
my $str=$ua->fun1;
print $str;
print "\n";
print "third............\n";
print "\$var is $var\n";
[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..........\n";
print $$ref;
print "\n";
@var=qw/a1 b2 c3 d4/;
print @$ref;
print "\n";
[root@wx03 5]# perl t1.pl
first..........
10
a1b2c3d4
[root@wx03 5]# cat t1.pl
*ref=*var;
$var=10;
print "first..........\n";
print $ref;
print "\n";
@var=qw/a1 b2 c3 d4/;
print @ref;
print "\n";
[root@wx03 5]# perl t1.pl
first..........
10
a1b2c3d4
10.2 自动装载: