我正在編寫Perl類來消除腳本中的冗餘,因爲Perl有很多方法來創建類,所以我一直無法正確地創建類。那麼有沒有人有一個類的最佳實踐例子?如何創建一個Perl類?
我最大的問題是,如果模塊中不應該有全局變量如何使用模塊中的sub()變量?像Java一樣> foo = 10;
基本上只給我一個用Java或C#甚至C++編寫的類,並在Perl中編寫。此外還要介紹如何正確執行私有,受保護和公共類變量。繼承和接口將有助於我猜。
我正在編寫Perl類來消除腳本中的冗餘,因爲Perl有很多方法來創建類,所以我一直無法正確地創建類。那麼有沒有人有一個類的最佳實踐例子?如何創建一個Perl類?
我最大的問題是,如果模塊中不應該有全局變量如何使用模塊中的sub()變量?像Java一樣> 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();
可替換地,可以加入存取/突變的方法(參見::類訪問器,類::訪問器::鏈式等易於設置的向上這些) - 這使得驗證數據和添加封裝變得更加容易(它不是在Perl中強制執行的,您必須確保代碼不會繞過適當的訪問器/增變器並直接訪問受保護的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";
下面是使用新的駝鹿樣式對象寫入同一個類:
#!/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;
}
此外駝鹿,人們已經提到...
如果你是隻是談論類(所以不是對象)時,通常使用範圍爲文件的詞法變量創建類數據,併爲每個文件使用一個類。您創建訪問器方法來處理它們。有很多方法可以解決這個問題。
但是,這聽起來像你需要從Intermediate Perl或達米安康威的Object Oriented Perl開始。有太多的解釋,任何人採取重現了這一切的答案#1的時間。
Perl的面向對象的特點是在最好的欠缺有點...:PI會去看看一個簡單的.pm模塊,看看他們是如何實現 – 2009-06-24 09:31:26