zoukankan      html  css  js  c++  java
  • 第章 Typeglob和符号表

    perl 变量,符号表和作用域:
    
    
    Perl 有一个在其他语言中一般见不到的奇怪恶性,你可以使用同样的名字来标识数据或非数据类型。
    
    
    例如,标量变量$spud,数组@spud,散列表%spud,子例程&spud
    
    
    Perl 使用符号表来把标示符名(就是去掉前缀的"spud"字符串)映射到相应的值。
    
    
    Typeglob 是一种可以在脚本程序中使用的真实的数据类型,它拥有前缀"*",
    
    尽管你可以把它相像成一种代表所有值的通配符
    
    
    
    词法与动态作用域的比较:
    
    
    有两种方式将私有数值传入子例程或代码块,第一种是使用local操作符,但它只限于全局变量,
    
    它先将变量值保存,然后在代码块结束时再恢复原有值。
    
    另外一种方式就是my,它不但又新建了一个变量,而且还把它置为只对代码块可见
    
    
    zjzc01:/root/hei# cat a21.pl 
    $a=20;    #全局变量
    {
      local $a; #先保存$a原先的值,新值为undef
      my (@b);    #Lexical 变量
      $a=10;      #改变$a的新值
      @b=("wallance","grommit");
    print $a;     #打印结果为10
    print "@b";   #打印结果为"wallance grommit";
    };
    ##代码块结束,又回到全局域中,此时只有$a有效
    print $a;    ##打印出20
    print @b;
    
    
    由于local语句使得该全局变量在代码块终结时被释放并以原来的值重新创建
    
    
    
    虽然它们的用法相同,但是local和my之间有一个很重要的差别。my声明将创建真正的局部变量,
    
    
    这有点像C语言中的自动变量。变量只在声明它的代码块中可见(代码块从词法上定义了这种界限)
    
    这对代码块中调用的其他字例程来说是无效的。
    
    
    
    于my不同,local 操作符并不创建新的变量,当你把它作用域全局变量时,它就会把他全局变量的值隐藏起来,
    
    并在代码块终结时予以恢复。
    
    
    换句话说 就是local 以临时的方式保存当前的新值,它并没有改变变量的本质(变量仍然是全局变量).
    
    
    而my则创建新的局部变量
    
    
    
    
    
    
    Typelob
    
    我们前面提到typeglob 可以被局部化(只能使用local),还可以相互赋值。通过typeglob赋值可以创建标示符的别名:
    
    zjzc01:/root/hei# cat a22.pl 
    $spud = "Wow!";
    @spud=("idaho","russet");
    *potato = *spud;
    print "$potato  is $potato
    ";
    print "@potato is @potato
    ";
    zjzc01:/root/hei# perl a22.pl 
    $potato  is Wow!
    @potato is idaho russet
    
    
    使用typeglob别名:
    
    
    高效的参数传递:
    
    因为别名不存在间接访问操作,因此它套比引用的速度快一些。例如:
    
    zjzc01:/root/hei# cat a23.pl 
    $a = 10;
    *b = *a; $b++;  #1. 通过typeglob方式间接的使$a加一
    print "$a is $a
    ";
    $r=$a;$$r++;   #2.通过引用方式间接的使$a加一
    print "$a is $a
    ";
    
    
    zjzc01:/root/hei# perl a23.pl 
    $a is 11
    $a is 12
    
    
    
    
    
    
    

  • 相关阅读:
    合并hive/hdfs小文件
    NoSql图形数据库
    mysql分表
    查看带宽使用
    mysql中间件kingshard
    centos7安装docker
    nginx的proxy_pass路径转发规则最后带/问题
    centos关闭邮件提醒
    JOSN转列格式(csv文件)
    Android 常见对话框
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351108.html
Copyright © 2011-2022 走看看