免费注册 查看新帖 |

Chinaunix

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

关于perl OOP编程。请不吝赐教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-11 11:07 |只看该作者 |倒序浏览
高手请出手。

本人,刚刚接触PERL。但是感觉语言都是相通的,没有感觉到什么压力。但是最近在学习PERL 的时候发现OOP ,对于我很难理解。我认为语言都是用写,人用的,所以也不会超出人的理解能力。但是OOP 我实在难理解。

请高手,大概说一下,形象些,最好。

其次是大概的结构。

package Bug; # 第一步,建立一个 package
use strict;
sub new  # 建立 subroutine
{
    my ($class) = @_;                     ·····························????
    my $objref = {};                       ·····························????
    #其他的一些代码
    bless $objref, $class; #用 bless 语法产生了一个 object    ·················????
}

sub print_me # 又建立了一个subroutine
{
    my ($self) = @_;
    #实现功能的一些代码
}





#! /usr/bin/perl -w
use Bug;
use strict;

my $object = Bug->new(@args);  #利用 @args 中的数据创立一个对象,它属于 Bug 这个 class
$object->print_me();  #调用Bug class 中定义的print_me()函数


查了些东西还是不明白。 先谢谢高手了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-09-11 11:18 |只看该作者
【但是感觉语言都是相通的,没有感觉到什么压力】
你轻敌了。重新去看入门部分吧。
你打的三个问号有两个属于基础中的基础。

论坛徽章:
0
3 [报告]
发表于 2008-09-11 11:25 |只看该作者
sub new
{
    my $first = shift;
    my $class = ref ($first) || $first;
    my $objref = { @_ };                          
   bless $objref, $class;
    return $objref;
}


这个就是其它oo语言中的constructor
你如果有 oo 的概念的话,其实这个很好懂, 因为perl把每个步骤都告诉你了,通过代码可以看出,
$first  是用来接收传入给constructor 的第一个参数,这个参数不是你的new后面括号里的内容,而是 一个object 或者Bug (package name)。 所以,你所需要做的就是用一个reference 去绑定 它(bless的作用),然后你就可以通过这个reference 去掉用它的方法。至于my $objref = { @_ };     这个是为了接受你的初始化参数所用

论坛徽章:
0
4 [报告]
发表于 2008-09-11 11:27 |只看该作者
我今天怎么这么有 耐心阿。。。。

论坛徽章:
0
5 [报告]
发表于 2008-09-11 11:59 |只看该作者
我是这么理解的, Perl偷偷的把类似C++的this pointer作为第一个参数传进来了

论坛徽章:
0
6 [报告]
发表于 2008-09-11 13:05 |只看该作者
原帖由 forlorngenius 于 2008-9-11 11:27 发表
我今天怎么这么有 耐心阿。。。。



是不是今天买彩票会中奖??哈哈

论坛徽章:
0
7 [报告]
发表于 2008-09-11 13:12 |只看该作者
perl的对象, 我认为其本质就是一个ref而已, 只不过这个ref 被bless过了, 所以通过这个ref可以调用被bless到的模块的方法。

以ref to hash举例,
perl创建对象的步骤是这样的,
1.  先my $rh =  {};
2.  定义模块
package Module;
sub some_method {print "some method\n";}

3. 把$rh跟Moudle关联起来,也就是用bless.
bless $rh, 'Module';

现在$rh就是一个object了,但是你仍然可以把它当作hashref来使用, 同时你可以通过它调用Module的方法:
$rh->{some_key} = "some value";
$rh->some_method();

论坛徽章:
0
8 [报告]
发表于 2008-09-11 13:46 |只看该作者

回复 #7 xiaoshengcaicai 的帖子

严格来说 $rh 非 object, 而是object 的reference

论坛徽章:
0
9 [报告]
发表于 2008-09-11 13:46 |只看该作者

回复 #6 xiaoyu9805119 的帖子

没有中,哎

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 2008-09-11 13:54 |只看该作者
原帖由 forlorngenius 于 2008-9-11 13:46 发表
没有中,哎

坚持买,也许能中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP