zoukankan      html  css  js  c++  java
  • 符号表

    第三章
    
    Typeglob和符号表:
    
    本章将讨论typeglob,符号表,文件句柄,打印格式以及动态作用域与词法作用域的差异。
    
    Perl 变量,符号表和作用域:
    
    变量要么就是全局的,要么就是词法的(lexical,指那些以my语句限定的变量)
    
    
    
    Perl 为每一种类型的实体提供不同的名字空间。
    
    
    Perl 使用符号表来标识符号(就是去掉前缀的"spud"字符串)映射到相应的值。
    
    但是散列表不允许重复键值.
    
    Typeglob 是一种可以在脚本程序中使用的真实的数据类型,它拥有前缀"*".
    
    
    监管你可以把它想象成一种代表所有值的通配符,这些值拥有相同的标志
    
    [oracle@oadb 3]$ cat a1.pl 
    $ref=*var;  
    $var=10; 
    print $$ref;
    print "
    ";
    
    @var=(1,2,3,4);
    print @$ref;
    print "
    ";
    [oracle@oadb 3]$ perl a1.pl 
    10
    1234
    
    
    
    词法于动态作用域的比较:
    
    有两种方式将私有数值传入子程序或代码块。
    
    
    第一种是使用local操作符,但它只限于全局变量,它先进变量值保存,然后在代码块结束时再回复原有值。
    
    
    [oracle@oadb 3]$ cat a2.pl 
    $a=20; ##全局变量
    
    {
      local $a; #先保存$a原来的值,新值为undef
      $a=10;
      print "1111111$a=$a";
      print "
    ";
    };
      print "2222222$a=$a";
      print "
    ";
    
    
    [oracle@oadb 3]$ perl a2.pl 
    1111111$a=10
    2222222$a=20
    
    
    
    Typeglob
    
    我们前面提到typeglob 可以被局部化(只能使用local),还可以相互赋值。通过typeglob赋值可以创建标识符的别名:
    
    [oracle@oadb 3]$ cat a3.pl 
    $spud="Wow!";
    
    @spud=("idhao","russet");
    
    *potato=*spud;
    
    print $potato."
    ";
    
    print @potato;
    print "
    ";
    [oracle@oadb 3]$ perl a3.pl 
    Wow!
    idhaorusset
    
    
    
    临时别名:
    
    目前暂时还没有一种简单而直观的方法,用于删除由typeglob赋值产生的别名
    
    
    Typeglob与引用:
    
    你或许已经注意到typeglob和引用均指向值,变量$a可以被简单的视为一个
    
    typeglob的间接访问${*a}
    
    [oracle@oadb 3]$ cat a4.pl 
    $spud="Wow!";
    
    @spud=("idhao","russet");
    
    *a=*spud;
    
    print $a."
    ";
    
    print @a;
    print "
    ";
    [oracle@oadb 3]$ perl a4.pl 
    Wow!
    idhaorusset
    
    为匿名子例程起名:
    
    你如果觉得间接的通过引用来调用子例程(&$rs())很不舒服的话,那么你可以赋给它一个名字以求方便。
    
    1[oracle@oadb 3]$ cat a5.pl 
    sub generate_greeting {
       my $greeting=shift;
       return sub{print "$greeting world
    ";}
    };
    
    $rs=generate_greeting("hello");
    
    print &$rs;
    
    
    *greet=$rs;
    
    print greet();
    [oracle@oadb 3]$ perl a5.pl 
    hello world
    1hello world
    1[oracle@oadb 3]$ 
    


    
                                        
    
  • 相关阅读:
    编程思想之正则表达式
    SQL查询顺序
    hibernate inverse属性的作用
    介绍一下Hibernate的二级缓存
    JSON数据
    你没玩过的全新版本!Win10这些骚操作你知多少
    VSCode 小鸡汤 第01期
    Editor REST Client
    k8s常用命令
    【项目3-2】多肉植物网站
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349765.html
Copyright © 2011-2022 走看看