perl hash 常见用法

基本用法

# 初始化 %h为空数组
%h = {};
# 用数组初始化%h为 a=>1, b=>2
%h = ('a', 1, 'b', 2);
# 意义同上,只是另一种更形象化的写法。
%h = ('a'=>1, 'b'=>2);
#如果key是字符串,可以省略引号。下面这行和上面那行是一样的
%h = (a=>1, b=>2);
# 用{}来访问
print "$h{a}/n"; # 打印1
$h{b} = '2b';
print "$h{b}/n"; # 打印2b
# 删除key用delete
delete $h{b}; # 从$h删除'b'

清空hash

undef %h

得到hash的所有键值

# 得到所有keys,顺序取决于hash函数,或者说是乱序
@all_keys = keys %h;
# 所有键值,是按hash的值从大往小排列的。值的比较是数字比较(比如说,10>9)
@all_keys = sort{$h{$b}<=>$h{$a}} (keys %h);
# 所有键值,是按hash的值从小往大排列的。值的比较是数字比较
@all_keys = sort{$h{$a}<=>$h{$b}} (keys %h);
# 所有键值,是按hash的值从小往大排列的。值的比较是字符串比较
#(比如说,'10' < '9')
@all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);

判断hash是否包含key

exists($h{$key});

Hash的长度

想要知道一个hash存放多少数据

$hash_size = keys %h # 把%h的长度放到$hash_size中
print scalar kes %h, "/n" # 打印%h的长度。这里用了scalar来返回数组长度。

遍历一个hash

while (my ($k, $v) = each %h) {
print "$k ---> $v/n";
}

Reference引用

Reference类似于C/C++的指针

$h_ref = /%h; # 获得一个hash的reference
%aHash = %{$h_ref};# 把hash reference当成hash用
$value = $h_ref->{akey} # 这个和%h{akey}是一样的

传递hash到函数

一般都是传递一个reference到函数

%h = ();
$h{a}=1;
foo(/%h)
print $h{b}, "/n"; # 打印出2。这个值来自于函数foo()
 
sub foo {
my ($h) = @_;
print $h->{a}, "/n"; # 打印出1
$h->{b} = 2;
}

函数返回hash,或者hash引用(hash reference)

函数可以返回hash

sub foo {
my %fh;
$fh{a} = 1;
return %h;
}
 
my %h = foo();
print "$h{a}/n"; #打印出 1

但是这样等于把整个hash从%fh复制到了%h,效率比较低。可以考虑返回hash的引用:

sub foo {
my %fh;
$fh{a} = 1;
return /%fh;
}
 
my $hr = foo();
print "$hr->{a}/n"; #打印出 1
my %h = %{foo()} # 如果就是想复制,也可以用这种方法

不用担心在sub foo里的%fh是局部变量,perl会自动管理内存。它会发现%fh被$hr引用,就不会清理%fh的内存,并且$hr失效后释放内存
Perl语言中的递归处理通常用于遍历复杂的数据结构,比如哈希hash)。由于Perl哈希数据结构可以包含其他哈希或数组,因此递归函数可以有效地处理这些嵌套的数据结构。递归处理hash通常涉及到定义一个函数,该函数能够检查hash中的每个元素,如果元素本身是一个hash或数组,则函数会递归调用自身来处理这些嵌套的数据结构。 下面是一个简单的Perl递归处理hash的示例: ```perl #!/usr/bin/perl use strict; use warnings; # 假设我们有如下嵌套hash结构 my %nested_hash = ( key1 => 'value1', key2 => { nested1 => 'nested_value1', nested2 => { deeply => 'deeply_nested_value' } }, key3 => [qw(array1 array2 array3)], ); # 递归函数,用于打印hash中所有键值对 sub print_hash { my ($hash_ref) = @_; for my $key (keys %$hash_ref) { if (ref($hash_ref->{$key}) eq 'HASH') { # 如果值是hash引用,则递归调用 print_hash($hash_ref->{$key}); } elsif (ref($hash_ref->{$key}) eq 'ARRAY') { # 如果值是数组引用,则遍历并递归处理 for my $item (@{$hash_ref->{$key}}) { if (ref($item) eq 'HASH') { print_hash($item); } } } else { # 打印非引用的键值对 print "$key => $hash_ref->{$key}\n"; } } } # 调用递归函数处理嵌套hash print_hash(\%nested_hash); ``` 上述代码定义了一个名为`print_hash`的递归函数,它会检查hash引用中的每个值。如果值是另一个hash引用或数组引用,它将递归调用自身来处理这些值。如果值不是引用,它将直接打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值