如何将事件数组的多个实例添加到我的哈希中?
构建一个抽象来添加一个事件。
sub add_event {
my($user,$name,$event) = @_;
push @{ $user->{$name}{events} }, $event;
}
在实践中,对它的调用类似于
add_event \%User, "MasterZ", { date => $^T, machine => "host1" };
如何循环遍历这些数组?
另一个抽象在这里也会有所帮助。
use Storable qw/ dclone /;
sub all_events {
my($user,$name) = @_;
my $clone = dclone $user->{$name}{events};
wantarray ? @$clone : $clone;
}
调用dclone
执行deep copy,这使得返回值可以安全地传递给外部人员,而不必担心他们会修改您的内部数据。
像这样使用它
foreach my $event (all_events $name) {
# do stuff with $event->{date} and $event->{machine}
}
完整示例
使用以下代码
#! /usr/bin/env perl
use strict;
use warnings;
use Storable qw/ dclone /;
sub add_event {
my($user,$name,$event) = @_;
push @{ $user->{$name}{events} }, $event;
}
sub all_events {
my($user,$name) = @_;
my $clone = dclone $user->{$name}{events};
wantarray ? @$clone : $clone;
}
my %User = ( MasterZ => { allowed => 52, denied => 4 } );
add_event \%User, "MasterZ", { date => $^T, machine => "host1" };
add_event \%User, "MasterZ", { date => $^T + 1, machine => "host2" };
for (all_events \%User, "MasterZ") {
my($date,$machine) = @{$_}{qw/ date machine /};
print "$date - $machine\n";
}
# show the internal layout of %User
use Data::Dumper;
$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper \%User;
输出将类似于
1371671154 - 主机1
1371671155 - 主机2
{
'MasterZ' => {
'允许' => 52,
'事件' => [
{
'日期' => '1371671154',
'机器' => '主机1'
},
{
'日期' => 1371671155,
'机器' => '主机2'
}
],
'拒绝' => 4
}
}