10 |
|
# Interface |
11 |
|
# --------- |
12 |
|
# new(data,@key) : A new DataItem object with the data matched to a keylist |
13 |
< |
# keys() : return a list of the keys for the data object |
13 |
> |
# (See also restore) |
14 |
> |
# keys() : return a list of the fundamental keys for the data object |
15 |
|
# data() : return the data for the object |
16 |
|
# match(@keys) : return 1 if @keys matches those of the data item, else 0 |
17 |
+ |
# alias(@keys) : provide an alternative set of keys for matching |
18 |
+ |
# unalias(@keys) : remove any aliases - original keys cannot be removed |
19 |
+ |
# returns 1 if successful, 0 otherwise |
20 |
+ |
# store(fh) : store to the given stream |
21 |
+ |
# restore(fh) : Returns a new dataitem, initialised to the data found in |
22 |
+ |
# fh |
23 |
|
|
24 |
|
package Utilities::DataItem; |
25 |
|
require 5.001; |
32 |
|
$self={}; |
33 |
|
bless $self, $class; |
34 |
|
$self->{data}=$data; |
35 |
< |
@{$self->{keys}}=@keys; |
35 |
> |
push @{$self->{keys}[0]},@keys; # fundamental keys |
36 |
|
return $self; |
37 |
|
} |
38 |
|
|
39 |
|
sub keys { |
40 |
|
my $self=shift; |
41 |
< |
return @{$self->{keys}}; |
41 |
> |
return @{$self->{keys}[0]}; |
42 |
|
} |
43 |
|
|
44 |
|
sub data { |
50 |
|
my $self=shift; |
51 |
|
my @keys=@_; |
52 |
|
|
53 |
< |
my $nm=0; |
53 |
> |
my $nm; |
54 |
|
|
55 |
< |
for ( $i=0; (($i <= $#keys) && ($i <=$#{$self->{keys}})); $i++ ) { |
56 |
< |
if ( $self->{keys}[$i] eq $keys[$i] ) { |
55 |
> |
# search over all key aliases |
56 |
> |
foreach $keyset ( @{$self->{keys}} ) { |
57 |
> |
$nm=0; |
58 |
> |
for ( $i=0; (($i <= $#keys) && ($i <=$#{$keyset} )); $i++ ) { |
59 |
> |
if ( $$keyset[$i] eq $keys[$i] ) { |
60 |
|
$nm++; |
61 |
< |
} |
61 |
> |
} |
62 |
> |
} |
63 |
> |
return 1 , if ( $nm > $#keys ); # Succesful match |
64 |
|
} |
53 |
– |
return 1 , if ( $nm > $#keys ); # Succesful match |
65 |
|
return 0; |
66 |
|
} |
67 |
+ |
|
68 |
+ |
sub alias { |
69 |
+ |
my $self=shift; |
70 |
+ |
my @keys=@_; |
71 |
+ |
|
72 |
+ |
if ( $#keys<0 ) { |
73 |
+ |
die "Unable to set an alias with no keys\n"; |
74 |
+ |
} |
75 |
+ |
push @{$self->{keys}},[@keys]; |
76 |
+ |
} |
77 |
+ |
|
78 |
+ |
sub unalias { |
79 |
+ |
my $self=shift; |
80 |
+ |
my @keys=@_; |
81 |
+ |
|
82 |
+ |
my $rv=0; |
83 |
+ |
for ( my $i=1; $i<=$#{$self->{keys}}; $i++ ) { |
84 |
+ |
if ( "@{$self->{keys}[$i]}" eq "@keys" ) { |
85 |
+ |
undef $self->{keys}[$i]; |
86 |
+ |
splice( @{$self->{keys}}, $i, 1); |
87 |
+ |
$rv=1; |
88 |
+ |
} |
89 |
+ |
} |
90 |
+ |
return $rv; |
91 |
+ |
} |
92 |
+ |
|
93 |
+ |
sub store { |
94 |
+ |
my $self=shift; |
95 |
+ |
my $fh=shift; |
96 |
+ |
|
97 |
+ |
# print the keys first, aliases, then the data |
98 |
+ |
foreach $keyset ( @{$self->{keys}} ) { |
99 |
+ |
foreach $key ( @{$keyset} ) { |
100 |
+ |
print $fh "#".$key."\n"; |
101 |
+ |
} |
102 |
+ |
print $fh "#\n"; # alias marker |
103 |
+ |
} |
104 |
+ |
print $fh ">".$self->data()."\n"; |
105 |
+ |
} |
106 |
+ |
|
107 |
+ |
sub restore { |
108 |
+ |
my $class=shift; |
109 |
+ |
my $fh=shift; |
110 |
+ |
|
111 |
+ |
$self={}; |
112 |
+ |
bless $self, $class; |
113 |
+ |
|
114 |
+ |
my @arr=(); |
115 |
+ |
while ( <$fh> ) { |
116 |
+ |
chomp; |
117 |
+ |
if ( $_ eq "#") { # set aliases |
118 |
+ |
$self->alias(@arr); |
119 |
+ |
@arr=(); |
120 |
+ |
} |
121 |
+ |
elsif ( $_=~/^#(.*)/ ) { |
122 |
+ |
push @arr, $1; |
123 |
+ |
} |
124 |
+ |
elsif ( $_=~/^>(.*)/ ) { # load in data |
125 |
+ |
$data=$1; |
126 |
+ |
$self->{data}=$data; |
127 |
+ |
last; |
128 |
+ |
} |
129 |
+ |
else { |
130 |
+ |
print "Data corruption detected\n"; |
131 |
+ |
last; |
132 |
+ |
} |
133 |
+ |
} |
134 |
+ |
return $self; |
135 |
+ |
} |