perl语言入门:全局变量和私有变量

前言:使用use strict

 perl语言编程环境有两套,宽松和严格,默认是宽松风格,而严格模式需要在文件开头使用use strict 命令。

通常建议大家都使用use strict,遵循严谨优良编程风格,在宽松风格下,脚本调试将是很复杂的一件事,不适合新手。

声明私有变量 my

要点1

在use strict模式下,一个文件内的所有变量都需要通过 my 进行声明,如:

my $fred;

my @fred;

my ($name_1,$name_2);

...

实例1

#!/usr/bin/perl

use strict;

$name;
$name = "zhangsan";
print "$name\n";

 上述脚本中使用了严格模式,然后变量$name并未使用my声明,执行此文件便会报错:

Global symbol "$name" requires explicit package name at ./my07 line 5.
Global symbol "$name" requires explicit package name at ./my07 line 6.
Global symbol "$name" requires explicit package name at ./my07 line 7.

要点2

my声明的变量都是私有变量(也称为词法变量),需要注意的是变量的作用域 scope!!

作用域 scope

简单理解就是在哪使用 my 声明的变量,其作用域就是声明语句所在的范围,如:

#1.作用域为整个文件(实例2)

在文件中单独声明 --> 当一个变量可以该文件中不受限使用时,你也可以理解为全局变量

#2.作用域为某个子程序(实例3)

在子程序中声明

#3.作用域是某个条件判断(实例4)

在if语句中声明

#4.作用域是某个循环

在while语句中声明

......

⚠在strict模式下,所有变量都是私有变量(因为都要my声明),而作用域最大也就仅限于单个文件,那么当涉及可重用库和模块时,该模式便不适用了(局限性)。

实例2

#!/usr/bin/perl
use strict;

my $name;
$name = "zhangsan";
if($name eq "zhangsan"){
 print "你找对人了,他叫$name\n";
}
print "他真的叫$name\n";

执行结果:

你找对人了,他叫zhangsan
他真的叫zhangsan

实例3

#!/usr/bin/perl

use strict;

my $name = "lisi";
sub test{
 my $name = "zhangsan";
 print "他叫$name\n";
};

&test;
print "他真的叫$name\n";

执行结果:上述示例中定义了两个作用域:文件和子程序,从结果可知,子程序中的变量优先调用自己范围内的变量(其他作用域可类推),并且不同作用域的变量名可相同,表明不同作用域的变量都有自己独立的命名空间。

[root@VM-0-8-centos scripts]# ./my07 
他叫zhangsan
他真的叫lisi

实例4

#!/usr/bin/perl

use strict;

my $name = "lisi";
if($name eq "lisi"){
 my $name = "zhangsan";
 print "他叫$name\n";
};

print "他真的叫$name\n";

 执行结果:分析可参见案例3

[root@VM-0-8-centos scripts]# ./my07 
他叫zhangsan
他真的叫lisi

持久化声明私有变量state

先看一个在use strict模式下的案例

#!/usr/bin/perl
use strict;

sub sum{
  my $n = 0;
  $n += 1;
  print "现在一共调用此子程序$n次\n";
};

∑
∑
∑

 执行结果:从结果看,每次调用子程序,其子程序的私有变量的值在每次调用时都会被重置,然而有时候我们会重复调用某个子程序,并希望其私有变量的值不要重置,能一直保留(解决办法:使用state声明)。

[root@VM-0-8-centos scripts]# ./my07 
现在一共调用此子程序1次
现在一共调用此子程序1次
现在一共调用此子程序1次

 state使用案例

#!/usr/bin/perl
use strict;
use v5.10;

sub sum{
  state $n = 0;
  $n += 1;
  print "现在一共调用此子程序$n次\n";
};

∑
∑
∑

执行结果:

[root@VM-0-8-centos scripts]# ./my07 
现在一共调用此子程序1次
现在一共调用此子程序2次
现在一共调用此子程序3次 

使用细节⚠⚠: 原先my替换成了state,并且添加了use v5.10语句,因为该特性是从Perl 5.10开始引入的,需要声明,否则会报错。

宽松模式下的全局变量和私有变量

待整理

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值