Perl 入門指南 - new 方法

new 方法 (method) 是物件 (object) 的建構子 (constructor) ,透過 new ,我們可以建立物件的實體




其實 new 只是一個習慣用的名稱,我們需要一個方法當作建構子,實際建構子的名稱不一定要用 new 。


完整程式請參考


我們需要將 new 更改如下
sub new {
    my $class = shift;
    my $self = {
        alph => shift,
        code => shift,
    };
    $self->{alph} = join("", ("a" .. "z"));
    $self->{code} = join("", shuffle(("a" .. "z")));
    bless $self, $class;
    return $self;
}


裡頭用 my 宣告兩個屬於 new 的變數,第一個 $class 為物件的套件名稱
my $class = shift;


第二個 $self 是一個匿名的雜湊型態 (anonymous hash) ,需要用純量變數 (scalar variable) 當參考
my $self = {
    alph => shift,
    code => shift,
};


這個匿名雜湊裡面的 alph 與 code 就是物件的屬性 (attribute) ,接下來的兩行便是初始化 alph 與 code
$self->{alph} = join("", ("a" .. "z"));
$self->{code} = join("", shuffle(("a" .. "z")));


shuffle 是用來攪亂陣列 (array) 順序的,這樣我們可以得到一個隨機排列的英文字母表,因此 code 就是我們需要的密碼表囉!可是 shuffle 是在模組庫中的,因此要先 use 進來
use List::Util qw(shuffle);


new 接下來使用 bless
bless $self, $class;


bless 是把 $class 與 $self 放到物件中,使這兩個真正成為物件的屬性。記得,最後要 return $self
return $self;


這樣 new 方法就完成了,我們再增加一個 getCode() 方法,用來取得密碼表,如下
sub getCode {
    my $self = shift;
    return $self->{code};
}


我們用下面的程式來測試一下吧
#!/usr/bin/perl
use strict;
use warnings;

use Encrypt;

my $e = new Encrypt;
my $c = $e->getCode();
print "code  : $c\n";

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:encryptdemo2.pl
# 功能:示範 Perl 程式
# 作者:張凱慶
# 時間:西元 2013 年 1 月


執行結果如下



結果 ok !接下來我們繼續加入編碼與解碼的功能吧!



中英文術語對照
方法method
物件object
建構子constructor
匿名的雜湊型態anonymous hash
純量變數scalar variable
屬性attribute
陣列array


您可以繼續參考
軟體開發


相關目錄
回 Perl 入門指南
回 Perl 教材
回首頁


參考資料
http://perldoc.perl.org/perlootut.html
http://www.tutorialspoint.com/perl/perl_oo_perl.htm

3 則留言:

Unknown 提到...

謝謝你提供這麼好的學習

不過在這邊文章中發現了程式碼有些問題

請問是否在sub new裡的
12 行alph=< shift, 應改成 alph=>shift,
13 行code =< shift, 應改成 code=>shift,
15 行$self-<{alph} = join("", ("a" .. "z")); 應改成 $self->{alph} = join("", ("a" .. "z"));
16 行$self-<{code} = join("", shuffle(("a" .. "z"))); 應改成 $self->{code} = join("", shuffle(("a" .. "z")));

還有sub getCode裡的
23行 return $self-<{code}; 應改成 return $self->{code};

還有encryptdemo2.pl裡的
my $c = $e-getCode();

Unknown 提到...

承上篇留言
my $c = $e-getCode();

要改成
my $c = $e->getcode();

Kaiching Chang 提到...

已修改錯誤,感謝指正 ^_^