File Coverage

blib/lib/Prolog/Utility/FromPerl.pm
Criterion Covered Total %
statement 67 90 74.4
branch 24 46 52.1
condition 3 12 25.0
subroutine 12 13 92.3
pod 5 8 62.5
total 111 169 65.6


line stmt bran cond sub pod time code
1             package Prolog::Utility::FromPerl;
2              
3 5     5   173182 use warnings;
  5         12  
  5         168  
4 5     5   25 use strict;
  5         15  
  5         184  
5              
6 5     5   4735 use version;
  5         15512  
  5         32  
7              
8             our $VERSION = qv('1.0.2');
9              
10 5     5   5849 use Regexp::Common qw(balanced);
  5         36376  
  5         30  
11              
12 5     5   12944 use base qw(Exporter);
  5         9  
  5         7379  
13              
14             our @EXPORT = qw(printable_prolog chain_terms prolog_term prolog_hash prolog_list);
15              
16              
17             sub printable_prolog {
18            
19 1     1 1 1 my $prolog = shift;
20              
21 1 50       4 return $prolog if !defined($prolog);
22              
23 1 50       5 if(ref($prolog) eq 'SCALAR') {
    50          
24              
25 0 0       0 ${$prolog} .= '.' if ${$prolog} !~ /\.$/;
  0         0  
  0         0  
26            
27             } elsif(ref(\$prolog) eq 'SCALAR') {
28 1 50       4 $prolog .= '.' if $prolog !~ /\.$/;
29             }
30              
31 1         3 return $prolog;
32              
33             }
34              
35             sub chain_terms {
36            
37 1     1 1 2 my @terms = ();
38              
39 1 50 33     4 if(scalar(@_) == 1 && ref($_[0]) eq 'ARRAY') {
40              
41 0         0 @terms = @{$_[0]};
  0         0  
42              
43             } else {
44            
45 1         3 @terms = @_;
46              
47             }
48              
49 1         2 return printable_prolog( join(',',map { s/\.$//g; $_; } grep { defined($_) } @terms ) );
  3         4  
  3         8  
  3         6  
50              
51             }
52              
53             sub prolog_term {
54              
55 15     15 1 245550 my @nested = caller(1);
56              
57 15         62 my $term = shift;
58              
59 15         29 my $prolog = $term . '(';
60              
61 15         27 foreach my $value (@_) {
62              
63 15 100       37 if(ref($value)) {
64              
65 7         19 $prolog .= convert_ref_to_prolog($value);
66              
67             } else {
68              
69 8 50       26 if(ref(\$value) ne 'SCALAR') {
70              
71 0         0 $prolog .= convert_ref_to_prolog(\$value);
72              
73             } else {
74              
75 8         21 $prolog .= quote_prolog_value($value) . ',';
76              
77             }
78              
79             }
80              
81             }
82              
83 15 50       39 if( scalar(@nested) > 0 ) {
84              
85 15         40 $prolog =~ s/,$//g;
86              
87 15         85 return $prolog . ')';
88              
89             } else {
90              
91 0         0 return add_prolog_term_end($prolog);
92              
93             }
94              
95             }
96              
97              
98             sub add_prolog_term_end {
99              
100 0     0 0 0 my $partial_prolog_string = shift;
101              
102 0         0 $partial_prolog_string =~ s/,$//g;
103              
104 0         0 my $PATTERN = $RE{balanced};
105              
106 0         0 my @parts = ($partial_prolog_string =~ /$PATTERN/g);
107              
108 0 0 0     0 if( scalar(@parts) > 1 ) {
    0          
109              
110 0         0 $partial_prolog_string .= ')';
111              
112             } elsif(scalar(@parts) == 1 && length($partial_prolog_string) < length($parts[1])) {
113              
114 0         0 $partial_prolog_string .= ')';
115              
116             } else {
117              
118 0 0 0     0 if($partial_prolog_string =~ /\(/ && $partial_prolog_string !~ /\)/) {
119              
120 0         0 $partial_prolog_string =~ s/,$//g;
121              
122 0         0 $partial_prolog_string .= ')';
123              
124             }
125              
126             }
127              
128 0         0 return $partial_prolog_string;
129              
130             }
131              
132             sub convert_ref_to_prolog {
133              
134 7     7 0 11 my $ref = shift;
135              
136 7 100       24 if(ref($ref) eq 'ARRAY') {
    50          
    0          
137              
138 3         8 return prolog_list($ref);
139              
140             } elsif(ref($ref) eq 'HASH') {
141              
142 4         14 return prolog_hash($ref);
143              
144             } elsif(ref($ref) eq 'SCALAR') {
145              
146 0         0 return quote_prolog_value(${$ref});
  0         0  
147              
148             } else {
149              
150 0         0 die(ref($ref) . ' unsuppored reference' . "\n");
151              
152             }
153              
154             }
155              
156             sub prolog_list {
157              
158 4     4 1 107635 my @list = ();
159              
160 4 100       14 if(ref($_[0])) {
161              
162 3         5 @list = @{$_[0]};
  3         9  
163              
164             } else {
165              
166 1         3 @list = @_;
167              
168             }
169              
170 4 50       9 return '[' . join(',',map { if(defined($_)) { quote_prolog_value($_); } else { "'nil'"; } } @list) . ']';
  10         20  
  10         20  
  0         0  
171              
172             }
173              
174             sub prolog_hash {
175              
176 5     5 1 152524 my %hash;
177              
178 5 50       16 if(ref($_[0])) {
179              
180 5         7 %hash = %{$_[0]};
  5         21  
181              
182             } else {
183              
184 0         0 %hash = @_;
185              
186             }
187              
188 5         13 my $sort = delete $hash{_SORT};
189              
190 5 100 66     27 if(defined($sort) && ref($sort) eq 'ARRAY') {
191              
192 1         3 return join(',',map { prolog_term($_,$hash{$_}); } grep { exists($hash{$_}) } @$sort);
  3         8  
  3         8  
193              
194             } else {
195              
196 4         14 return join(',',map { prolog_term($_,$hash{$_}); } sort keys %hash);
  7         24  
197              
198             }
199              
200             }
201              
202             sub quote_prolog_value {
203            
204 18     18 0 27 my $value = shift;
205              
206 18 50       53 return $value if $value =~ /\(/;
207              
208 18 100       80 return $value if $value =~ /^[a-z]+[a-z0-9]+$/;
209              
210 17 100       139 return $value if $value =~ /^\d+(\.\d+)?$/;
211              
212 2 50       7 return $value if $value eq '[]';
213              
214 2         13 return "'" . $value . "'";
215              
216             }
217              
218              
219             1; # Magic true value required at end of module
220             __END__