File Coverage

blib/lib/ZHOUYI/ZhanPu.pm
Criterion Covered Total %
statement 12 133 9.0
branch 0 54 0.0
condition 0 9 0.0
subroutine 4 15 26.6
pod 0 11 0.0
total 16 222 7.2


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