File | /wise/base/static/lib/perl5/site_perl/5.10.0/Inline/denter.pm | Statements Executed | 1604 | Total Time | 0.004648 seconds |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine | |
---|---|---|---|---|---|---|
44 | 4 | 1 | 0.00079 | 0.00079 | Inline::denter:: | _setup_line |
42 | 2 | 1 | 0.00064 | 0.00259 | Inline::denter:: | _undent_data |
35 | 1 | 1 | 0.00041 | 0.00121 | Inline::denter:: | _undent_value |
6 | 1 | 1 | 0.00037 | 0.00195 | Inline::denter:: | _undent_hash |
2 | 2 | 1 | 0.00032 | 0.00301 | Inline::denter:: | undent |
42 | 3 | 1 | 0.00028 | 0.00028 | Inline::denter:: | _next_line |
27 | 1 | 1 | 0.00018 | 0.00018 | Inline::denter:: | _get_key |
2 | 2 | 1 | 3.7e-5 | 3.7e-5 | Inline::denter:: | new |
1 | 1 | 1 | 1.1e-5 | 4.0e-5 | Inline::denter:: | _undent_undef |
0 | 0 | 0 | 0 | 0 | Inline::denter:: | BEGIN |
0 | 0 | 0 | 0 | 0 | Inline::denter:: | _undent_array |
0 | 0 | 0 | 0 | 0 | Inline::denter:: | _undent_scalar |
Line | Stmts. | Exclusive Time | Avg. | Code |
---|---|---|---|---|
1 | package Inline::denter; | |||
2 | ||||
3 | 3 | 3.3e-5 | 1.1e-5 | use strict; # spent 12µs making 1 call to strict::import |
4 | 3 | 3.1e-5 | 1.0e-5 | use Carp; # spent 68µs making 1 call to Exporter::import |
5 | 3 | 0.00022 | 7.4e-5 | use AutoLoader 'AUTOLOAD'; # spent 1.22ms making 1 call to AutoLoader::import |
6 | ||||
7 | # spent 37µs within Inline::denter::new which was called 2 times, avg 18µs/call:
# once (19µs+0) by Inline::check_config_file at line 700 of blib/lib/Inline.pm
# once (18µs+0) by Inline::check_module at line 857 of blib/lib/Inline.pm | |||
8 | 2 | 2.0e-6 | 1.0e-6 | my $class = shift; |
9 | 2 | 2.3e-5 | 1.2e-5 | bless {width => 4, |
10 | comma => " : ", | |||
11 | level => 0, | |||
12 | tabwidth => 8, | |||
13 | }, $class; | |||
14 | } | |||
15 | ||||
16 | # spent 3.01ms (323µs+2.69) within Inline::denter::undent which was called 2 times, avg 1.51ms/call:
# once (180µs+1.33ms) by Inline::check_module at line 857 of blib/lib/Inline.pm
# once (143µs+1.36ms) by Inline::check_config_file at line 700 of blib/lib/Inline.pm | |||
17 | 2 | 7.0e-6 | 3.5e-6 | local $/ = "\n"; |
18 | 2 | 6.0e-6 | 3.0e-6 | my ($o, $text) = @_; |
19 | 2 | 2.0e-6 | 1.0e-6 | my ($comma) = $o->{comma}; |
20 | 2 | 1.2e-5 | 6.0e-6 | my $package = caller; |
21 | 2 | 1.0e-6 | 5.0e-7 | $package = caller(1) if $package eq 'Inline::denter'; |
22 | 2 | 4.0e-6 | 2.0e-6 | %{$o->{xref}} = (); |
23 | 2 | 3.0e-6 | 1.5e-6 | @{$o->{objects}} = (); |
24 | 2 | 2.0e-6 | 1.0e-6 | @{$o->{context}} = (); |
25 | 2 | 1.0e-6 | 5.0e-7 | my $glob = ''; |
26 | 2 | 3.0e-6 | 1.5e-6 | chomp $text; |
27 | 2 | 5.1e-5 | 2.5e-5 | @{$o->{lines}} = split $/, $text; |
28 | 2 | 1.0e-6 | 5.0e-7 | $o->{level} = 0; |
29 | 2 | 3.0e-6 | 1.5e-6 | $o->{line} ||= 1; |
30 | 2 | 2.2e-5 | 1.1e-5 | $o->_setup_line; # spent 103µs making 2 calls to Inline::denter::_setup_line, avg 51µs/call |
31 | 2 | 2.0e-6 | 1.0e-6 | while (not $o->{done}) { |
32 | 15 | 8.1e-5 | 5.4e-6 | if ($o->{level} == 0 and |
33 | $o->{content} =~ /^(\w+)\s*$comma\s*(.*)$/) { | |||
34 | 15 | 2.0e-5 | 1.3e-6 | $o->{content} = $2; |
35 | 3 | 0.00134 | 0.00045 | no strict 'refs'; # spent 25µs making 1 call to strict::unimport |
36 | 15 | 2.8e-5 | 1.9e-6 | push @{$o->{objects}}, "$1"; |
37 | } | |||
38 | 15 | 9.9e-5 | 6.6e-6 | push @{$o->{objects}}, $o->_undent_data; # spent 2.58ms making 15 calls to Inline::denter::_undent_data, avg 172µs/call |
39 | } | |||
40 | 2 | 1.1e-5 | 5.5e-6 | return @{$o->{objects}}; |
41 | } | |||
42 | ||||
43 | sub _undent_data { | |||
44 | 42 | 3.0e-5 | 7.1e-7 | my $o = shift; |
45 | 42 | 3.4e-5 | 8.1e-7 | my ($obj, $class) = ('', ''); |
46 | 42 | 2.2e-5 | 5.2e-7 | my @refs; |
47 | 42 | 1.9e-5 | 4.5e-7 | my %refs; |
48 | 42 | 6.6e-5 | 1.6e-6 | while ($o->{content} =~ s/^\\(?:\((\w+)\))?((\%|\@|\$|\\).*)/$2/) { |
49 | push @refs, $1; | |||
50 | $refs{$1} = scalar @refs; | |||
51 | } | |||
52 | 42 | 9.9e-5 | 2.4e-6 | if ($o->{content} =~ /^([\%\@\$]) # spent 40µs making 1 call to Inline::denter::_undent_undef |
53 | (\w(?:\w|::)*)? | |||
54 | \s*$/x | |||
55 | ) { | |||
56 | 6 | 5.0e-6 | 8.3e-7 | my $foo; |
57 | 6 | 1.1e-5 | 1.8e-6 | $obj = ($1 eq '%') ? {} : ($1 eq '@') ? [] : \$foo; |
58 | 6 | 6.0e-6 | 1.0e-6 | $class = $2 || ''; |
59 | 6 | 6.7e-5 | 1.1e-5 | if ($1 eq '%') { # spent 1.95ms making 6 calls to Inline::denter::_undent_hash, avg 325µs/call |
60 | %$obj = $o->_undent_hash; | |||
61 | } | |||
62 | elsif ($1 eq '@') { | |||
63 | @$obj = $o->_undent_array; | |||
64 | } | |||
65 | else { | |||
66 | $$obj = $o->_undent_scalar; | |||
67 | } | |||
68 | 6 | 4.0e-6 | 6.7e-7 | bless $obj, $class if length $class; |
69 | } | |||
70 | elsif ($o->{content} =~ /^\?\s*$/) { | |||
71 | $obj = $o->_undent_undef; | |||
72 | } | |||
73 | else { | |||
74 | 35 | 0.00016 | 4.5e-6 | $obj = $o->_undent_value; # spent 1.21ms making 35 calls to Inline::denter::_undent_value, avg 35µs/call |
75 | } | |||
76 | 42 | 4.8e-5 | 1.1e-6 | while (@refs) { |
77 | my $ref = pop @refs; | |||
78 | my $copy = $obj; | |||
79 | $obj = \ $copy; | |||
80 | $o->{xref}{$ref} = $obj if $ref; | |||
81 | } | |||
82 | 42 | 7.7e-5 | 1.8e-6 | return $obj; |
83 | } | |||
84 | ||||
85 | # spent 1.21ms (411µs+797µs) within Inline::denter::_undent_value which was called 35 times, avg 35µs/call:
# 35 times (411µs+797µs) by Inline::denter::_undent_data at line 74, avg 35µs/call | |||
86 | 35 | 2.4e-5 | 6.9e-7 | my $o = shift; |
87 | 35 | 2.0e-5 | 5.7e-7 | my $value = ''; |
88 | 35 | 6.7e-5 | 1.9e-6 | if ($o->{content} =~ /^\<\<(\w+)(\-?)\s*$/) { |
89 | my ($marker, $chomp) = ($1, $2); | |||
90 | my $line = $o->{line}; | |||
91 | $o->_next_line; | |||
92 | while (not $o->{done} and | |||
93 | $o->{lines}[0] ne $marker) { | |||
94 | $value .= $o->{lines}[0] . "\n"; | |||
95 | $o->_next_line; | |||
96 | } | |||
97 | croak M03_no_value_end_marker($marker, $line) if $o->{done}; | |||
98 | chomp $value if $chomp; | |||
99 | } | |||
100 | elsif ($o->{content} =~ /^\"/) { | |||
101 | 1 | 3.0e-6 | 3.0e-6 | croak $o->M04_mismatched_quotes unless $o->{content} =~ /^\".*\"\s*$/; |
102 | 1 | 4.0e-6 | 4.0e-6 | ($value = $o->{content}) =~ s/^\"|\"\s*$//g; |
103 | } | |||
104 | else { | |||
105 | 34 | 2.4e-5 | 7.1e-7 | $value = $o->{content}; |
106 | } | |||
107 | 35 | 0.00014 | 4.1e-6 | $o->_next_line; # spent 233µs making 35 calls to Inline::denter::_next_line, avg 7µs/call |
108 | 35 | 0.00014 | 4.0e-6 | $o->_setup_line; # spent 564µs making 35 calls to Inline::denter::_setup_line, avg 16µs/call |
109 | 35 | 5.7e-5 | 1.6e-6 | return $value; |
110 | } | |||
111 | ||||
112 | # spent 1.95ms (375µs+1.58) within Inline::denter::_undent_hash which was called 6 times, avg 325µs/call:
# 6 times (375µs+1.58ms) by Inline::denter::_undent_data at line 59, avg 325µs/call | |||
113 | 6 | 5.0e-6 | 8.3e-7 | my @values; |
114 | 6 | 4.0e-6 | 6.7e-7 | my $o = shift; |
115 | 6 | 8.0e-6 | 1.3e-6 | my $level = $o->{level} + 1; |
116 | 6 | 2.6e-5 | 4.3e-6 | $o->_next_line; # spent 41µs making 6 calls to Inline::denter::_next_line, avg 7µs/call |
117 | 6 | 2.6e-5 | 4.3e-6 | $o->_setup_line; # spent 104µs making 6 calls to Inline::denter::_setup_line, avg 17µs/call |
118 | 6 | 9.0e-6 | 1.5e-6 | while ($o->{level} == $level) { |
119 | 27 | 9.4e-5 | 3.5e-6 | my ($key, $value) = split $o->{comma}, $o->{content}; |
120 | 27 | 1.4e-5 | 5.2e-7 | croak $o->M05_invalid_key_value unless (defined $key and defined $value); |
121 | 27 | 2.2e-5 | 8.1e-7 | $o->{content} = $value; |
122 | 27 | 0.00028 | 1.0e-5 | push @values, $o->_get_key($key), $o->_undent_data;; # spent 175µs making 27 calls to Inline::denter::_get_key, avg 6µs/call
# spent 1.26ms making 27 calls to Inline::denter::_undent_data, avg 0/call, max recursion depth 1 |
123 | } | |||
124 | 6 | 5.0e-6 | 8.3e-7 | croak $o->M06_invalid_indent_level if $o->{level} > $level; |
125 | 6 | 3.5e-5 | 5.8e-6 | return @values; |
126 | } | |||
127 | ||||
128 | # spent 175µs within Inline::denter::_get_key which was called 27 times, avg 6µs/call:
# 27 times (175µs+0) by Inline::denter::_undent_hash at line 122, avg 6µs/call | |||
129 | 27 | 3.9e-5 | 1.4e-6 | my ($o, $key) = @_; |
130 | 27 | 5.5e-5 | 2.0e-6 | return $key unless $key =~ /^\<\<(\w+)(\-?)/; |
131 | my ($marker, $chomp) = ($1, $2); | |||
132 | $key = ''; | |||
133 | my $line = $o->{line}; | |||
134 | $o->_next_line; | |||
135 | while (not $o->{done} and | |||
136 | $o->{lines}[0] ne $marker) { | |||
137 | $key .= $o->{lines}[0] . "\n"; | |||
138 | $o->_next_line; | |||
139 | } | |||
140 | croak M02_no_key_end_marker($marker, $line) if $o->{done}; | |||
141 | chomp $key if $chomp; | |||
142 | $o->_next_line; | |||
143 | $o->_setup_line; | |||
144 | return $key; | |||
145 | } | |||
146 | ||||
147 | sub _undent_array { | |||
148 | my @values; | |||
149 | my $o = shift; | |||
150 | my $level = $o->{level} + 1; | |||
151 | $o->_next_line; | |||
152 | $o->_setup_line; | |||
153 | while ($o->{level} == $level) { | |||
154 | push @values, $o->_undent_data; | |||
155 | } | |||
156 | croak $o->M06_invalid_indent_level if $o->{level} > $level; | |||
157 | return @values; | |||
158 | } | |||
159 | ||||
160 | sub _undent_scalar { | |||
161 | my $values; | |||
162 | my $o = shift; | |||
163 | my $level = $o->{level} + 1; | |||
164 | $o->_next_line; | |||
165 | $o->_setup_line; | |||
166 | croak $o->M06_invalid_indent_level if $o->{level} != $level; | |||
167 | croak $o->M07_invalid_scalar_value if $o->{content} =~ /^[\%\@\$\\]/; | |||
168 | return $o->_undent_undef if $o->{content} =~ /^\?/; | |||
169 | return $o->_undent_value; | |||
170 | } | |||
171 | ||||
172 | # spent 40µs (11+29) within Inline::denter::_undent_undef which was called
# once (11µs+29µs) by Inline::denter::_undent_data at line 52 | |||
173 | 1 | 0 | 0 | my $o = shift; |
174 | 1 | 6.0e-6 | 6.0e-6 | $o->_next_line; # spent 9µs making 1 call to Inline::denter::_next_line |
175 | 1 | 5.0e-6 | 5.0e-6 | $o->_setup_line; # spent 20µs making 1 call to Inline::denter::_setup_line |
176 | 1 | 2.0e-6 | 2.0e-6 | return undef; |
177 | } | |||
178 | ||||
179 | # spent 283µs within Inline::denter::_next_line which was called 42 times, avg 7µs/call:
# 35 times (233µs+0) by Inline::denter::_undent_value at line 107, avg 7µs/call
# 6 times (41µs+0) by Inline::denter::_undent_hash at line 116, avg 7µs/call
# once (9µs+0) by Inline::denter::_undent_undef at line 174 | |||
180 | 42 | 2.5e-5 | 6.0e-7 | my $o = shift; |
181 | 42 | 3.4e-5 | 8.1e-7 | $o->{done}++, $o->{level} = -1, return unless @{$o->{lines}}; |
182 | 42 | 4.5e-5 | 1.1e-6 | $_ = shift @{$o->{lines}}; |
183 | 42 | 7.1e-5 | 1.7e-6 | $o->{line}++; |
184 | } | |||
185 | ||||
186 | # spent 791µs within Inline::denter::_setup_line which was called 44 times, avg 18µs/call:
# 35 times (564µs+0) by Inline::denter::_undent_value at line 108, avg 16µs/call
# 6 times (104µs+0) by Inline::denter::_undent_hash at line 117, avg 17µs/call
# 2 times (103µs+0) by Inline::denter::undent at line 30, avg 51µs/call
# once (20µs+0) by Inline::denter::_undent_undef at line 175 | |||
187 | 44 | 2.8e-5 | 6.4e-7 | my $o = shift; |
188 | 44 | 3.8e-5 | 8.6e-7 | $o->{done}++, $o->{level} = -1, return unless @{$o->{lines}}; |
189 | 42 | 5.9e-5 | 1.4e-6 | my ($width, $tabwidth) = @{$o}{qw(width tabwidth)}; |
190 | 42 | 1.9e-5 | 4.5e-7 | while (1) { |
191 | 42 | 4.4e-5 | 1.0e-6 | $_ = $o->{lines}[0]; |
192 | # expand tabs in leading whitespace; | |||
193 | 42 | 7.8e-5 | 1.9e-6 | $o->next_line, next if /^(\s*$|\#)/; # skip comments and blank lines |
194 | 42 | 6.1e-5 | 1.5e-6 | while (s{^( *)(\t+)} |
195 | {' ' x (length($1) + length($2) * $tabwidth - | |||
196 | length($1) % $tabwidth)}e){} | |||
197 | 42 | 0.00015 | 3.5e-6 | croak $o->M01_invalid_indent_width unless /^(( {$width})*)(\S.*)$/; |
198 | 42 | 9.1e-5 | 2.2e-6 | $o->{level} = length($1) / $width; |
199 | 42 | 5.4e-5 | 1.3e-6 | $o->{content} = $3; |
200 | 42 | 7.3e-5 | 1.7e-6 | last; |
201 | } | |||
202 | } | |||
203 | ||||
204 | 1 | 3.0e-6 | 3.0e-6 | 1; |
205 | __END__ | |||
206 | ||||
207 | sub indent { | |||
208 | my $o = shift; | |||
209 | my $package = caller; | |||
210 | $package = caller(1) if $package eq 'Inline::denter'; | |||
211 | my $stream = ''; | |||
212 | $o->{key} = ''; | |||
213 | while (@_) { | |||
214 | $_ = shift; | |||
215 | $stream .= $o->indent_name($_, shift), next | |||
216 | if (/^\*$package\::\w+$/); | |||
217 | $stream .= $o->indent_data($_); | |||
218 | } | |||
219 | return $stream; | |||
220 | } | |||
221 | ||||
222 | sub indent_data { | |||
223 | my $o = shift; | |||
224 | $_ = shift; | |||
225 | return $o->indent_undef($_) | |||
226 | if not defined; | |||
227 | return $o->indent_value($_) | |||
228 | if (not ref); | |||
229 | return $o->indent_hash($_) | |||
230 | if (ref eq 'HASH' and not /=/ or /=HASH/); | |||
231 | return $o->indent_array($_) | |||
232 | if (ref eq 'ARRAY' and not /=/ or /=ARRAY/); | |||
233 | return $o->indent_scalar($_) | |||
234 | if (ref eq 'SCALAR' and not /=/ or /=SCALAR/); | |||
235 | return $o->indent_ref($_) | |||
236 | if (ref eq 'REF'); | |||
237 | return "$_\n"; | |||
238 | } | |||
239 | ||||
240 | sub indent_value { | |||
241 | my ($o, $data) = @_; | |||
242 | my $stream; | |||
243 | if ($data =~ /\n/) { | |||
244 | my $marker = 'EOV'; | |||
245 | $marker++ while $data =~ /^$marker$/m; | |||
246 | my $chomp = ($data =~ s/\n\Z//) ? '' : '-'; | |||
247 | $stream = "<<$marker$chomp\n"; | |||
248 | $stream .= $o->{key}, $o->{key} = '' if $o->{key}; | |||
249 | $stream .= "$data\n$marker\n"; | |||
250 | } | |||
251 | elsif ($data =~ /^[\s\%\@\$\\?\"]|\s$/ or | |||
252 | $data =~ /\Q$o->{comma}\E/ or | |||
253 | $data =~ /[\x00-\x1f]/ or | |||
254 | $data eq '') { | |||
255 | $stream = qq{"$data"\n}; | |||
256 | $stream .= $o->{key}, $o->{key} = '' if $o->{key}; | |||
257 | } | |||
258 | else { | |||
259 | $stream = "$data\n"; | |||
260 | $stream .= $o->{key}, $o->{key} = '' if $o->{key}; | |||
261 | } | |||
262 | return $stream; | |||
263 | } | |||
264 | ||||
265 | sub indent_hash { | |||
266 | my ($o, $data) = @_; | |||
267 | my $stream = $o->_print_ref($data, '%', 'HASH'); | |||
268 | return $$stream if ref $stream; | |||
269 | my $indent = ++$o->{level} * $o->{width}; | |||
270 | for my $key (sort keys %$data) { | |||
271 | my $key_out = $key; | |||
272 | if ($key =~ /\n/ or | |||
273 | $key =~ /\Q$o->{comma}\E/) { | |||
274 | my $marker = 'EOK'; | |||
275 | $marker++ while $key =~ /^$marker$/m; | |||
276 | my $chomp = (($o->{key} = $key) =~ s/\n\Z//m) ? '' : '-'; | |||
277 | $o->{key} .= "\n$marker\n"; | |||
278 | $key_out = "<<$marker$chomp"; | |||
279 | } | |||
280 | elsif ($data =~ /^[\s\%\@\$\\?\"]|\s$/) { | |||
281 | $key_out = qq{"$key"}; | |||
282 | } | |||
283 | $stream .= ' ' x $indent . $key_out . $o->{comma}; | |||
284 | $stream .= $o->indent_data($data->{$key}); | |||
285 | } | |||
286 | $o->{level}--; | |||
287 | return $stream; | |||
288 | } | |||
289 | ||||
290 | sub indent_array { | |||
291 | my ($o, $data) = @_; | |||
292 | my $stream = $o->_print_ref($data, '@', 'ARRAY'); | |||
293 | return $$stream if ref $stream; | |||
294 | my $indent = ++$o->{level} * $o->{width}; | |||
295 | for my $datum (@$data) { | |||
296 | $stream .= ' ' x $indent; | |||
297 | $stream .= $o->indent_data($datum); | |||
298 | } | |||
299 | $o->{level}--; | |||
300 | return $stream; | |||
301 | } | |||
302 | ||||
303 | sub indent_scalar { | |||
304 | my ($o, $data) = @_; | |||
305 | my $stream = $o->_print_ref($data, q{$}, 'SCALAR'); | |||
306 | return $$stream if ref $stream; | |||
307 | my $indent = ($o->{level} + 1) * $o->{width}; | |||
308 | $stream .= ' ' x $indent; | |||
309 | $stream .= $o->indent_data($$data); | |||
310 | return $stream; | |||
311 | } | |||
312 | ||||
313 | sub indent_ref { | |||
314 | my ($o, $data) = @_; | |||
315 | my $stream = $o->_print_ref($data, '\\', 'SCALAR'); | |||
316 | return $$stream if ref $stream; | |||
317 | chomp $stream; | |||
318 | return $stream . $o->indent_data($$data); | |||
319 | } | |||
320 | ||||
321 | sub indent_undef { | |||
322 | my ($o, $data) = @_; | |||
323 | my $stream = "?\n"; | |||
324 | $stream .= $o->{key}, $o->{key} = '' if $o->{key}; | |||
325 | return $stream; | |||
326 | } | |||
327 | ||||
328 | sub indent_name { | |||
329 | my ($o, $name, $value) = @_; | |||
330 | $name =~ s/^.*:://; | |||
331 | my $stream = $name . $o->{comma}; | |||
332 | $stream .= $o->indent_data($value); | |||
333 | return $stream; | |||
334 | } | |||
335 | ||||
336 | sub _print_ref { | |||
337 | my ($o, $data, $symbol, $type) = @_; | |||
338 | $data =~ /^(([\w:]+)=)?$type\(0x([0-9a-f]+)\)$/ | |||
339 | or croak "Invalid reference: $data\n"; | |||
340 | my $stream = $symbol; | |||
341 | $stream .= $2 if defined $2; | |||
342 | $o->{xref}{$3}++; | |||
343 | croak "Inline::denter does not handle duplicate references" | |||
344 | if $o->{xref}{$3} > 1; | |||
345 | $stream .= "\n"; | |||
346 | $stream .= $o->{key}, $o->{key} = '' if $o->{key}; | |||
347 | return $stream; | |||
348 | } | |||
349 | ||||
350 | # Undent error messages | |||
351 | sub M01_invalid_indent_width { | |||
352 | my $o = shift; | |||
353 | "Invalid indent width detected at line $o->{line}\n"; | |||
354 | } | |||
355 | ||||
356 | sub M02_no_key_end_marker { | |||
357 | my ($marker, $line) = @_; | |||
358 | "No terminating marker '$marker' found for key at line $line\n"; | |||
359 | } | |||
360 | ||||
361 | sub M03_no_value_end_marker { | |||
362 | my ($marker, $line) = @_; | |||
363 | "No terminating marker '$marker' found for value at line $line\n"; | |||
364 | } | |||
365 | ||||
366 | sub M04_mismatched_quotes { | |||
367 | my $o = shift; | |||
368 | "Mismatched double quotes for value at line $o->{line}\n"; | |||
369 | } | |||
370 | ||||
371 | sub M05_invalid_key_value { | |||
372 | my $o = shift; | |||
373 | "Missing or invalid hash key/value pair at $o->{line}\n"; | |||
374 | } | |||
375 | ||||
376 | sub M06_invalid_indent_level { | |||
377 | my $o = shift; | |||
378 | "Invalid indentation level at $o->{line}\n"; | |||
379 | } | |||
380 | ||||
381 | sub M07_invalid_scalar_value { | |||
382 | my $o = shift; | |||
383 | "Invalid value for scalar ref context at $o->{line}\n"; | |||
384 | } | |||
385 | ||||
386 | 1; | |||
387 | __END__ |