曲径通幽论坛

标题: 哈希及相关函数 [打印本页]

作者: beyes    时间: 2011-9-26 11:10
标题: 哈希及相关函数
1. 基本的哈希赋值格式
$domain{"groad"} = "good";
$domain 是个哈希表,"groad" 是个键,"good" 是该键所对应的值。

2. 整个哈希
使用 % 作为哈希表的前缀表示指代整个哈希。如下例:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

my %hash = ("groad", 100, "sina", 90, "sohu", 80);

my @key = keys %hash;

my @val = values %hash;

foreach (@key) {
        print "$_\t";
}
print "\n";

foreach (@val) {
        print "$_\t"
}
print "\n";


运行输出:
./keys_values.pl
sina    sohu    groad
90      80      100
3. 哈希松绑
将整个哈希复制给一个数组称为哈希松绑,松绑时哈希自动转换为一些简单的 键/值 对。如下所示:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

my %hash = ("groad", 100, "sina", 90, "sohu", 80);

@array = %hash;

foreach (@array) {
        print "$_ "
}
print "\n";


运行输出:
# ./release_has.pl
sina 90 sohu 80 groad 100
4. 一种美观的给哈希赋值的方法:
像上面的 my %hash = ("groad", 100, "sina", 90, "sohu", 80); 这种赋值方法并不易区分键值对。下面使用带有胖箭头( => ) 的赋值方法使赋值形式更加的整齐美观:
[Perl] 纯文本查看 复制代码
my %hash = (
          "groad" => 100,
           "sina" => 90,
            "sohu" => 80
);



5. keys 和 values 函数:
keys 函数能返回哈希的键列表。
values 函数能返回值列表。
如果哈希表里没有任何成员,那么这两个函数都返回空列表。

测试代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

my %hash = ("groad" => 100, "sina" => 90, "sohu" => 80);

my @key = keys %hash;

my @val = values %hash;

foreach (@key) {
        print "$_\t";
}
print "\n";

foreach (@val) {
        print "$_\t"
}
print "\n";


运行输出:
# ./keys_values.pl
sina    sohu    groad
90      80      100
6. each 函数
使用 each 函数可以列出哈希的每个 键/值对 。常见的用法是每次获取一个键值对,比如:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

my %hash = ("groad" => 100, "sina" => 90, "sohu" => 80);

while ( ($key, $value) = each %hash ) {
        print "$key => $value\n";
}


运行输出:
# ./each.pl
sina => 90
sohu => 80
groad => 100
注意,each 返回的 键/值对 是乱序的,但键和值总是会相对应的。

7. exists 和 delete 函数:
exists 函数可以检查哈希中是否有某个键值,在的话返回真,否则返回假。
delete 函数可以从哈希中删除指定的键及其对应的值。假如没有这样的键,那么会直接结束,而不会发出任何警告和错误信息。

测试代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

my %hash = ("groad" => 100, "sina" => 90, "sohu" => 80);

if (exists $hash{"groad"}) {
        print "Gorad is exist.\n";
}

if (exists $hash{"163"}) {
        print "Netease is exist.\n";
}
else {
        print "Net ease is not exist.\n";
}

delete $hash{"groad"};

if (exists $hash{"groad"}){
        print "groad is exist.\n";
}
else {
        print "groad is not exist.\n";
}


运行输出:
# ./exist_del.pl
Gorad is exist.
Net ease is not exist.
groad is not exist.
8. %ENV 哈希:
系统的环境变量在 Perl 中可以被感知,它们被存储在一个内置的哈希里 %ENV 。如下所示:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

print "HOME is $ENV{HOME}\n";

print "PATH is $ENV{PATH}\n";


运行输出:
# ./env.pl
HOME is /root
PATH is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/etc/alternatives/gem-bin





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2