2009-06-24 51 views
14

我正在編寫Perl類來消除腳本中的冗餘,因爲Perl有很多方法來創建類,所以我一直無法正確地創建類。那麼有沒有人有一個類的最佳實踐例子?如何創建一個Perl類?

我最大的問題是,如果模塊中不應該有全局變量如何使用模塊中的sub()變量?像Java一樣> foo = 10;

基本上只給我一個用Java或C#甚至C++編寫的類,並在Perl中編寫。此外還要介紹如何正確執行私有,受保護和公共類變量。繼承和接口將有助於我猜。

+1

Perl的面向對象的特點是在最好的欠缺有點...:PI會去看看一個簡單的.pm模塊,看看他們是如何實現 – 2009-06-24 09:31:26

回答

24

創建的Perl對象的典型方式是 '祝福' 一個hashref。對象實例然後可以將數據存儲在自己的一組散列鍵中。

package SampleObject; 

use strict; 
use warnings; 

sub new { 
    my ($class, %args) = @_; 
    return bless { %args }, $class; 
} 

sub sample_method { 
    my ($self) = @_; 
    print $self->{sample_data}; 
} 

及用量:

my $obj = SampleObject->new(sample_data => 'hello world', 
          more_data => 'blah blah blah'); 
$obj->sample_method(); 

可替換地,可以加入存取/突變的方法(參見::類訪問器,類::訪問器::鏈式等易於設置的向上這些) - 這使得驗證數據和添加封裝變得更加容易(它不是在Perl中強制執行的,您必須確保代碼不會繞過適當的訪問器/增變器並直接訪問受保護的hashref中的數據)。

16

檢出Moose,它是Perl 5對象系統的擴展。

下面將幫助您學習麋:

+0

我意識到這是一個受歡迎的答案,但它實際上並沒有告訴我怎麼讓我自己的類與其他OOP語言類似。 – kthakore 2009-06-25 13:18:53

+2

然而,後做點你給它。 – 2009-06-25 15:44:40

+2

你是對的,而不是他給你,告訴你該怎麼做鏈接。當鏈接好得多時,爲什麼要從別的地方複製/粘貼字節。 – mpeters 2009-06-25 15:59:28

23

那麼,Perl很容易,但我在其他語言生鏽,所以我會稍微更新它們。這是一個普通的Perl類:

#!/usr/bin/perl 

package Person; 

use strict; 
use warnings; 
use Carp; 

sub new { 
    my $class = shift; 
    my $self = { @_ }; 
    croak "bad arguments" unless defined $self->{firstname} and defined $self->{lastname}; 
    return bless $self, $class; #this is what makes a reference into an object 
} 

sub name { 
    my $self = shift; 
    return "$self->{firstname} $self->{lastname}"; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

下面是使用新的駝鹿樣式對象寫入同一個類:

#!/usr/bin/perl 

package Person; 

use Moose; #does use strict; use warnings; for you 

has firstname => (is => 'rw', isa => 'Str', required => 1); 
has lastname => (is => 'rw', isa => 'Str', required => 1); 

sub name { 
    my $self = shift; 
    return $self->firstname . " " . $self->lastname; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

而且MooseX ::申報消除了更多的代碼需要,使事情看起來不錯:

#!/usr/bin/perl 

use MooseX::Declare; 

class Person { 
    has firstname => (is => 'rw', isa => 'Str', required => 1); 
    has lastname => (is => 'rw', isa => 'Str', required => 1); 

    method name { 
      return $self->firstname . " " . $self->lastname; 
    } 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

快速注意,這兩個類是我寫過的前兩個穆斯類。這裏是一些非常生疏的C++代碼(不削減自己就可以了,或者你需要注射破傷風針):

#include <stdio.h> 
#include <string.h> 

class Person { 
    char* firstname; 
    char* lastname; 

    public: 
    Person(char* first, char* last) { 
     firstname = first; 
     lastname = last; 
    } 

    char* name(void) { 
     int len = strlen(firstname) + strlen(lastname) + 1; 
     char* name = new char[len]; 
     name[0] = '\0'; 
     strcat(name, firstname); 
     strcat(name, " "); 
     strcat(name, lastname); 
     return name; 
    } 
}; 

int main(void) { 
    Person* p = new Person("Chas.", "Owens"); 
    char* name = p->name(); 
    printf("%s\n", name); 
    delete name; 
    delete p; 
    return 0; 
} 
4

此外駝鹿,人們已經提到...

如果你是隻是談論類(所以不是對象)時,通常使用範圍爲文件的詞法變量創建類數據,併爲每個文件使用一個類。您創建訪問器方法來處理它們。有很多方法可以解決這個問題。

但是,這聽起來像你需要從Intermediate Perl或達米安康威的Object Oriented Perl開始。有太多的解釋,任何人採取重現了這一切的答案#1的時間。