Perl变量的作用域

Perl变量的作用域

my scope

Perl中有两个主要的变量类型。一种是包全局变量,它可以用use vars结构声明(这种方式已经过时)或者通过our声明。

 

另外一种通过my声明的词法变量。

 

来看一下当使用my声明变量时会发生什么?在代码的哪些部分这样的变量可见?换句话说,这些变量的作用域是什么?

 

变量作用域:闭合代码块

#!/usr/bin/perl

use strict;

use warnings;

 

{

    my $email = 'foo@bar.com';

    print "$email\n"; # foo@bar.com

}

# print $email;

# $email does not exists

# Global symbol "$email" requires explicit package name at ...

匿名代码块(一对花括号{})内,首先我们看到的是新变量$emial的声明。从声明到代码块结束,在这段代码区间内变量是有效的。因此,闭合花括号}之后的代码行要注释掉。如果把# print $email;中的#去掉,再来运行脚本,你会得到如下编译错误Global symbol "$email" requires explicit package name at ...。

 

也就是说,每个通过my声明的变量,其作用域是闭合代码块。

 

变量作用域:在任何地方可见

变量$lname在代码开头声明。它对于到文件结尾的所有部分都是可见的,甚至是代码块和函数声明内部。如果我们在代码块内改变了变量的值,也会改变该变量在代码其它部分的值。即便离开了代码快,这种改变也是有效的:

 

#!/usr/bin/perl

use strict;

use warnings;

 

my $lname = "Bar";

print "$lname\n"; # Bar

 

{

    print "$lname\n"; # Bar

    $lname = "Other";

    print "$lname\n"; # Other

}

print "$lname\n"; # Other

通过其它声明来隐藏变量

#!/usr/bin/perl

use strict;

use warnings;

 

my $fname = "Foo";

print "$fname\n"; # Foo

 

{

    print "$fname\n"; # Foo

 

    my $fname = "Other";

    print "$fname\n"; # Other

}

print "$fname\n"; # Foo

在这个例子里,变量$fname声明在代码开头。如前所述,除了在那些使用同样名字声明局部变量的地方,它会从声明处到文件结束的任何区域内都可见。

 

代码快中,使用my声明另一个同名变量。这样会把在外面声明的$fname阻隔起来,直到离开代码块。运行到代码块结束的地方(闭合})时,在内部声明的$fname会被销毁,而原来的$fname又可见了。这种特性非常重要,它可以让你在小作用域中创建变量时不用顾及外部是否已经有同名变量。

 

多代码块,相同变量名

你可以无拘束地在不同代码块中使用相同变量名。这些变量互相之间是没有联系的。

 

#!/usr/bin/perl

use strict;

use warnings;

 

{

    my $name = "Foo";

    print "$name\n"; # Foo

}

{

    my $name = "Other";

    print "$name\n"; # Other

}

in-file package declaration

这是一个稍微高级的例子,之所以在这里提,是因为它比较重要:

 

Perl允许通过package关键字在文件中切换命名空间。声明包不会新建作用域。如果在main包(脚本正文)中声明变量,$fname变量即便是在同一文件的其它命名空间也是可见的。

 

如果在'Other'命名空间声明变量$lname,在你之后切换回main命名空间时也是可见的。如果Other包是声明在其它文件,变量会因为文件的不同存在于另外一个作用域。

 

#!/usr/bin/perl

use strict;

use warnings;

 

my $fname = "Foo";

print "$fname\n"; # Foo

 

package Other;

use strict;

use warnings;

 

print "$fname\n"; # Foo

my $lname = 'Bar';

print "$lname\n"; # Bar

 

 

package main;

 

print "$fname\n"; # Foo

print "$lname\n"; # Bar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值