zoukankan      html  css  js  c++  java
  • Perl 学习笔记-哈希

    1.Perl中的哈希

      高效快捷, 没有大小限制. 大哈希一样很快! 

      命名: 和Perl其他标识符一样, 同时拥有自己的的名字空间.  $roger{"sex"} 和 $roger没有关系

      赋值: 对已存在的哈希赋值会覆盖原有值. 哈希元素会因赋值而产生(赋值就是"插入"哈希表中),  访问不存在值就会得到undef

    $roger{'name'}="roger";
    if($roger{'sex'} == undef){
        print "undef
    ";
    }

    2.建立hash   (对整个hash的引用使用%,对哈希变量的引用使用$)

    # 下面3种方法等效
    $roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=21; 
    %roger = ("name","roger","sex","male","age","21"); #在(数组)列表上下文中自动转换为键值对保存在roger表中
    %roger = ( #hash 也可以是词法变量,可以在前面加my操作符, 同时也是在列表上下文中
        "name" => "roger",
        "sex"  =>  "male",
        "age"  =>  21
    );
    print $roger{"name"};

      哈希还可以通过已有哈希来建立

    $roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=21; $roger{18}="young";
    print $roger{18}."
    ";  #键还可以是数值, 实际上在Perl中并不区分,因为只有3种基本数据类型(标量,数组和哈希),所以键值为标量即可
    %Roger = %roger;
    print $Roger{"sex"}."
    "; #male
    # 键值对反转
    %loger = reverse %roger;
    print $loger{21}."
    "; #通过原来的值来访问键,但是要保证原理的值唯一, 否则会有覆盖发生,得不到预期结果

      同样, %roger{'name'}也能得到正确结果, 但是$roger{'name'}是更好的访问方式.

      胖箭头左边的任何裸词都能自动引用,可以不需要加引号, 另外, 哈希键所在的花括号也有自动引用能力, 也可以使用裸词(裸词: 字母, 数字 和下划线的序列, 可以用+-开头,但不能使用数字开头)

    %roger = ( #hash 也可以是词法变量,可以在前面加my操作符, 同时也是在列表上下文中
        name => "roger",
        sex  =>  "male",
        age  =>  21,
        20   =>  20,  # 最后一个逗号可选加入, 根据裸词的定义, 这个好像不是裸词? 不知为啥也可以!
    );
    print $roger{name}."
    ";
    print $roger{20}."
    ";

     3. 哈希函数

       keys()  和  values() 函数:  只要在中间没有对哈希进行增删改, 那么对应的键值顺序一致, 但是不一定是存进去的顺序.

        在列表上下文中, 返回了数组:

    %hash = (
        "a" => 1,
        "b" => 2,
        "c" => 3,
    );
    @keys = keys(%hash); 
    @values = values(%hash);
    print $keys[1]."
    ";
    print $values[1]."
    ";

         在标量上下文中, 返回了列表的大小:

    %roger=("a"=>1,"b"=>2,"c"=>3);
    $count = keys %roger; #因为是标量上下文哦
    print $count; # 3

        结合数组理解一下列表上下文和标量上下文

    @roger = (1..10); 
    print @roger;  #列表上下文,因为print的参数是一个列表,输出没有空格分隔元素的列表
    printf("
    ");
    print @roger."
    ";  #标量上下文, 因为相当于数组插值(后面有字符串连接着), 所以需要一个标量,输出数组大小
    print "@roger
    ";  #列表上下文,把数组的所有元素分别插值,输出空格分隔元素的列表

        each() 函数

    $roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=21; $roger{18}="young";
    # 每次对同一个哈希调用each, 就返回下一组键值对,类似迭代器
    while(($key,$value) = each %roger){
        print "$key => $value
    ";
    }

         exists()  delete() 函数

    $roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=21; $roger{18}="young";
    if(exists $roger{"name"}){
        print $roger{"name"}."
    ";
    }
    print $roger{"age"}."
    ";
    delete $roger{"age"};
    if(! exists $roger{age}){
        print "age not exists!
    "
    }

      哈希不支持整体内插, 但是支持单个元素内插到双引号中.

    4.  %ENV  获取环境哈希

      可以使用  print $ENV{PATH}; 打印系统路径变量;  只要在程序外设定了任何环境变量, 就可以用  print $ENV{CHARACTER}; #CHARACTER是环境变量名  获取.

  • 相关阅读:
    【Java】:Java当中为什么不能够直接用==比较String字符串
    Mybatis
    spring boot
    IDEA
    IDEA
    kafka集群partition分布原理分析(转发)
    kafka集群partition分布原理分析(转发)
    scons ------ 基本使用
    色彩管理中的Gamma值的理解
    SFUD ------ (Serial Flash Universal Driver) 串行 Flash 通用驱动库
  • 原文地址:https://www.cnblogs.com/roger9567/p/4532837.html
Copyright © 2011-2022 走看看