1.Perl中的哈希
高效快捷, 没有大小限制. 大哈希一样很快!
命名: 和Perl其他标识符一样, 同时拥有自己的的名字空间. $roger{"sex"} 和 $roger没有关系
赋值: 对已存在的哈希赋值会覆盖原有值. 哈希元素会因赋值而产生(赋值就是"插入"哈希表中), 访问不存在值就会得到undef
$roger{'name'}="roger";
if($roger{'sex'} == undef){
print "undef\n";
}
2.建立hash (对整个hash的引用使用%,对哈希变量的引用使用$)
# 下面3种方法等效
$roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=;
%roger = ("name","roger","sex","male","age","21"); #在(数组)列表上下文中自动转换为键值对保存在roger表中
%roger = ( #hash 也可以是词法变量,可以在前面加my操作符, 同时也是在列表上下文中
"name" => "roger",
"sex" => "male",
"age" =>
);
print $roger{"name"};
哈希还可以通过已有哈希来建立
$roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=; $roger{}="young";
print $roger{}."\n"; #键还可以是数值, 实际上在Perl中并不区分,因为只有3种基本数据类型(标量,数组和哈希),所以键值为标量即可
%Roger = %roger;
print $Roger{"sex"}."\n"; #male
# 键值对反转
%loger = reverse %roger;
print $loger{}."\n"; #通过原来的值来访问键,但是要保证原理的值唯一, 否则会有覆盖发生,得不到预期结果
同样, %roger{'name'}也能得到正确结果, 但是$roger{'name'}是更好的访问方式.
胖箭头左边的任何裸词都能自动引用,可以不需要加引号, 另外, 哈希键所在的花括号也有自动引用能力, 也可以使用裸词(裸词: 字母, 数字 和下划线的序列, 可以用+-开头,但不能使用数字开头)
%roger = ( #hash 也可以是词法变量,可以在前面加my操作符, 同时也是在列表上下文中
name => "roger",
sex => "male",
age => ,
=> , # 最后一个逗号可选加入, 根据裸词的定义, 这个好像不是裸词? 不知为啥也可以!
);
print $roger{name}."\n";
print $roger{}."\n";
3. 哈希函数
keys() 和 values() 函数: 只要在中间没有对哈希进行增删改, 那么对应的键值顺序一致, 但是不一定是存进去的顺序.
在列表上下文中, 返回了数组:
%hash = (
"a" => ,
"b" => ,
"c" => ,
);
@keys = keys(%hash);
@values = values(%hash);
print $keys[]."\n";
print $values[]."\n";
在标量上下文中, 返回了列表的大小:
%roger=("a"=>,"b"=>,"c"=>);
$count = keys %roger; #因为是标量上下文哦
print $count; #
结合数组理解一下列表上下文和标量上下文
@roger = (..);
print @roger; #列表上下文,因为print的参数是一个列表,输出没有空格分隔元素的列表
printf("\n");
print @roger."\n"; #标量上下文, 因为相当于数组插值(后面有字符串连接着), 所以需要一个标量,输出数组大小
print "@roger\n"; #列表上下文,把数组的所有元素分别插值,输出空格分隔元素的列表
each() 函数
$roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=; $roger{}="young";
# 每次对同一个哈希调用each, 就返回下一组键值对,类似迭代器
while(($key,$value) = each %roger){
print "$key => $value\n";
}
exists() delete() 函数
$roger{'name'} = 'roger'; $roger{'sex'}='male'; $roger{'age'}=; $roger{}="young";
if(exists $roger{"name"}){
print $roger{"name"}."\n";
}
print $roger{"age"}."\n";
delete $roger{"age"};
if(! exists $roger{age}){
print "age not exists!\n"
}
哈希不支持整体内插, 但是支持单个元素内插到双引号中.
4. %ENV 获取环境哈希
可以使用 print $ENV{PATH}; 打印系统路径变量; 只要在程序外设定了任何环境变量, 就可以用 print $ENV{CHARACTER}; #CHARACTER是环境变量名 获取.