Perl语言入门笔记 第六章 哈希(hash)

=pod

哈希

    哈希表里只是一堆的键值对而已,而没有任何顺序,键可以是任意字符串,值也是
    awk的哈希键值对增多的时候会逐渐变慢,而perl没有这个缺点

 访问哈希元素:
    $hash{$some_key}

    foreach my $person (qw< barney fred >)
    {
        print "I'v heared of $person $family_name{$person}.\n";
    }
    在挑选哈希名的时候,最好使得哈希名和键之间能放进去一个"for"字,比如"family_name for fred"是filntstone,
    因此把哈希命名为family_name能清晰地反映出键和值之间的关系。
    $foo = 'bar';
    print $family_name{$foo . 'ney'}; #打印"rubble",连接在一块


    哈希可以被转换成列表

    哈希赋值:
        不是常见用法,但哈希真的可以用一般的赋值语法来赋值;
            my %new_hash = %old_hash;
            得到一个反序的哈希:键值互换
            my %inverse_hash = reverse %any_hash;

 胖箭头:
    my $last_name = (
        'fred' => 'flintstone',
        'dino' => 'undef',
    );

哈希函数:
    perl中有很多有用的函数可以一次处理整个哈希。
    keys函数能返回哈希的键列表,而values函数能返回对应的值列表。如果哈希没有任何的成员,则两个函数都返回空列表

    my @k = keys %hash;
    my @v = values %hash;
    上面的keys和values是一一对应的
    得到哈希中元素的个数:
        my $count = keys %hash;
        my $count = values %hash;
        if(%hash)
        {   }

    each函数:
        唯一适合使用each的地方
        while(my($key, $value) = each %hash)
        {   }

    foreach函数:
        foreach $key (sort keys %hash)
        {   }

    判断某项哈希元素的真假:
        if($book{$some})
        {   }

    exists函数:
        检查哈希中是否存在某个键,可以使用exists函数
        if(exists $book{"dino"})
        {   }

    delete函数:
        my $person = "betty";
        delete $book{$person}; #撤销$person的借书证
        上面"将undef存入哈希元素"并不相同,在这两种情况下,exists($books{"betty"})会得出相反的结果。在delete之后,键便不会出现在哈希之中,但存入undef后,键却是一定会存在的。

 哈希元素的内插:
    可以将单一哈希元素内插到双引号引起的字符串中。
    foreach $person (sort keys %books)
    {
        if($book{$person})
        {
            print "$person has $books{$person} items\n";
            #但这种方式不支持内插整个hash表
        }
    }

%ENV哈希:
    print “PATH is $ENV{PATH}\n”;

=cut

posted @ 2015-09-21 01:33  笑面浮屠  阅读(282)  评论(0编辑  收藏  举报