天天看點

[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  自動裝載:

      
上一篇:
下一篇: