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  自动装载:
    
    

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199972.html
Copyright © 2011-2022 走看看