免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xie3ks
打印 上一主题 下一主题

学perl的面向对象遇到个问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2015-09-08 14:58 |只看该作者
非常谢谢你,
讲 return 当在 new 的最后一个 } 前面,还是报错

sub new
{
    my $class = shift;
    my $data={};
    our $students;

    my $ref = sub
    {
        my ($access_type, $key, $value)=@_;

        if ($access_type eq "set")
        {
            $data->{$key} = $value;
        }
        elsif ($access_type eq "get")
        {
            return $data->{$key};
        }
        elsif ($access_type eq "keys")
        {
            return keys %{$data};
        }
        elsif ($access_type eq "destory")
        {
            $students--;
            return $students;
        }
        else
        {
           die "Access type should be set or get\n";
        }
        print "New Student created, we have ",++$students," students.\n";
    }
        return bless ($ref, $class);
}


我都要搞晕了

回复 9# MMMIX


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
12 [报告]
发表于 2015-09-08 15:02 |只看该作者
回复 11# xie3ks


    你这是语法错误啊。前面的 } 后需要语句分隔符 ; 。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2015-09-08 15:04 |只看该作者
xie3ks 发表于 2015-09-08 14:58
非常谢谢你,
讲 return 当在 new 的最后一个 } 前面,还是报错


关键是这次报的是语法错误。你都不看错误信息么?

论坛徽章:
0
14 [报告]
发表于 2015-09-08 15:04 |只看该作者
赞,谢谢谢谢,非常感谢
哈哈
回复 12# MMMIX


   

论坛徽章:
0
15 [报告]
发表于 2015-09-08 15:09 |只看该作者
看了,主要是还不太熟悉
知道是 bless 附近有问题
一开始也把return 放在 最后面
但是还是报错,没有找到 new里面的那个 sub 之后还要加个 分号!!


回复 13# MMMIX


   

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
16 [报告]
发表于 2015-09-08 17:02 |只看该作者
本帖最后由 minirain 于 2015-09-08 17:07 编辑

回复 1# xie3ks
原书本中有些语序需要调整一下,如:

  1. else
  2.          {
  3.             die "Access type should be set or get\n";
  4.          }
  5.         
  6.          
  7.      };
  8.          print "New Student created, we have ",++$students," students.\n";
  9.          bless $ref, $class;
  10.            
  11.     }
复制代码
有的print语句要改为printf(格式输出)如:

  1. printf "%-25s%-5s:%-20s\n", $self, $key, $value;
复制代码
而不是:
  1. print "%-25s%-5s:%-20s\n", $self, $key, $value;
复制代码
  1. package Student;

  2. sub new
  3.    {
  4.      my $class = shift;
  5.      my $data={};
  6.      our $students;

  7.      my $ref = sub
  8.      {
  9.          my ($access_type, $key, $value)=@_;

  10.          if ($access_type eq "set")
  11.          {
  12.              $data->{$key} = $value;
  13.          }
  14.          elsif ($access_type eq "get")
  15.          {
  16.              return $data->{$key};
  17.          }
  18.          elsif ($access_type eq "keys")
  19.          {
  20.              return keys %{$data};
  21.          }
  22.          elsif ($access_type eq "destroy")
  23.          {
  24.              $students--;
  25.              return $students;
  26.          }
  27.          else
  28.          {
  29.             die "Access type should be set or get\n";
  30.          }
  31.         
  32.          
  33.      };
  34.          print "New Student created, we have ",++$students," students.\n";
  35.          bless $ref, $class;
  36.            
  37.     }

  38. sub set{
  39.      my ($self, $key, $value) = @_;
  40.      $self->("set", $key, $value);
  41. }

  42. sub get{
  43.      my ($self, $key) = @_;
  44.      return $self->("get", $key);
  45. }

  46. sub display{
  47.      my $self = shift;
  48.      my @keys = $self ->("keys");
  49.      
  50.      #@keys = reverse (@keys) ;
  51.      
  52.      foreach my $key(@keys)
  53.      {
  54.          my $value = $self->("get", $key);
  55.          printf "%-25s%-5s:%-20s\n", $self, $key, $value;
  56.      }
  57.      print "\n";
  58. }

  59. sub DESTROY{
  60.      my $self = shift;
  61.      print "Object going out of scope:\n";
  62.      print "Students remain: " , $self->("destroy") , "\n";
  63. }

  64. 1;
复制代码
运行结果如下:

运行结果.JPG (49.38 KB, 下载次数: 28)

运行结果.JPG

论坛徽章:
0
17 [报告]
发表于 2015-09-08 17:43 |只看该作者
对的,谢谢
已经调整好了!!
第一个地方是 bless 和 他上面的哪行要移出到 new 里的那个匿名函数
第二个地方是 第一步移出来后,要在 } 后加个 分号, (这个才是一直没有发现的问题)

回复 16# minirain


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP