
其實 new 只是一個習慣用的名稱,我們需要一個方法當作建構子,實際建構子的名稱不一定要用 new 。
完整程式請參考
我們需要將 new 更改如下
9 10 11 12 13 14 15 16 17 18 19 | 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 為物件的套件名稱
10 | my $class = shift ; |
第二個 $self 是一個匿名的雜湊型態 (anonymous hash) ,需要用純量變數 (scalar variable) 當參考
11 12 13 14 | my $self = { alph => shift , code => shift , }; |
這個匿名雜湊裡面的 alph 與 code 就是物件的屬性 (attribute) ,接下來的兩行便是初始化 alph 與 code
15 16 | $self ->{alph} = join ( "" , ( "a" .. "z" )); $self ->{code} = join ( "" , shuffle(( "a" .. "z" ))); |
shuffle 是用來攪亂陣列 (array) 順序的,這樣我們可以得到一個隨機排列的英文字母表,因此 code 就是我們需要的密碼表囉!可是 shuffle 是在模組庫中的,因此要先 use 進來
7 | use List::Util qw(shuffle); |
new 接下來使用 bless
17 | bless $self , $class ; |
bless 是把 $class 與 $self 放到物件中,使這兩個真正成為物件的屬性。記得,最後要 return $self
18 | return $self ; |
這樣 new 方法就完成了,我們再增加一個 getCode() 方法,用來取得密碼表,如下
21 22 23 24 | sub getCode { my $self = shift ; return $self ->{code}; } |
我們用下面的程式來測試一下吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/perl use strict; use warnings; use Encrypt; my $e = new Encrypt; my $c = $e ->getCode(); print "code : $c\n" ; # 《程式語言教學誌》的範例程式 # 檔名: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();
已修改錯誤,感謝指正 ^_^
張貼留言