zoukankan      html  css  js  c++  java
  • 第二章 集腋成裘

    <pre name="code" class="sql">Perl 的三种基本数据类型是:标量,标量数组和标量散列(hash) 
    
    一个散列(hash)数组是一个无序的键字/数值对,你可以用子串(就是键字)当作脚标来访问对应一个键字的标量(就是数值)
    
    
    2.4 变量:
    
    标量变量的开头总是$,甚至连引用一个数组或者散列中的一个标量也如此
    
    
    $days         简单标量值 $days
    
    $days[28]     数组@days 的第29个元素
    
    $day{'Feb'}   散列%days的'Feb'的值
    
    ${days}       和$days一样,不过在字母数字签名不易混淆
    
    $Dog::days    在Dog包里面的不同的$days变量
    
    
    $#days         数组@days的最后一个索引
    
    
    $days->[28]     $days 一个引用指向的数组的第29个元素
    
    $days[0][2]     多维数组
    
    $days{200}{'FEB'}  多维散列
    
    
    2.5 名字
    
    我们容易认为名字和标示符是一样的东西,不过,当我们说名字的时候,通常是指其全称,
    
    
    也就是说,表明自己位于哪个符号表的名字。这样的名字可能是一个由标记::分隔的标识符的序列:
    
    
    $Santa::Helper::Reindeer::Rudopph::nose:
    
    
    就像一个路径名里面的目录和文件一样:
    
    /Santa/Helper/Reindeer/Rudolph/nose
    
    
    在Perl的那个标识法里面,所有前导的标示符都是嵌套的符号表名字,并且最后一个标识符就是变量所在的最里面的
    
    符号表的名字。比如,上面的变量里,符号表的名字是:
    
    Santa::Helper::Reindeer::Rudolph::, 而位于此符号表的实际变量是$nose
    
    
    Perl 里的符号表也被称为(package),因此这些变量常被称为包变量。包变量名义上是其所属包的私有成员,
    
    
    但实际上是全局的,因为包本身就是全局的。
    
    
    
    常量      通用         含义           替换
    ' '        q//         文本子串        否
    
    ""         qq//        文本子串         是
    
    ` `         qx//        执行命令        是
    
    ()          qw//        单词数组         否
    
    //           m//        模式匹配         是
    
    s///         s///       模式替换         是
    
    打印出UTF-8的编码的笑脸"x{263a}"
    
    ☺zjzc01:/root/big# cat a15.pl 
    print v9786;
    zjzc01:/root/big# perl a15.pl 
    Wide character in print at a15.pl line 1.
    ☺zjzc01:/root/big# 
    
    2.6.8  其他文本记号
    
    
    你应该把任何以双下划线开头和结束的标示符看作由Perl保留做特殊语法处理的记号。
    
    
    其中有两个这类特殊文本是LINE和__FILE__,分别意味着在你的程序某点的当前行号和文件名。
    
    
    它们只能用做独立的记号;它们不嫩被代换位子串。与之类似,__PACKAGE__ 是当前代码所编译进入的包的名字
    
    
    
    如果没有当前包(因为有一个空的package,指示)
    
    __PACKAGE__ 就是未定一致。
    
    zjzc01:/root/big# cat a16.pl 
    @files=qw/a b c d e f g/;
    while (@files){
         my $file = shift @files;
         print "$file is $file
    ";
    };
    
    zjzc01:/root/big# perl a16.pl 
    $file is a
    $file is b
    $file is c
    $file is d
    $file is e
    $file is f
    $file is g
    
    
    不要试图在这里用defined @files,那样没用,因为defined 函数是询问一个标量是否为undef,
    
    而一个数组不是标量。简单的布尔值测试就够用了。
    
    
    2.7.3  空(void)环境
    
    zjzc01:/root/big# cat a18.pl 
    @stuff=qw/1 2 3 4/;
    $stuff = @stuff;
    print "$stuff is $stuff
    ";
    zjzc01:/root/big# perl a18.pl 
    $stuff is 4
    
    当数组处于标量环境时,它只返回数组长度
    
    2.8.1  列表赋值:
    
    
    截断一个数组并不回收其内存,你必须undef(@whatever)来把它的内存释放会你的进程的内存池里。
    
    
    你可能无法把它释放回你的系统的内存池,因为几乎没有那种操作系统支持这样做。
    
    
    zjzc01:/root/big# cat a19.pl 
    %map = (
           red => oxff0000,
           green => 0x00ff00,
           blue => 0x0000ff,
    );
    print %map;
    zjzc01:/root/big# perl a19.pl 
    green65280blue255redoxff0000zjzc01:/root/big# 
    
    
    zjzc01:/root/big# cat a19.pl 
    %map = (
           red => oxff0000,
           green => 0x00ff00,
           blue => 0x0000ff,
    );
    print %map;
    zjzc01:/root/big# perl a19.pl 
    green65280blue255redoxff0000zjzc01:/root/big# 
    
    
    或者初始化任何当作记录使用的匿名散列引用:
    
    {} 表示散列引用:
    
    
    zjzc01:/root/big# cat a20.pl 
    $rec = {
         NAME => 'John Simth',
         RANK => 'Captain',
         SERNO => '951413'
    };
    print $rec;
    print "
    ";
    print %$rec;
    zjzc01:/root/big# perl a20.pl 
    HASH(0x197fd48)
    NAMEJohn SimthSERNO951413RANKCaptainzjzc01:/root/big# 
    
    
    2.10  型团(typeglob) 和文件句柄
    
    
    Perl 里面有种特殊的类型叫做类型团(typeglob) 泳衣保留整个符号表记录。
    
    (符号表记录 *foo 包括$foo,@foo,%foo &foo 和其他几个foo的简单解释值)
    
    类型团(typeglob)的类型前缀上一个*,因为它代表所有类型。
    
    
    zjzc01:/root/big# cat a21.pl 
    $foo='a';
    @foo = qw/1 2 3 4/;
    %foo = ("a"=>1,"b"=>2,"c"=>3);
    
    $fh = *foo;
    
    print "$fh is $$fh
    ";
    print "$fh is @$fh
    ";
    
    zjzc01:/root/big# perl a21.pl 
    $fh is a
    $fh is 1 2 3 4
    
    
    
    或者:
    
    zjzc01:/root/big# cat a21.pl 
    $foo='a';
    @foo = qw/1 2 3 4/;
    %foo = ("a"=>1,"b"=>2,"c"=>3);
    
    *fh = *foo;
    
    print "$fh is $fh
    ";
    print "$fh is @fh
    ";
    zjzc01:/root/big# perl a21.pl 
    $fh is a
    $fh is 1 2 3 4
    
    
    类型团如今的主要用途是把一个符号表取另一个符号表名字做别名,别名就是外号,如果你说:
    
    *foo = *bar;
    
    那所有叫"foo" 的东西都是每个对应的叫"bar"的同义词,你也可以通过给类型团赋予引用实现
    
    只给某一个变量取别名:
    
    2.11.2 行输入(尖角)操作符:
    
    zjzc01:/root/big# cat a22.pl 
    while (<STDIN>){
    print "$_ is $_
    ";
    };
    
    2.11.3  文件名聚集操作符:
    
    zjzc01:/root/big# cat a23.pl 
    @files = glob("*pl");
    print @files;
    
    zjzc01:/root/big# perl a23.pl 
    a1.pla10.pla11.pla12.pla13.pla14.pl
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    


    
                                        
    
  • 相关阅读:
    Android网络框架OkHttp之get请求(源码初识)
    Android Studio运行报错,Cannot find System Java Compiler. Ensure that you have installed a JDK......
    Android基于xmpp的即时通讯应用
    Android 基于Http的多线程下载的实现
    1.3 Quick Start中 Step 3: Create a topic官网剖析(博主推荐)
    1.3 Quick Start中 Step 2: Start the server官网剖析(博主推荐)
    1.3 Quick Start中 Step 1: Download the code官网剖析(博主推荐)
    1.2 Use Cases中 Commit Log官网剖析(博主推荐)
    1.2 Use Cases中 Event Sourcing官网剖析(博主推荐)
    1.2 Use Cases中 Stream Processing官网剖析(博主推荐)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351377.html
Copyright © 2011-2022 走看看