zoukankan      html  css  js  c++  java
  • [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  自动装载:
    
    

  • 相关阅读:
    mysql采坑笔记
    git常用操作
    vscode配置及插件
    atom之插件安装及相关
    xshell中操作服务器笔记
    js学习笔记之自调用函数、闭包、原型链
    dragover event 翻译
    拖放事件笔记
    关于clear:both;后有固定高度的原因及解决方法
    weex打包android apk采坑之旅(windows)
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199971.html
Copyright © 2011-2022 走看看