簡體   English   中英

如何創建Perl類?

[英]How do I create a Perl class?

我正在編寫Perl類來從腳本中刪除冗余,因為Perl有很多方法可以創建類,所以我在編寫類時遇到了麻煩。 那么有沒有人有一個類的最佳實踐示例?

我遇到的最大問題是,如果模塊中不存在全局變量,那么如何在模塊中的sub()中使用變量? 像Java self-> foo = 10;

基本上只是給我一個用Java或C#甚至C ++編寫的類,並在Perl中編寫相同的類。 還有一些額外的要點,用於展示如何正確地執行私有,受保護和公共類變量。 我想,繼承和接口會有所幫助。

創建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();

或者,可以添加accessor / mutator方法(參見Class :: Accessor,Class :: Accessor :: Chained等,以便於設置這些) - 這使得更容易驗證數據並添加封裝(它不是在Perl中強制執行的,你必須確保你的代碼沒有繞過適當的訪問器/ mutator並直接訪問blessed hashref中的數據。

好吧,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";

這是使用新的Moose樣式對象編寫的同一個類:

#!/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 :: Declare消除了對更多代碼的需求並使事情變得美觀:

#!/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";

快速說明,這兩個類是我寫過的前兩個Moose類。 這里有一些非常生銹的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;
}

查看Moose ,它是Perl 5對象系統的擴展。

以下內容將幫助您學習Moose:

除了穆斯,人們已經提到過......

如果您只是在談論類(因此,而不是對象),您通常會創建具有作用於文件的詞法變量的類數據,並為每個文件使用一個類。 您可以創建訪問器方法來處理它們。 有各種方法可以解決這個問題。

但是,聽起來你需要從像Intermediate Perl或Damian Conway的Object Oriented Perl開始 對於任何人來說,有太多的東西要花時間在Stackoverflow的答案中重現所有這些內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM