免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1142 | 回复: 3
打印 上一主题 下一主题

问一个包获取值的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-17 22:25 |只看该作者 |倒序浏览
想要做一个复数的加减乘除求模等等等等运算的包,写完后,发现包获取的值不对
  1. package My_complex;
  2. #!/usr/bin/perl -w
  3. use strict;
  4. use overload
  5. '+'  => \&plus,
  6. '-'  => \&subtraction,
  7. '*'  => \&multi,
  8. '/'  => \&div,
  9. abs  => \&abs,
  10. '""' => \&print,
  11. '='  => \&set,
  12. '==' => \&equal;

  13. sub get
  14. {
  15.         $_=shift;
  16.         print "$_\n";
  17.         my @num=/[0-9]+/g;
  18.         my ($i,$r);
  19.         if(/^i$/)
  20.         {$r=0;$i=1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  21.         if(/^\-i$/)
  22.         {$r=0;$i=-1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  23.         if(/^[0-9]+$/)
  24.         {$r=$num[0] ;$i=0;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  25.         if(/^\-[0-9]+$/)
  26.         {$r= -$num[0] ;$i=0;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  27.         if(/^[0-9]+i$/)
  28.         {$r=0 ;$i=$num[0];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  29.         if(/^\-[0-9]+i$/)
  30.         {$r=0 ;$i= -$num[0];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  31.         if(/^[0-9]+\+[0-9]+i$/)
  32.         {$r=$num[0] ;$i=$num[1];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  33.         if(/^\-[0-9]+\+[0-9]+i$/)
  34.         {$r= -$num[0] ;$i=$num[1];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  35.         if(/^[0-9]+\+i$/)
  36.         {$r=$num[0] ;$i=1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  37.         if(/^\-[0-9]+\+i$/)
  38.         {$r= -$num[0];$i=1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  39.         if(/^[0-9]+\-[0-9]+i$/)
  40.         {$r= $num[0];$i= -$num[1];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  41.         if(/^[0-9]+\-i$/)
  42.         {$r= $num[0];$i= -1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  43.         if(/^\-[0-9]+\-[0-9]+i$/)
  44.         {$r= -$num[0] ;$i= -$num[1];print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  45.         if(/^\-[0-9]+\-i$/)
  46.         {$r= -$num[0] ;$i=-1;print "\$r is  ",$r,"  \$i is ",$i,"\n"}
  47.         my %self=("real"=>$r,"image"=>$i);
  48.         print "$r\n$i";
  49.         return bless \%self;
  50. }

  51. sub plus
  52. {
  53.         my($x,$y)=@_;
  54.         my $xr=$x{"real"};
  55.         my $xi=$x{"image"};
  56.         my $yr=$y{"real"};
  57.         my $yi=$y{"image"};
  58.         my $realvalue=$xr+$yr;
  59.         my $imagevalue=$xi+$yi;
  60.         my %self=("real"=>$realvalue,"image"=>$imagevalue);
  61.         return bless \%self;
  62. }

  63. sub subtraction
  64. {
  65.         my($x,$y)=@_;
  66.         my $xr=$x{"real"};
  67.         my $xi=$x{"image"};
  68.         my $yr=$y{"real"};
  69.         my $yi=$y{"image"};
  70.         my $realvalue=$xr-$yr;
  71.         my $imagevalue=$xi-$yi;
  72.         my %self=("real"=>$realvalue,"image"=>$imagevalue);
  73.         return bless \%self;
  74. }

  75. sub multi
  76. {
  77.         my($x,$y)=@_;
  78.         my $xr=$x{"real"};
  79.         my $xi=$x{"image"};
  80.         my $yr=$y{"real"};
  81.         my $yi=$y{"image"};
  82.         my $realvalue=$xr*$yr-$xi*$yi;
  83.         my $imagevalue=$xi*$yr+$yi*$xr;
  84.         my %self=("real"=>$realvalue,"image"=>$imagevalue);
  85.         return bless \%self;
  86. }

  87. sub div
  88. {
  89.         my($x,$y)=@_;
  90.         my $xr=$x{"real"};
  91.         my $xi=$x{"image"};
  92.         my $yr=$y{"real"};
  93.         my $yi=$y{"image"};
  94.         my $abs=$y->abs;
  95.         my $realvalue=($xr*$yr+$xi*$yi)/$abs;
  96.         my $imagevalue=($xi*$yr-$yi*$xr)/$abs;
  97.         my %self=("real"=>$realvalue,"image"=>$imagevalue);
  98.         return bless \%self;
  99. }
  100.        
  101. sub abs
  102. {
  103.         my $this=shift;
  104.         my $r=$this{"real"};
  105.         my $i=$this{"image"};
  106.         return $r*$r+$i*$i;
  107. }

  108. sub print
  109. {
  110.         my $this=@_;
  111.         my ($key,$value,$result);
  112.         while(($key,$value)=each %$this)
  113.         {
  114.                 $result .="$key=>$value\n";
  115.         }
  116.         return $result;
  117. }

  118. sub set
  119. {
  120.         my($x,$y)=@_;
  121.         my %self;
  122.         my $yr=$y{"real"};
  123.         my $yi=$y{"image"};
  124.         $self{"real"}=$yr;
  125.         $self{"image"}=$yi;
  126.         return bless \%self;
  127. }

  128. sub equal
  129. {
  130.         my($x,$y)=@_;
  131.         my $xr=$x{"real"};
  132.         my $xi=$x{"image"};
  133.         my $yr=$y{"real"};
  134.         my $yi=$y{"image"};
  135.         return (($xr==$yr)and($xi==$yi));
  136. }

  137. 1;
复制代码
主程序代码如下
  1. #!/usr/local/bin/perl -w
  2. use strict;
  3. use My_complex;

  4. my $a="i";
  5. my $b="-i";
  6. my $byte1=My_complex->get($a);
  7. my $byte2=My_complex->get($b);
  8.        
  9. my $byte3=$byte1 + $byte2;
  10. print $byte3{"real"},"\n";
  11. print $byte3{"image"},"\n";
复制代码
输出完后发现get方法获得的是My_complex。。。。

论坛徽章:
0
2 [报告]
发表于 2012-12-17 22:41 |只看该作者
再次获取值,才是应该赋予的值。这个问题怎么解决。。。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2012-12-17 23:49 来自手机 |只看该作者
先把引用和Perl 的OO巩固下,比如先写一个不用重载操作符的版本

比如参数 $x 是个引用 $x->{'image'} 没有中间的箭头用的就是变量 %x 和 $x 一点关系都没有

论坛徽章:
0
4 [报告]
发表于 2012-12-18 15:17 |只看该作者
看主程序是想用OO,但是package里面却不是了。推荐一本书: Object-Oriented Perl
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP