File Coverage

blib/lib/ZHOUYI/ZhanPu.pm
Criterion Covered Total %
statement 9 130 6.9
branch 0 54 0.0
condition 0 9 0.0
subroutine 3 14 21.4
pod 0 11 0.0
total 12 218 5.5


line stmt bran cond sub pod time code
1             package ZHOUYI::ZhanPu;
2              
3 1     1   15863 use strict;
  1         2  
  1         31  
4 1     1   4 use warnings;
  1         1  
  1         28  
5 1     1   824 use ZHOUYI;
  1         3398  
  1         1395  
6              
7             our @ISA = qw(Exporter);
8             our @EXPORT = qw(pu qigua jiegua );
9              
10             =head1 NAME
11              
12             ZHOUYI::ZhanPu - A util of ZHOUYI modules,divination to judge for the future using YI's Gua(卦) or tuan(彖)info (周易占卜)!
13              
14             =head1 VERSION
15              
16             Version 0.07
17              
18             =cut
19              
20             our $VERSION = '0.07';
21              
22             =head1 SYNOPSIS
23              
24              
25             use ZHOUYI::ZhanPu;
26              
27             my ( $gnum, $bgnum, $byao, $bgua ) = qigua();
28             print jiegua( $gnum, $bgnum, $byao, $bgua )
29             ...
30              
31             the outer like :
32              
33             《易經》第九卦小畜風天小畜巽上乾下
34              
35             小畜,亨。密云不雨,自我西郊。
36              
37              
38             九五:有孚攣如,富以其鄰。
39              
40              
41              
42             =cut
43              
44             # the main outing function.
45              
46             sub pu {
47 0     0 0   return jiegua( qigua() );
48              
49             }
50              
51             sub bugaindex {
52 0     0 0   my ( @yigua, %yi, %zy, @bagua, @bagua1 );
53              
54 0           @bagua = qw(kun zhen kan dui gen li xun qian);
55 0           @bagua1 = qw(di lei shui ze shan huo feng tian);
56 0           my @bgindex =
57             qw(tian_tian tian_ze tian_huo tian_lei tian_feng tian_shui tian_shan tian_di ze_tian ze_ze ze_huo ze_lei ze_feng ze_shui ze_shan ze_di huo_tian huo_ze huo_huo huo_lei huo_feng huo_shui huo_shan huo_di lei_tian lei_ze lei_huo lei_lei lei_feng lei_shui lei_shan lei_di feng_tian feng_ze feng_huo feng_lei feng_feng feng_shui feng_shan feng_di shui_tian shui_ze shui_huo shui_lei shui_feng shui_shui shui_shan shui_di shan_tian shan_ze shan_huo shan_lei shan_feng shan_shui shan_shan shan_di di_tian di_ze di_huo di_lei di_feng di_shui di_shan di_di);
58 0           my @num =
59             qw(1 10 13 25 44 6 33 12 43 58 49 17 28 47 31 45 14 38 30 21 50 64 56 35 34 54 55 51 32 40 62 16 9 61 37 42 57 59 53 20 5 60 63 3 48 29 39 8 26 41 21 27 18 4 52 23 11 19 36 24 46 7 15 2);
60              
61 0           @zy{@bgindex} = @num;
62 0           for ( 0 .. 63 ) {
63              
64 0           my $zindexs = sprintf( "%lo", $_ );
65 0           push @yigua, $zindexs;
66             }
67              
68 0           for (@yigua) {
69              
70 0 0         if (/^\d$/) {
71              
72             #print $_,"\n";
73 0           $yi{$_} = $bagua1[0] . "_" . $bagua1[$_];
74              
75             }
76             else {
77 0           my ( $q, $k ) = split //, $_;
78 0           $yi{$_} = $bagua1[$q] . "_" . $bagua1[$k];
79             }
80              
81             }
82              
83 0           return ( \%zy, \%yi );
84             }
85              
86             =pod
87              
88             the explanations functions - input the guanum and it's
89             changs trend from the yao's yinyang.
90              
91             using old explinations of Zhuyi (明.朱熹 《易学启蒙》解卦)
92              
93             六爻不变,以本卦卦辞断;
94             一爻变,以本卦变爻爻辞断;
95             两爻变,以本卦两个爻辞断,但以上者为主;
96             三爻变,以本卦与变卦卦辞断;本卦为贞(体),变卦为悔(用);
97             四爻变,以变卦之两不变爻爻辞断,但以下者为主;
98             五爻变,以变卦之不变爻爻辞断;
99             六爻变,以变卦之卦辞断,乾坤两卦则以「用」辞断。
100             =cut
101              
102             sub jiegua {
103              
104 0     0 0   my ( $ogua, $bgua, $myao, $mguo ) = @_;
105 0 0         my $int = $mguo ? $ogua : $bgua;
106 0           my $msg;
107 0 0         if ($myao eq 'B'){
    0          
    0          
108            
109 0           $msg=zhanbu( $ogua, -1 );
110 0           $msg.="变";
111 0           $msg.=zhanbu( $bgua, -1 );
112              
113             }elsif($myao eq 'C') {
114            
115 0 0         ( $ogua == 0 )or ( $ogua == 63 )
    0          
116             ? ($msg=zhanbu( $ogua, 6 ))
117             : ($msg=zhanbu( $ogua, -1 ))
118              
119             }elsif($myao eq 'U') {
120            
121 0           $msg=zhanbu( $ogua, -1 )
122            
123             }else {
124            
125 0           $msg=zhanbu( $int, $myao );
126            
127             }
128 0           return $msg;
129             }
130              
131             sub zhanbu {
132 0     0 0   my ( $zy, $yi ) = bugaindex();
133 0           my ( $gua, $myao ) = @_;
134 0           my $sint = sprintf( "%lo", $gua );
135 0           my $reply = ZhouyiEx( $zy->{ $yi->{$sint} } );
136 0           my $reply1 = outtuan($reply);
137 0           my ( $replyyao, $syao ) = maixyao( $reply, $myao );
138 0           my ( $replyxiang, $sxiang ) = maixiang( $reply, $myao );
139 0           $reply1.=$sxiang->[0];
140 0           my $wydsg;
141            
142 0 0         if($myao == -1) {
    0          
143              
144 0           $wydsg="卦:".$reply1. "\n\n";
145            
146             }elsif($myao == 6 ) {
147 0           $wydsg= "爻:".$syao->[6]."\n".$sxiang->[7];
148             }else {
149 0           $wydsg= "卦:". $reply1. "\n\n";
150 0           $wydsg.= "爻:".$replyyao."\n".$replyxiang."\n";
151             }
152 0           return $wydsg;
153              
154             }
155              
156             sub qigua {
157 0     0 0   my $znum = initzhishu();
158             # printbg( sumyingyan($znum) );
159 0           my ( $gbnum, $gnum ) = sumgua( sumyingyan($znum) );
160 0           my ( $bgnum, $byao, $bgua ) = biangua( sumyingyan($znum) );
161 0           return ( $gnum, $bgnum, $byao, $bgua );
162             }
163              
164             sub initzhishu {
165 0     0 0   my @shishu;
166 0           srand(time);
167 0           for ( 0 .. 5 ) {
168 0           my $int = int( rand(4) + 6 );
169 0           push @shishu, $int;
170             }
171 0           return \@shishu;
172             }
173              
174             sub sumyingyan {
175              
176 0     0 0   my ( %ying, %yang, %bianyao );
177 0           my $shishu = shift;
178              
179 0           for ( 0 .. 5 ) {
180 0           my $num = $shishu->[$_];
181              
182             #print $num,"\n";
183              
184 0 0 0       $ying{$_} = 1 if ( $num % 6 == 0 ) || ( $num % 6 == 2 );
185 0 0 0       $yang{$_} = 1 if ( $num % 6 == 1 ) || ( $num % 6 == 3 );
186 0 0 0       $bianyao{$_} = 1 if ( $num % 6 == 0 ) || ( $num % 6 == 3 );
187              
188             }
189 0           return ( \%ying, \%yang, \%bianyao );
190              
191             }
192              
193             sub sumgua {
194              
195 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
196 0           my $yinum;
197 0           my $n = 5;
198 0           for ( 0 .. 5 ) {
199 0           $n = 5 - $_;
200 0 0         $yinum .= "1" if exists $yang->{$n};
201 0 0         $yinum .= "0" if exists $ying->{$n};
202              
203             }
204              
205             #print $yinum,"\n";
206              
207 0           my $byinnum = '0b' . $yinum;
208 0           my $dec = oct $byinnum;
209              
210             #print $dec,"\n";
211 0           return ( $yinum, $dec );
212              
213             }
214              
215             sub biangua {
216              
217 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
218 0           my ( $gnum, $num ) = sumgua( $ying, $yang, $bianyao );
219 0           my @bnum = split //, $gnum;
220             # print "@bnum", "\n";
221              
222 0           for ( 0 .. 5 ) {
223              
224 0 0         $bnum[$_] = $bnum[$_] ? 0 : 1 if exists $bianyao->{$_};
    0          
225              
226             }
227              
228 0           my %dingyao;
229              
230 0           for ( 0 .. 5 ) {
231 0 0         next if exists $bianyao->{$_};
232 0           $dingyao{$_} = 1;
233             }
234 0           my ( $maiyao, $maigua );
235              
236 0           my @by = sort keys %{$bianyao};
  0            
237 0           my @dy = sort keys %dingyao;
238             # print "by : @by", "\n";
239             # print "dy : @dy", "\n";
240              
241 0           my $bunum=scalar @by;
242              
243 0 0         if($bunum == 1){$maiyao = $by[0]; $maigua = 1}
  0 0          
  0 0          
    0          
    0          
    0          
244 0           elsif($bunum == 2){ $maiyao = $by[1]; $maigua = 1 }
  0            
245 0           elsif($bunum == 3){ $maiyao = "B"; $maigua = 1 }
  0            
246 0           elsif($bunum == 4){ $maiyao = $dy[0]; $maigua = 0 }
  0            
247 0           elsif($bunum == 5){ $maiyao = $dy[0]; $maigua = 0 }
  0            
248 0           elsif($bunum == 6){ $maiyao = "C"; $maigua = 0 }
  0            
249 0           else {$maiyao = "U"; $maigua = 1 }
  0            
250              
251             # print "Yaobian:", $maiyao, "\n";
252             # print "Guabian:", $maigua, "\n";
253             # print "@bnum", "\n";
254 0           my $bnum = join '', @bnum;
255              
256             #print $bnum,"\n";
257             # printgua($bnum);
258 0           my $bbnum = '0b' . $bnum;
259 0           my $dec = oct $bbnum;
260              
261             #print $dec,"\n";
262 0           return ( $dec, $maiyao, $maigua );
263              
264             }
265              
266             sub printgua {
267              
268 0     0 0   my $ying = shift;
269 0           my @bnum = split //, $ying;
270              
271             #print "@bnum","\n";
272 0           my $n = 5;
273 0           for ( 0 .. 5 ) {
274 0           $n = 5 - $_;
275 0 0         $bnum[$_] ? ( print $n+ 1, ":— —\n" ) : ( print $n+ 1, ":—--\n" );
276             }
277              
278             }
279              
280             sub printbg {
281              
282 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
283 0           my $m = 5;
284 0           for ( 0 .. 5 ) {
285 0           $m = 5 - $_;
286 0 0         print $m+ 1, ":—-—\n" if exists $yang->{$m};
287 0 0         print $m+ 1, ":— -\n" if exists $ying->{$m};
288              
289             }
290 0           print "\n";
291 0           $m = 5;
292 0           for ( 0 .. 5 ) {
293 0           $m = 5 - $_;
294 0 0         print $m+ 1, ":变爻\n" if exists $bianyao->{$m};
295              
296             }
297              
298 0           print "\n\n";
299             }
300              
301             =head1 AUTHOR
302              
303             ORANGE, C<< >>
304              
305             =head1 BUGS
306              
307             Please report any bugs or feature requests to C, or through
308             the web interface at L. I will be notified, and then you'll
309             automatically be notified of progress on your bug as I make changes.
310              
311             =head1 SUPPORT
312              
313             You can find documentation for this module with the perldoc command.
314              
315             perldoc ZHOUYI::ZhanPu
316              
317              
318             You can also look for information at:
319              
320             =head1 Git repo
321              
322             Lhttps://github.com/bollwarm/ZHOUYI-ZhanPu
323              
324             =over 4
325              
326             =item * RT: CPAN's request tracker (report bugs here)
327              
328             L
329              
330             =item * AnnoCPAN: Annotated CPAN documentation
331              
332             L
333              
334             =item * CPAN Ratings
335              
336             L
337              
338             =item * Search CPAN
339              
340             L
341              
342             =back
343              
344              
345             =head1 ACKNOWLEDGEMENTS
346              
347              
348             =head1 LICENSE AND COPYRIGHT
349              
350             Copyright 2016 ORANGE.
351              
352              
353             This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
354              
355             =cut
356              
357             1; # End of ZHOUYI::ZhanPu