Perl 入門指南 - 編碼與解碼

編碼 (encoding) 需要用到轉換表格,我們利用字串 (string) 儲存這個表格,簡單說,就是利用英文字母的排列順序,相對到表格的對應關係




上圖是用了如下的表格
"qzirajsbktcludmvenwfoxgpyh"


對以下的字串而言
"There is no spoon.";


我們先來想一想程式應該如何完成這一項工作,首先, 'T' 不是英文小寫字母,因此跳過,然後 'h' 、 'e' 、 'r' 、 'e' 都是英文小寫字母,對照表格,需要轉換為 'b' 、 'a' 、 'n' 、 'a' ,接下來遇到一個空格字元 ' ' ,也跳過,然後 'i' 、 's' 也都是英文小寫字母,需要轉換為 'k' 、 'w' ,餘下類推。


所以需要利用一個迴圈 (loop) 進行上述編碼工作,逐一檢查字串中的每一個元素,若是該元素為英文小寫字母,就開始進行編碼轉換,這是利用另外一個迴圈,檢查該元素於 alph 中的索引值,最後利用該索引值取出 code 裡的元素。


這是說,第 0 個字元(索引值為 0 ) 'T' 不在英文小寫字母編碼的範圍,因此程式不會處理,然後到第 1 個字母 'h' ,這在 alph 中索引值為 7 ,對照為 code 的 'b' ,因此 'h' 會轉換為 'b' 。


完整程式請參考


因此,編碼方法 (method) 設計如下
sub toEncode {
    my $self = shift;
    my $str_input = shift;
    
    my $str_result = "";
    my $i = 0;
    while ($i < length($str_input)) {
        my $s = substr($str_input, $i, 1);
        if ($s =~ /[a-z]/) {
            $str_result .= substr($self->{code}, index($self->{alph}, $s), 1);
        }
        else {
            $str_result .= $s;
        }
        
        $i++;
    }

    return $str_result;
}


$self 為 Encrypt 物件的屬性 (attribute) ,也就是 alphcode ,而 $str_input 為 toEncode() 方法的參數 (parameter) ,這同時也是要進行編碼的字串, $str_result 則是暫存編碼結果的空字串。


編碼過程很簡單,就在一個 while 迴圈中進行,迴圈的結束條件為 $str_input 的長度,也就是內建函數 (function) length() 的回傳值
while ($i < length($str_input)) {


然後迴圈內取得 $str_input 中的元素,也就是單一字元的子字串,這裡是用內建函數 substr() ,第一個參數為輸入字串,第二個參數為開始索引值,第三個參數則是子字串長度
my $s = substr($str_input, $i, 1);


接著判斷該元素是否為英文小寫小字母,這裡是用正規運算式 (regular expression) 與判斷的運算子。如果是英文小寫字母,就找出編碼值附加到 $str_result 的最後,如果不是就直接將該元素附加到 $str_result 的最後
if ($s =~ /[a-z]/) {
    $str_result .= substr($self->{code}, index($self->{alph}, $s), 1);
}
else {
    $str_result .= $s;
}


記得,用作索引值的 $i 在迴圈的最後要遞增
$i++;


toEncode() 最後回傳編碼結果。


解碼方法跟編碼方法極為類似,只有將 alphcode 的位置對調
sub toDecode {
    my $self = shift;
    my $str_input = shift;
    
    my $str_result = "";
    my $i = 0;
    while ($i < length($str_input)) {
        my $s = substr($str_input, $i, 1);
        if ($s =~ /[a-z]/) {
            $str_result .= substr($self->{alph}, index($self->{code}, $s), 1);
        }
        else {
            $str_result .= $s;
        }
        
        $i++;
    }

    return $str_result;
}


我們用 encryptdemo.pl 測試這兩個方法,執行結果如下



It's work!


好了,正式進入 GUI 的部份之前,先來認識 CPAN 吧!


中英文術語對照
編碼encoding
字串string
迴圈loop
方法method
屬性attribute
參數parameter
函數function
正規運算式regular expression


您可以繼續參考
軟體開發


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


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

沒有留言: