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   17319 use strict;
  1         2  
  1         38  
4 1     1   4 use warnings;
  1         2  
  1         28  
5 1     1   969 use ZHOUYI;
  1         3531  
  1         194  
6 1     1   7 use utf8;
  1         1  
  1         6  
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.08
20              
21             =cut
22              
23             our $VERSION = '0.08';
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             the explanations functions - input the guanum and it's
92             changs trend from the yao's yinyang.
93              
94             using old explinations of Zhuyi (明.朱熹 《易学启蒙》解卦)
95              
96             六爻不变,以本卦卦辞断;
97             一爻变,以本卦变爻爻辞断;
98             两爻变,以本卦两个爻辞断,但以上者为主;
99             三爻变,以本卦与变卦卦辞断;本卦为贞(体),变卦为悔(用);
100             四爻变,以变卦之两不变爻爻辞断,但以下者为主;
101             五爻变,以变卦之不变爻爻辞断;
102             六爻变,以变卦之卦辞断,乾坤两卦则以「用」辞断。
103             =cut
104              
105             sub jiegua {
106              
107 0     0 0   my ( $ogua, $bgua, $myao, $mguo ) = @_;
108 0 0         my $int = $mguo ? $ogua : $bgua;
109 0           my $msg;
110 0 0         if ($myao eq 'B'){
    0          
    0          
111            
112 0           $msg=zhanbu( $ogua, -1 );
113 0           $msg.="变";
114 0           $msg.=zhanbu( $bgua, -1 );
115              
116             }elsif($myao eq 'C') {
117            
118 0 0         ( $ogua == 0 )or ( $ogua == 63 )
    0          
119             ? ($msg=zhanbu( $ogua, 6 ))
120             : ($msg=zhanbu( $ogua, -1 ))
121              
122             }elsif($myao eq 'U') {
123            
124 0           $msg=zhanbu( $ogua, -1 )
125            
126             }else {
127            
128 0           $msg=zhanbu( $int, $myao );
129            
130             }
131 0           return $msg;
132             }
133              
134             sub zhanbu {
135 0     0 0   my ( $zy, $yi ) = bugaindex();
136 0           my ( $gua, $myao ) = @_;
137 0           my $sint = sprintf( "%lo", $gua );
138 0           my $reply = ZhouyiEx( $zy->{ $yi->{$sint} } );
139 0           my $reply1 = outtuan($reply);
140 0           my ( $replyyao, $syao ) = maixyao( $reply, $myao );
141 0           my ( $replyxiang, $sxiang ) = maixiang( $reply, $myao );
142 0           $reply1.=$sxiang->[0];
143 0           my $wydsg;
144            
145 0 0         if($myao == -1) {
    0          
146              
147 0           $wydsg="卦:".$reply1. "\n\n";
148            
149             }elsif($myao == 6 ) {
150 0           $wydsg= "爻:".$syao->[6]."\n".$sxiang->[7];
151             }else {
152 0           $wydsg= "卦:". $reply1. "\n\n";
153 0           $wydsg.= "爻:".$replyyao."\n".$replyxiang."\n";
154             }
155 0           return $wydsg;
156              
157             }
158              
159             sub qigua {
160 0     0 0   my $znum = initzhishu();
161             # printbg( sumyingyan($znum) );
162 0           my ( $gbnum, $gnum ) = sumgua( sumyingyan($znum) );
163 0           my ( $bgnum, $byao, $bgua ) = biangua( sumyingyan($znum) );
164 0           return ( $gnum, $bgnum, $byao, $bgua );
165             }
166              
167             sub initzhishu {
168 0     0 0   my @shishu;
169 0           srand(time);
170 0           for ( 0 .. 5 ) {
171 0           my $int = int( rand(4) + 6 );
172 0           push @shishu, $int;
173             }
174 0           return \@shishu;
175             }
176              
177             sub sumyingyan {
178              
179 0     0 0   my ( %ying, %yang, %bianyao );
180 0           my $shishu = shift;
181              
182 0           for ( 0 .. 5 ) {
183 0           my $num = $shishu->[$_];
184              
185             #print $num,"\n";
186              
187 0 0 0       $ying{$_} = 1 if ( $num % 6 == 0 ) || ( $num % 6 == 2 );
188 0 0 0       $yang{$_} = 1 if ( $num % 6 == 1 ) || ( $num % 6 == 3 );
189 0 0 0       $bianyao{$_} = 1 if ( $num % 6 == 0 ) || ( $num % 6 == 3 );
190              
191             }
192 0           return ( \%ying, \%yang, \%bianyao );
193              
194             }
195              
196             sub sumgua {
197              
198 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
199 0           my $yinum;
200 0           my $n = 5;
201 0           for ( 0 .. 5 ) {
202 0           $n = 5 - $_;
203 0 0         $yinum .= "1" if exists $yang->{$n};
204 0 0         $yinum .= "0" if exists $ying->{$n};
205              
206             }
207              
208             #print $yinum,"\n";
209              
210 0           my $byinnum = '0b' . $yinum;
211 0           my $dec = oct $byinnum;
212              
213             #print $dec,"\n";
214 0           return ( $yinum, $dec );
215              
216             }
217              
218             sub biangua {
219              
220 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
221 0           my ( $gnum, $num ) = sumgua( $ying, $yang, $bianyao );
222 0           my @bnum = split //, $gnum;
223             # print "@bnum", "\n";
224              
225 0           for ( 0 .. 5 ) {
226              
227 0 0         $bnum[$_] = $bnum[$_] ? 0 : 1 if exists $bianyao->{$_};
    0          
228              
229             }
230              
231 0           my %dingyao;
232              
233 0           for ( 0 .. 5 ) {
234 0 0         next if exists $bianyao->{$_};
235 0           $dingyao{$_} = 1;
236             }
237 0           my ( $maiyao, $maigua );
238              
239 0           my @by = sort keys %{$bianyao};
  0            
240 0           my @dy = sort keys %dingyao;
241             # print "by : @by", "\n";
242             # print "dy : @dy", "\n";
243              
244 0           my $bunum=scalar @by;
245              
246 0 0         if($bunum == 1){$maiyao = $by[0]; $maigua = 1}
  0 0          
  0 0          
    0          
    0          
    0          
247 0           elsif($bunum == 2){ $maiyao = $by[1]; $maigua = 1 }
  0            
248 0           elsif($bunum == 3){ $maiyao = "B"; $maigua = 1 }
  0            
249 0           elsif($bunum == 4){ $maiyao = $dy[0]; $maigua = 0 }
  0            
250 0           elsif($bunum == 5){ $maiyao = $dy[0]; $maigua = 0 }
  0            
251 0           elsif($bunum == 6){ $maiyao = "C"; $maigua = 0 }
  0            
252 0           else {$maiyao = "U"; $maigua = 1 }
  0            
253              
254             # print "Yaobian:", $maiyao, "\n";
255             # print "Guabian:", $maigua, "\n";
256             # print "@bnum", "\n";
257 0           my $bnum = join '', @bnum;
258              
259             #print $bnum,"\n";
260             # printgua($bnum);
261 0           my $bbnum = '0b' . $bnum;
262 0           my $dec = oct $bbnum;
263              
264             #print $dec,"\n";
265 0           return ( $dec, $maiyao, $maigua );
266              
267             }
268              
269             sub printgua {
270              
271 0     0 0   my $ying = shift;
272 0           my @bnum = split //, $ying;
273              
274             #print "@bnum","\n";
275 0           my $n = 5;
276 0           for ( 0 .. 5 ) {
277 0           $n = 5 - $_;
278 0 0         $bnum[$_] ? ( print $n+ 1, ":— —\n" ) : ( print $n+ 1, ":—--\n" );
279             }
280              
281             }
282              
283             sub printbg {
284              
285 0     0 0   my ( $ying, $yang, $bianyao ) = @_;
286 0           my $m = 5;
287 0           for ( 0 .. 5 ) {
288 0           $m = 5 - $_;
289 0 0         print $m+ 1, ":—-—\n" if exists $yang->{$m};
290 0 0         print $m+ 1, ":— -\n" if exists $ying->{$m};
291              
292             }
293 0           print "\n";
294 0           $m = 5;
295 0           for ( 0 .. 5 ) {
296 0           $m = 5 - $_;
297 0 0         print $m+ 1, ":变爻\n" if exists $bianyao->{$m};
298              
299             }
300              
301 0           print "\n\n";
302             }
303              
304             =head1 AUTHOR
305              
306             ORANGE, C<< >>
307              
308             =head1 BUGS
309              
310             Please report any bugs or feature requests to C, or through
311             the web interface at L. I will be notified, and then you'll
312             automatically be notified of progress on your bug as I make changes.
313              
314             =head1 SUPPORT
315              
316             You can find documentation for this module with the perldoc command.
317              
318             perldoc ZHOUYI::ZhanPu
319              
320              
321             You can also look for information at:
322              
323             =head1 Git repo
324              
325             Lhttps://github.com/bollwarm/ZHOUYI-ZhanPu
326              
327             =over 4
328              
329             =item * RT: CPAN's request tracker (report bugs here)
330              
331             L
332              
333             =item * AnnoCPAN: Annotated CPAN documentation
334              
335             L
336              
337             =item * CPAN Ratings
338              
339             L
340              
341             =item * Search CPAN
342              
343             L
344              
345             =back
346              
347              
348             =head1 ACKNOWLEDGEMENTS
349              
350              
351             =head1 LICENSE AND COPYRIGHT
352              
353             Copyright 2016 ORANGE.
354              
355              
356             This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
357              
358             =cut
359              
360             1; # End of ZHOUYI::ZhanPu