其實 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 則留言:
謝謝你提供這麼好的學習
不過在這邊文章中發現了程式碼有些問題
請問是否在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();
承上篇留言
my $c = $e-getCode();
要改成
my $c = $e->getcode();
已修改錯誤,感謝指正 ^_^
張貼留言