| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Acme::constant; |
|
2
|
|
|
|
|
|
|
{ |
|
3
|
|
|
|
|
|
|
$Acme::constant::VERSION = '0.1.3'; |
|
4
|
|
|
|
|
|
|
} |
|
5
|
1
|
|
|
1
|
|
30473
|
use 5.014; |
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
49
|
|
|
6
|
1
|
|
|
1
|
|
13
|
use strictures 1; |
|
|
1
|
|
|
|
|
8
|
|
|
|
1
|
|
|
|
|
26
|
|
|
7
|
1
|
|
|
1
|
|
77
|
use Carp (); |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
160
|
|
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
sub generate_constant { |
|
10
|
6
|
|
|
6
|
0
|
16
|
my ($package, $name, @values) = @_; |
|
11
|
|
|
|
|
|
|
# Prototype is used to make it work like a constant (constants |
|
12
|
|
|
|
|
|
|
# shouldn't take arguments). While anonymous subroutines don't use |
|
13
|
|
|
|
|
|
|
# prototypes, the prototype gets meaning when this subroutine is |
|
14
|
|
|
|
|
|
|
# assigned to type glob. |
|
15
|
|
|
|
|
|
|
my $constant = sub () : lvalue { |
|
16
|
|
|
|
|
|
|
# When constant used as array, it's very simple to understand |
|
17
|
|
|
|
|
|
|
# user wants an array. The !defined wantarray check is intended |
|
18
|
|
|
|
|
|
|
# to detect use of wantarray() in void context. |
|
19
|
26
|
100
|
66
|
26
|
|
229
|
if (wantarray || !defined wantarray) { |
|
|
|
50
|
|
|
|
|
|
|
20
|
14
|
|
|
|
|
880
|
@values; |
|
21
|
|
|
|
|
|
|
} |
|
22
|
|
|
|
|
|
|
# When constant has one element, writing to it in scalar |
|
23
|
|
|
|
|
|
|
# context is fine. |
|
24
|
|
|
|
|
|
|
elsif (@values == 1) { |
|
25
|
12
|
|
|
|
|
56
|
$values[0]; |
|
26
|
|
|
|
|
|
|
} |
|
27
|
|
|
|
|
|
|
# This shows an error, as otherwise, this could cause a strange |
|
28
|
|
|
|
|
|
|
# situation where scalar A shows (A)[0], when A has one |
|
29
|
|
|
|
|
|
|
# element, and 2 when A has two elements. The behavior of Array |
|
30
|
|
|
|
|
|
|
# constructor in ECMAScript is already confusing enough (new |
|
31
|
|
|
|
|
|
|
# Array(3) is [,,,], but new Array(3, 3) is [3, 3]). |
|
32
|
|
|
|
|
|
|
else { |
|
33
|
0
|
|
|
|
|
0
|
Carp::croak "Can't call ${package}::$name in scalar context"; |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
# Return lvalue in order to make older versions of Perl |
|
36
|
|
|
|
|
|
|
# happy, even when it's not going to be used. |
|
37
|
0
|
|
|
|
|
0
|
@values; |
|
38
|
|
|
|
|
|
|
} |
|
39
|
6
|
|
|
|
|
30
|
}; |
|
40
|
|
|
|
|
|
|
# Make a block, to make a scope for strict "refs". |
|
41
|
|
|
|
|
|
|
{ |
|
42
|
|
|
|
|
|
|
# Because of symbol table modifications, I have to allow |
|
43
|
|
|
|
|
|
|
# symbolic references. |
|
44
|
1
|
|
|
1
|
|
7
|
no strict qw(refs); |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
225
|
|
|
|
6
|
|
|
|
|
9
|
|
|
45
|
6
|
|
|
|
|
7
|
*{"${package}::$name"} = $constant; |
|
|
6
|
|
|
|
|
74
|
|
|
46
|
|
|
|
|
|
|
} |
|
47
|
|
|
|
|
|
|
} |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
sub import { |
|
50
|
6
|
|
|
6
|
|
10944
|
my $package = caller; |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
# The first argument is this package name |
|
53
|
6
|
|
|
|
|
9
|
my $name = shift; |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
# Without arguments, simply fail. |
|
56
|
6
|
50
|
|
|
|
25
|
if (@_ == 0) { |
|
|
|
50
|
|
|
|
|
|
|
57
|
0
|
|
|
|
|
0
|
Carp::carp qq[Useless use of "$name" pragma]; |
|
58
|
|
|
|
|
|
|
} |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
# When called with one argument, this argument would be hash |
|
61
|
|
|
|
|
|
|
# reference. |
|
62
|
|
|
|
|
|
|
elsif (@_ == 1) { |
|
63
|
0
|
|
|
|
|
0
|
my %hash = %{shift()}; |
|
|
0
|
|
|
|
|
0
|
|
|
64
|
|
|
|
|
|
|
# each is safe here, as %hash is lexical variable. |
|
65
|
0
|
|
|
|
|
0
|
while (my ($name, $value) = each %hash) { |
|
66
|
0
|
|
|
|
|
0
|
generate_constant $package, $name, $value; |
|
67
|
|
|
|
|
|
|
} |
|
68
|
|
|
|
|
|
|
} |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
# Otherwise, assume one constant, that possibly could return a list |
|
71
|
|
|
|
|
|
|
# of values. |
|
72
|
|
|
|
|
|
|
else { |
|
73
|
6
|
|
|
|
|
9
|
my $name = shift; |
|
74
|
6
|
|
|
|
|
16
|
generate_constant $package, $name, @_; |
|
75
|
|
|
|
|
|
|
} |
|
76
|
6
|
|
|
|
|
53
|
return; |
|
77
|
|
|
|
|
|
|
} |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
# Return positive value to make Perl happy. |
|
80
|
|
|
|
|
|
|
'Acme!'; |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
__END__ |