2011年12月14日 星期三

迴圈控制敘述(Loop Control Statements)

迴圈控制敘述(Loop Control Statements)

我們知道迴圈可以幫助程式,「反覆進行」同一個區塊內的運算,

但有時候我們會希望,迴圈能「跳過」某次運算,或是「轉向」其他程式區塊。

這個「跳過」或「轉向」的操作,就是這篇迴圈控制要說明的部分了。

靈活的迴圈控制能節省程式執行時間,

但必須謹慎的使用,避免程式結構被破壞而導致維護上的困難。

之前提過的forforeachwhileuntil

我們在控制敘述的重複執行有說明,

在這裡我們就討論,怎麼在這幾個迴圈內做操作吧!


last

顧名思義就是讓迴圈停止。

用法是寫在迴圈內,我們來用例子說明:

for ($i=0;$i<10;$i++)

{ # $i會先從0開始 每跑完一次就會累加1

if($i==8) # 當$i為8時

{

last; # 終止迴圈

}

print $i; # 把$i印出來

}

執行結果就會看到 只印到7就不執行了。

如果要偷懶點的寫法,可以寫成:

for ($i=0;$i<10;$i++)

{ # $i會先從0開始 每跑完一次就會累加1

last if($i==8); # 當$i為8時終止

print $i; # 把$i印出來

}

執行結果會是相同的。


redo

可以讓迴圈重複執行一次,

用法同樣是寫在迴圈內,來看例子:

$count=0; # 迴圈外放一個計數器

for ($i=0;$i<10;$i++)

{ # $i會先從0開始 每跑完一次就會累加1

$count++;

redo if($count==8); # 當$count為8時重作"一次"迴圈

print $count; # 把$count印出來

}

執行結果就會看到,8多加了一次,結果就是8沒有印出來。


next

既然可以讓迴圈停止、重作,

當然,一樣就有「略過」的控制敘述,

用法同樣是寫在迴圈內,來看例子:

for ($i=0;$i<10;$i++)

{ # $i會先從0開始 每跑完一次就會累加1

next if($i==8); # 當$i為8時略過

print $i; # 把$i印出來

}

執行結果就會看到,8沒有被印出來。


知道了迴圈的「終止」、「重作」、「略過」之後,

最後一個我們要看的,是用來做「轉向」的標籤(Label)

標籤的作用是讓Perl知道接下來要跳到哪裡去,

很多程式設計師很反對使用標籤,因為會對程式架構上,有一定程度的破壞。

不過阿逸自己則是認為,適時的使用反而會增加方便性。

有時候單單利用nextlast無法逃離迴圈到正確的地方時,

就會使用到標籤(Label)。標籤使用方式為:

1.定義標籤所在位置及名稱,要大寫,並且要有冒號(:)。

2.使用時,加上goto 以及標籤名稱。

直接來看怎麼用吧:

@array= qw/123 456 789 246 468 135 357/; # 依序放入陣列

$pattern= 456; # 用來比對的樣式

foreach (@array)

{

print $_; # 印出每次讀取的陣列內容

if ($pattern== $_) # 比對成功時

{

goto LABEL; # 轉向到標籤點

}

}

LABEL: # 記住 這裡是使用冒號(:) 表示標籤的定位點

執行結果就會看到,符合條件後,程式就跳到迴圈外的標籤。


接下來就要加入一些檔案處理的觀念了,

要進行的部分是Perl的檔案存取

2011年12月8日 星期四

我的作品練習 - Perl/tk 線上查價軟體

首先簡介一下Tk是什麼。
Tk是一個GUI 函式庫,你可以用它來為你的程式,
加上圖形化的使用者介面(Graphical User Interface)。
Tk可以與眾多語言配合使用,例如 tcl, perl, ruby, python, java, c, c++, ...
因此而有了 tcl/tk, python/tk, perl/tk, ...
而這裡所使用的就是我自己使用perl/tk的實作展示。

很抱歉的是,暫時不公開程式碼,
因為有其他用途,所以先講講這程式功能吧!

程式說明:
功能為查詢兩個線上購物網站(Yahoo、momo),並將查詢結果回傳,
回傳內容同時包含圖片以及售價,
如果遇到查詢無結果時,會給予符合筆數為0並顯示Not Found圖片。

輸入想要查詢的東西 (目前以3C產品為主)
按下底下的按鈕”開始找東西啦!!!” 便會回傳查詢結果:
而如果出現無查詢結果時,會顯示Not Found圖示:

台灣樂團五月天作品節奏遊戲 - NOK!MAYDAY (iPhone)

現存很多節奏遊戲,多半都是由國外寫的,

歌曲也都以外國歌曲為主。

現在,台灣有也一款,由台灣樂團五月天作品為主的節奏遊戲,

阿逸本身是五月天的歌迷,

所以就私心介紹一下這款遊戲吧!


目前這款遊戲有兩個版本

試玩版本: NOK!MAYDAY Lite

正式版本: NOK!MAYDAY($1.99)

語言:繁體中文

以下是試玩版本 NOK!MAYDAY Lite 介紹


一開始的畫面為相信音樂公司Logo

接著會秀出 - 五月天追夢3DNA電影宣傳照

在這個電影宣傳照片 有兩個操作方式

1. 直接點選圖片可以進入遊戲

操作方式同一般的節奏遊戲,試幾次就會輕易上手。














2. 如果點選右下角的選單圖示(如圖)

會進入另一個選單畫面。

可以直接看到:

五月天的行程表

在某些特定的日期上會標記圓點

表示有公開的行程

如圖中顯示的2011年12月23日「諾亞方舟」演唱會。


五月天官方網頁的最新公告


五月天FB官方粉絲團

可以直接瀏覽官方FB動態消息


相信音樂FB官方粉絲團

同樣可以直接瀏覽官方FB動態消息


※阿逸是拿測試版來介紹

友人有下載完整版,正式版跟試玩版都只有兩首歌,

兩版本目前差異僅歌曲長度不同,但正式版要$1.99。

由於這款節奏iAPP才剛完成上線(2011年11月28日),

所以歌曲不多,以後應該會再加入更多新歌,

至於要不要付錢買正式版,阿逸目前仍在觀望中。

2011年11月30日 星期三

正規表示法(Regular Expressions)

正規表示法(Regular Expressions)

正規表示法並不是Perl所獨有的,但在Perl裡卻經常被拿來使用。

這也是為什麼很多人聽到Perl,直覺都會想到它的文字處理能力。

正規表示法。簡單來說就是比對樣式(pattern),

依照需求而去「尋找」我們所要的字串,並對這些字串加以處理。

比對符號是用等號波浪號(=~)來表示,

一樣我們直接從例子來看會比較清楚:

$string = "No pain, no gain.";# 給予一段字串 並存到變數裡

if ($string =~ /gain/)# 當$string裡面有gain時

{

print "match!";# 印出match訊息

}

else # 若否

{

print "sorry!";# 印出sorry訊息

}

執行一次結果就會是: match!


知道簡單的比對樣式(pattern)後,

來看看一些不一樣的用法吧!

有的時候我們需要找的東西不只一種,

比方說我要找美妝用品,但是只想看兩種品項的文章,

就可以把if內的條件寫成這樣:

if ($string =~ /(化妝水|面膜)/)# 當$string裡面有化妝水 或是(|符號)面膜

當然,也可以指定說,關鍵字一定都要符合的,

像是我只要某些牌子的手機:

if ($string =~ /Apple/ && $string =~ /phone/)# 當$string裡面有Apple 並且(&&符號)有phone

如此一來,找到的東西就只會同時有Apple以及phone。

值得一提的是,因為Perl正規表示法中,

樣式比對要考慮到大小寫、空格、換行、特殊字元等,

所以上面那行程式碼,萬一遇到apple的a是小寫時,

比對就會失敗,

要避免這個問題,我們可以使用一些「字符集合」

我們使用中括號([])表示 「或者」 的意思:

if ($string =~ /[aA]pple/ && $string =~ /[pP]hone/)# 首字大小寫都允許

如此一來,就可以避開首字大小寫的問題。


不過,如果每個字首都要定義大小寫,恐怕會寫成:

$string=~ /(/a|b|c|d|.......|z|A|B|C|D|......|_|)/

整串寫完真的會很壯觀呢!

當然,「字符集合」仍然有更方便的用法。

$string=~ /[a-zA-Z]/

短短這段字符集合就可以取代上面那段看起來很壯觀的程式碼,

表示大小寫都可以算比對成功。

$string=~ /[!@#$%^&*()_+=]/

而這樣就可以比對特殊字元!

但是問題來了,如果我要比對的是這個連字符號(-)呢?

上面的例子我們看到連字符號(-)已經被拿來當作取出a-z,A-Z的各個字符,

因此會使用到跳脫字元(escape character)

$string=~ /[\-]/

使用反斜線符號(\)表示下一個字元要跳脫(表示不做特殊用途)

因此就可以抓到連字符號。

而如果我們不要某些字,可以會使用插入符號(^)

$string=~ /[^A]/

表示我不要有A字元的樣式,以此類推。


知道使用字符集合增加樣式比對的複雜性後,

Perl的正規表示法其實也有特殊字元可以使用,

像是剛剛這段 $string =~ /[a-zA-Z]/

就可以簡寫成$string =~ /\w/

而常用的一些Perl正規表示法的特殊字元有:

\w:就等同於[a-zA-Z]的字符集合。

\W:就等同於[^a-zA-Z]的字符集合。 (大寫表示的意思)

\s:就等同於空白字元(space)。

\S:就等同於空白字元的字符集合。

\d:就等同於[0~9]的字符集合。

\D:就等同於[^0~9]的字符集合。

當然,你也可以這麼使用,

假設我想比對的樣式,長度在5~10之間,

那麼一樣可以使用修飾字元,

使用的方式就是使用大擴號({})來表示:

$string =~ /\w{5,10}/

如此一來就可以抓到長度5到10的英文字。


再來我們要回來看看正規表示法的修飾字元

一樣我們用例子來說明,

如果我想抓取一段句子中,perl這個字串,

那麼你會遇到一個問題,除了首字大寫(Perl)之外,

句子中可能會有全部小寫(perl),以及全部大寫(PERL)的情況,

那麼表示起來可能又會寫一大段,

這時候修飾字元就派上用場了:

$string=~ /perl/i

注意到了嗎?樣式比對後面加了一個 i 表示 ignore (忽略)

表示我要忽略大小寫,如此一來上面的問題就可簡單處理掉了!

其他修飾字元還有:

$string=~ /perl/s

樣式比對後面加了一個 s 表示我要進行跨行(跨越\n)做比對

$string=~ /perl/g

樣式比對後面加了一個 g 表示我要對樣式進行全面比對(Match globally)

$string=~ /perl/o

樣式比對後面加了一個 o 表示我只要比對一次(Match once)

當然,你也可以把這些修飾字元都一起使用:

$string=~ /perl/io

樣式比對後面加了一個 i 以及 o

表示我想要進行忽略大小寫的樣式比對,並且只要成功比對一次就好。


知道如何比對樣式後,有時我們也會需要取得比對結果,

在Perl的正規表示法裡,有預設變數來讓你取得比對的結果,

預設的變數是使用$1來接比對後的結果,

然而,如果還有其他比對結果,則會用到$2,

如果還有就會持續遞增:像是$1, $2, $3 ...

而要把我們想要取得的樣式存到這些變數裡,

方法也很簡單,就是用小括號()把這些樣式包起來。

一樣我們從例子來說明:

$string = "God helps those who help themselves.";# 給予一段字串 並存到變數裡

if ($string =~ /(God)(.*)(those)/i)# 當$string裡面有(God)以及(任何字元)還有(those)時

# 因為修飾字元有i 所以會忽略大小寫 並且 因為有三個小括號

# 所以成功比對的樣式會依序存入3個預設變數 即是 $1 $2 $3

{

print "$1 \n";# 印出$1以及換行

print "$2 \n";# 印出$2以及換行

print "$3 \n";# 印出$3以及換行

}

執行結果就會看到,

這些比對的樣式依序被抓取出來。

$1裡面存的就會是"God"

$2裡面存的就會是" helps " (空格也會被抓進來)

$3裡面存的就會是"those"


接下來我們來看看更精確的描述正規表示式,

我們會使用到的是定位點

透過定位點,可以表示我要找的樣式是在開頭,或是在結尾。

$string=~ /^perl/

插入符號(^)在這裡表示以這個樣式「開頭」

需要注意的是,在這裡所使用的插入符號(^)跟「字符集合」意思不同

一個表示「開頭」,一個表示「非」,可別搞混了!

$string=~ /perl$/

錢字符號($)在這裡表示以這個樣式「結尾」


再來是正規表示法的比對與替換

如果我們要把比對好的結果作替換,

寫法稍微有點不同,格式會長得像這樣:

$string=~ s/原本的樣式/替換的樣式/

利用三個反斜線夾住要比對以及替換的樣式,

並且在前面加上一個 s 表示 substitute (替換)。

後面一樣可以加上一些修飾字元,像是上面提到的忽略大小寫(i)等等。

我們直接看例子:

$string = "我不喜歡吃苦瓜,我還是不喜歡吃苦瓜。";# 給予一段字串 並存到變數裡

$string =~ s/苦瓜/鹹蛋/gi; # 把苦瓜替換成鹹蛋 全部都換(g)並忽略大小寫(i)

print "$string";# 印出$string

執行結果可以看到所有的苦瓜,都被換成了鹹蛋!


最後是正規表示所用到的萬用字元(.)問題,

Perl的正規表示是貪多比對

即是Perl預設會去找到符合需求的「最大集合」。

用例子看會比較清楚:

$string = "我不喜歡吃苦瓜,我還是不喜歡吃苦瓜,我真的不喜歡吃苦瓜。";

if ($string =~ /我不喜歡(.*)苦瓜/)# 取得夾在 我不喜歡 以及 苦瓜 之中的樣式

{

print "$1 \n";# 印出$1以及換行

}

執行以後會發現,

我們原本希望只抓到"吃",這一個字,

但Perl的預設就是找到「最大集合」,

這就是所謂的貪多比對

如果要避開這個問題,我們會在比對的量詞後面,加上問號(?)來表示不貪多

因此我們把上面的式子改寫成為:

$string = "我不喜歡吃苦瓜,我還是不喜歡吃苦瓜,我真的不喜歡吃苦瓜。";

if ($string =~ /我不喜歡(.*?)苦瓜/)# 用問號表示不貪多比對

{

print "$1 \n";# 印出$1以及換行

}

如此一來,執行結果就會符合我們的期待


正規表示式就到這邊結束,接下來要回到控制敘述的迴圈操作

2011年11月8日 星期二

副常式(Subroutine)

副常式(Subroutine)

副常式。很多時候我們常為了處理類似的工作時,重複寫些相同的程式碼,

這個時候,我們就必須藉由副常式(Subroutine)來保存一個可以重複使用的區塊,

以便未來遇到同樣的問題時,可以不用再重新寫一次相似的程式碼。

在Perl中,我們使用sub表示我要宣告一個副常式,

之後再賦予這個副常式的名字,如:sub name {......}

寫好副常式後,使用的方式也很簡單,我們用and符號(&)表示我要使用副常式。

一樣我們直接看例子:

sub squre # 宣告一個副常式 叫做squre

{

$number = $number**2; # 把原本的變數平方後 取代原本的$number

print $number; # 印出最後的$number

}

$number = 4; # 設$number為4

&squre; # 執行名為squre的副常式

來解釋一下上面的程式碼。程式在跑的時候都是由上往下,

第一行的sub,把要做的事情都包起來了,

因為沒有and符號(&),所以程式不會去執行sub裡面的運算,

一直到$number = 4;這行

程式才開始設定一個變數為4,而再下一行

&squre;

程式看到and符號(&),表示要執行名為squre的副常式,

才會回過頭去執行副常式內的運算,

在這裡,因為我們已經宣告了變數,才去執行副常式內的運算,

所以不會出現變數尚未定義的問題。

因此,最後的執行結果會為 16


知道如何簡易的定義以及使用副常式以後,

接下來我們來講副常式中,參數的傳遞。

直接從例子看會比較清楚:

sub hello # 宣告一個副常式 叫做hello

{

print "hello, @_"; # 印出hello以及傳進來的參數

}

$name = "阿逸"; # 設$name為阿逸

&hello($name); # 執行名為hello的副常式 並且傳遞參數$name進去

一樣我們來解釋這段程式碼,

因為我們在執行副常式的時候,把一個參數傳進去(變數$name),

因此在副常式中會有一個預設的陣列(@_)來接這個參數,

既然預設是陣列,也就代表可以丟不只一個參數,

所以如果寫成:

sub hello # 宣告一個副常式 叫做hello

{

print "hello, @_\n"; # 印出hello以及全部傳進來的參數 換行

print "hello, $_[0] $_[1]\n"; # 當成陣列[元素]來處理也可以

}

$name1 = "阿逸"; # 設$name1為阿逸

$name2 = "阿信"; # 設$name2為阿信

&hello($name1, $name2); # 執行名為hello的副常式 並且傳遞參數$name1及$name2進去

這麼做也是可以執行的。


知道如何傳遞參數給副常式後,

大多數情況下,除了參數,我們也希望能夠從副常式中,

取得經過運算後的結果,也就是副常式的回傳值。

這時候我們會用到的保留字就是return

表示我要把某一個值帶出副常式(也就是回傳出去),

一樣我們用例子來解釋:

sub squre # 宣告一個副常式 叫做squre

{

$number_sub = $_[0]**2; # 把傳進來的參數$number取平方 取代$number_sub

return $number_sub; # 把$number_sub這個值 傳出去

}

$number = 4; # 設$number為4

$squre_number = &squre($number); # 執行副常式並且傳遞參數進去

# 再用$squre_number接副常式的回傳值

print $squre_number; # 印出$squre_number

執行結果就會是 16


以上就是簡單的副常式傳遞參數、回傳值的使用,

當程式越寫越複雜的時候,將很多類似的功能都寫成副常式,

可以大量減少重複coding類似程式碼的時間,

不過一旦你的副常式大量被重複使用時,要記得考慮參數傳遞、傳出的順序問題,

避免其他使用相同副常式的程式,因為傳遞順序更動而造成運算錯誤,

在這裡就不討論到這部分啦!

接下來,就要講Perl最大的利器之一,

Perl的正規表示式(Regular Expressions)。

2011年11月5日 星期六

專為PTT使用者所打造的 - PCMAN + BBI

不知道各位有沒有遇過這樣的狀況?

有時候我們在PTT(台大BBS站)上,

看到很棒的文章,想要分享給朋友們,

但常常因為對方不會使用PTT而無法分享。

而這款 PCMAN + BBI 的小軟體,

增加了不少方便的功能,馬上來看看吧!


軟體名稱: PCMAN + BBI

軟體網址: http://bbi.com.tw/bbs-download.html

軟體功能

1. 保留原有的PCMAN功能

2. 自動登入PTT帳號

3. 分享PTT文章至Facebook、plurk、Google+

4. 製作PTT網址

5. 每日精選文章

6. 熱門看板連結

7. 搜尋PTT熱門看板文章

馬上就來看看有什麼不同吧!


目前可以下載的版本有,正式版跟免安裝版,

阿逸這篇是以正式版來跟大家分享。

安裝好的PCMAN+BBI 一開啟後,會顯示BBI開頭畫面,

可以看到各大熱門看板當紅的文章,都可以用滑鼠操作

不過,因為還沒有登入的關係,會要求你先輸入帳號密碼,

輸入完後,會自動幫你連結到,你所點選的那篇文章中,

而操作方式跟以往在PCMAN下操作完全相同。


當你看到喜歡的文章,想要分享給其他人觀看的話,

進入該篇文章後,按下右上角的「存」字圖案,

便會開始儲存文章,

儲存完後,會出現網頁版的畫面,

此時你可以注意到,多了幾個按鈕,

分別是Facebook的like鍵、噗浪的圖型按鈕、以及Google+的+1鍵。

點選Facebook的like鍵後,文章會被分享在Facebook中,

不會使用BBS的人,也可以透過滑鼠瀏覽你分享的文章!

真的很方便呢!

而另一項「製作PTT網址」,則僅適用於有安裝PCMAN+BBI的使用者

所以在這邊就不細談了,

有興趣操作的人,歡迎到開發者的網站,

參考這篇:產生PTT網址教學


2011年11月3日 星期四

逃離推銷的好幫手! - 來電救救我 (iPhone)

不知道各位有沒有被推銷人員纏上的經驗?

阿逸自己很不喜歡走在路上就一直被纏著填寫問券,

如果各位也是,那這款APP絕對不能錯過!


來介紹這款APP吧!

這是一支可以製造假來電的手機程式 - 來電救救我

在你被推銷員纏上的時候,可以順利逃離現場!

因為是中文介面,相信各位可以輕鬆上手!

開啟程式時,點選「來電救救我」的按鈕就可以進入設定畫面。

接著,這就是這程式有趣的地方,你可以自由輸入假來電的解救者人名、電話

如果想逃離的場合都是熟人,那也沒關係,點選解救者旁邊資料夾,可以開啟通訊錄,

程式自動會幫你把通訊錄的電話號碼跟人名抓出來。

更好玩的是,注意到號碼旁邊的小框框了嗎!

沒錯!可以從手機圖庫裡選一張照片,當作來電大頭貼!

設定好後,就可以開始設定多久後要拯救你啦!

五、四、三、二、一。 時間到!

哇嗚!還真的是有模有樣呢!

(以上圖片取自:一克拉的夢想 設計師 阿信)

按下「接聽」後,也還真的可以聽到語音呢!

不過當然,畢竟這是應用程式,別忘了把應用程式的聲音調大喔!

不然就不像是對話的感覺了!

如果你不喜歡內建的語音,當然也有提供自行錄製的功能,

請解救者本人幫你錄製一段,就更逼真啦!

美中不足的是,無法自訂來電鈴聲,期望之後的改版可以增加!

當推銷人員出現在不遠處時,或是處在尷尬的場合,

知道該怎麼裝忙了吧!哈哈!


2011年10月30日 星期日

讓桌面變的跟iPad 一樣! - iPadian

剛剛才從網路上看到這一個很有趣的軟體,

軟體名稱iPadian (下載來源為官方網站http://ipadian.weebly.com/)

iPadian 是一套免費軟體,支援Windows XP/Vista/Win7 上的iPad模擬器,

你可以想像成是「把電腦桌面iPad化來使用」,

可以透過它來上網聊天、收發Mail、逛逛Facebook等等,

甚至是大家耳熟能詳的Angry birds 、 monopoly 等遊戲都有呢! (不過是山寨版的)

因為看到還沒有人出來當白老鼠,阿逸就先下載來測試啦!


下載好的iPadian.zip 解壓縮後,直接點選iPadian.exe 就會開起下面這個介面。

當然,如果不喜歡這樣的介面,也可以選下方圖示的Setting進行設定,

看是要更改桌布、還是要設定密碼什麼的都可以。

還有「eBooks」,介面不僅跟iBooks一樣,眼尖的人應該會注意到,

連原本的iBooks文字都忘了改過來呢! XD

而一些線上繪圖軟體、相片處理工具也都有整合在裡面。

最後這個不得不提一下,這軟體居然有「App Store」!

不過,這裡的「App Store」跟Apple提供的可不一樣,

在iPadian裡,「App Store」裡面整合的是一些免費的小工具、

或是一些免費線上服務或是雲端應用程式等等。

iPadian目前的版本仍有些流暢度的問題,

不過好奇的各位可以下載來嚐鮮看看!

用iPhone隨時隨地更新Blogger

隨著智慧型手機普及,部落格不再只是一定要有電腦才能更新。

Google也隨這波潮流,推出的iPhone版Blogger應用程式

讓很多部落客們可以隨時隨地分享文章。

這款Blogger是免費的應用程式,

適用於iPhone和iPod touch,也可在 iPad上開啟。


不僅僅是發表文章,同樣也可以透過文章列表來進行文章編修。


對於不少常常外出的部落客而言(尤其是美食類),

吃完飯後的休息時間,可以馬上把熱騰騰的心得文章分享出去!

2011年10月27日 星期四

雜湊(Hash)

雜湊(Hash)

雜湊(Hash),你可以想像是兩個物品,彼此之間是有繩子綁住,

當我取得其中一個時,另一個也會被我取下。

而在這裡,Hash所扮演的角色就是連接兩物品的那條繩子。

換句話說,因為有繩子的關係,所以不管資料多麼凌亂,

一旦取得一筆資料,與他相連的資料也會被找到,這就是Hash的功用。

Perl敘述用百分比符號(%)表示雜湊,後面要賦予這個雜湊的名稱,並且要以英文開頭,

可以再給予英文以及數字,像是%a%a11%aaa1

同樣要注意,大寫、小寫視為不同雜湊,別搞混了!


接著來用阿逸自己的方式,解釋Hash所綁住的這兩個東西吧!

Hash綁住的兩樣東西,分別叫做 鍵(key) 以及 值(value)

鍵(key)跟值(value)都可以任意放入你想放的東西,比方說,

都可以放入字串、數字、變數(Scalar)甚至是陣列(Array),或是再放雜湊(Hash)進去,都可以!

其中,放入陣列(Array)或是放入雜湊(Hash)都是比較高階的用法了,

這裡就不提這兩個,有興趣的人,可以試著用這些關鍵字找看看,

(像是 Hash of Hash、Hash of Array、Array of Array 等)


Hash的使用方式,整個Hash用%表示(跟整個陣列用@表示一樣)。

取值也跟陣列很像,陣列:陣列名稱換成變數,加上中括號[]表示位置。如 $array[0]

而雜湊則是:雜湊名稱換成變數,加上大括號{}表示鍵(key)。如 $hash{key}

用一個簡單的例子來說明怎麼使用吧!

my %Hash;# 宣告一個Hash

$Hash{'阿信'}= '主唱'; # 鍵(key)設為阿信 值(value)設為主唱

$Hash{'怪獸'}= '吉他手'; # ...

$Hash{'石頭'}= '吉他手'; # ...

$Hash{'冠佑'}= '鼓手'; # ...

$Hash{'瑪莎'}= '貝斯手'; #...

print "請輸入五月天的成員:"; # 先印出一段文字給使用者看

my $name = <STDIN>; # 等待使用者輸入 並且將字串存到變數裡

chomp $name; # 把使用者輸入的字串做chomp 把多餘的Enter拿掉 (因為輸入後 會按Enter)

print "$name 是 $Hash{$name}"; # 印出鍵(Key) 以及 值(value)

執行結果就會是:

有趣吧!值得注意的是,在Hash裡,

值(value)是允許有重複的(如上圖有兩個吉他手),而鍵(key)則不允許。


從上面的程式碼,我們可以知道利用$Hash{'阿信'}= '主唱';的方式,

來給予一對鍵(key)、值(value)給雜湊,

當然,我們也可以像是陣列(Array)那篇有介紹過一樣,利用串列來賦予鍵值:

my %Hash = qw/阿信 主唱 怪獸 吉他手/; # 串列會依序給予鍵、值

這樣的寫法,得到的結果,會跟上面給予鍵、值方式一樣。

另一種則是利用箭號(=>)表示雜湊中,鍵跟值的相對關係。

而且在一對鍵、值的後面要加上逗號作為區隔:

my %Hash = (

阿信 => '主唱',

怪獸 => '吉他手',

);

不過當你在使用箭號進行指定時,箭號左邊的鍵(key)會被視為一個字串。


知道如何賦予鍵、值後,接下來我們來看看怎麼取出這些鍵、值。

如果我要取出全部的鍵,會使用到一個保留字 keys

表示我要取出所有鍵(keys),而取出的鍵,我們會用一個陣列(array)來存放:

my @keys = keys(%Hash); # 將所有鍵取出 存入陣列

同樣的,取出所有值(values):

my @values = values(%Hash); # 將所有值取出 存入陣列

上面兩個例子都是分別取出所有鍵、或是所有值。

而如果希望取出每一對鍵、值,則會使用each

each的作用,跟陣列裡,使用foreach取得所有元素的性質一樣。

我們拿之前的例子來看:

my %Hash;# 宣告一個Hash

$Hash{'阿信'}= '主唱'; # 鍵(key)設為阿信 值(value)設為主唱

$Hash{'怪獸'}= '吉他手'; # ...

$Hash{'石頭'}= '吉他手'; # ...

$Hash{'冠佑'}= '鼓手'; # ...

$Hash{'瑪莎'}= '貝斯手'; #...

while (my ($key, $value) = each(%Hash)) # 逐次把Hash裡的鍵、值 分別放入變數

{

print "$key 是 $value\n"; # 逐次印出每一對的鍵、值 並換行一次

}

執行結果就會是:


知道怎麼給予雜湊鍵與值後,最後我們來講雜湊的操作。

阿逸認為最重要的就是這兩個:exist以及delete

最常出現的例子就是,我要如何知道某鍵(key)到底有沒有出現過?

判別方式就是使用exist對雜湊做判定。

一樣我們直接看例子:

my %Hash;# 宣告一個Hash

$Hash{'阿信'}= '主唱'; # 鍵(key)設為阿信 值(value)設為主唱

$Hash{'怪獸'}= '吉他手'; # ...

$Hash{'石頭'}= '吉他手'; # ...

$Hash{'冠佑'}= '鼓手'; # ...

$Hash{'瑪莎'}= '貝斯手'; #...

if (exists $Hash{'阿信'})# 如果阿信存在

{

print "阿信 是 $Hash{'阿信'}"; # 印出鍵(Key) 以及 值(value)

}

而如果某一對鍵、值我們不需要了,就可以用delete移除。

使用的方式也很簡單:

delete $Hash{'士杰'};

就可以清除掉我們不需要的鍵、值。

知道雜湊的鍵、值賦予以及對雜湊的操作後,

接下來就要講副常式(Subroutine)的使用了!

2011年10月18日 星期二

批次縮圖軟體 - Picture Resizer

隨著數位相機越做越好,常常一張照片就佔2MB以上,

當要上傳到自己的部落格或是網站與人分享的時候,

就會因為檔案過大而需要改變大小。

有些人是使用photoshop來做大量縮圖,

在這裡要推薦這個免安裝軟體 - Picture Resizer 5.0 (下載連結為官方網站)


下載 PhotoResize400.exe 後,先別急著點,

檔名後面的400,表示壓縮後圖片會是400x300。

可以依據你的需求而直接將軟體重新命名

比方說,如果改為PhotoResize800.exe,

那圖片壓縮大小就會變成800x600。

如果你希望提高縮圖的品質

你可以多加個參數 H,像是 PhotoResizeH800.exe。

官方網站也有不少可以調整的參數,

這部分就讓有興趣的各位自行去網站看看了!


軟體使用方法:

把要壓縮的圖片,用滑鼠拖曳到photoResizerH800.exe上 (阿逸的參數是使用H800)

會開啟命令提示字元, 執行完成以後按Enter可以離開。

而壓縮好的檔案,會在原本的資料夾內,新增壓縮後的圖檔。


從上圖可以看到,圖片的大小不僅改變了,也同時保留了原始檔案,

不用擔心誤刪或是覆蓋原始圖檔的問題。

對於喜歡照相、分享生活的部落客們,

Picture Resizer 絕對是很方便的小程式之一!

2011年10月11日 星期二

同個網頁,別人可以開得起來,我卻不行?

同個網頁,別人可以開得起來,我卻不行?

這幾天,因為部落格開始起步,陸續遇到了點問題,

當初架站也是抱持著,錢花下去就會逼自己學東西的心態,

所以有租了主機,也買了網域,而問題就是從這裡開始。


不知道各位有沒有遇過這種狀況,有的時候,

明明同一個網頁,

有的人開起來很順,有的人完全開不起來。

撇除服務端和電腦防火牆的問題,(因為一般使用者不會去動這塊)

阿逸在學校的朋友們,都看不到這個掛在自己子網域下的部落格。

所以推測是因為學校的關係。

後來,有個資訊背景的同學建議我改DNS,

馬上就處理掉了!


把這種方式拿去搜尋,找到了這麼一篇文章:

台灣各大 ISP (網際網路服務提供者 Internet Service Provider)

都有提供 DNS 的設定參考,像中華電信 Hinet ,

就是 168.95.1.1 和 168.95.192.1 這兩個最為有名。

之所以使用這兩個,是因為有不少人說Hinet DNS 是萬用 DNS

原因是什麼我也不了解,不過能處理問題就好!

直接看怎麼設定吧!


For Windows 7 :

[開啟網路和共用中心] → 點選你目前的[連線] ( [區域連線] 或 [無線網路] )

開啟 [區域連線 狀態] → 點選 [內容]

在 [這個連線使用下列項目]

選擇 [網際網路通訊協定第4版(TCP/IPv4)] → 點選 [內容]

[慣用DNS伺服器] 改為 168.95.1.1

[其他DNS伺服器] 改為 168.95.192.1

按下確定,完成!

2011年10月10日 星期一

擁有自己個人化的facebook網址!

擁有自己個人化的facebook網址!

平常我們在使用Facebook的時候,個人檔案點下去時,

常常會看到這樣的網址

http://www.facebook.com/profile.php?id=xxxxxxxxxxxxxx (xxx代表數字)

不僅難記,一不小心輸入錯誤的話,會認錯好友呢!


而Facebook現在已經提供可以自訂網址的服務了,

首先,先在網址列輸入:

http://www.facebook.com/username

會進入自行定義網址的設定網頁,

而facebook已經幫你推薦了幾個選項,

當然,如果你不喜歡,也可以自己定義

一旦確認可以使用了,你會看到這個視窗出現,

按下確認之前,看清楚說明,內文有提到只能設定一次喔,

確認後,會出現設定完成的訊息,

完成!個人檔案那邊的連結不再是

http://www.facebook.com/profile.php?id=xxxxxxxxxxxxxx (xxx代表數字)

而變成你自己專屬的個人化網址了!

後記

網址一般而言是越短越好,不僅好記,也便於分享

不過這是2009年提供服務的,要找到短而好記的,

恐怕要多花點時間呢!

控制敘述(Control Statements)

控制敘述(Control Statements)

控制敘述。有時我們為了讓程式在執行過程中,因為需求的不同,而進行不同的運算。

這個時候,我們就必須藉由控制敘述(Control Statements)進行程式中的流程控制。

先從perl基本的流程控制開始介紹吧!

首先我們先來介紹這三個:<STDIN> if else

<STDIN>是告訴你的程式,在這裡要停一下,等待使用者輸入一段文字或是數字。

if是讓你的程式能經過小括號( )內的判斷,再執行大擴號{ }內的運算,普遍的寫法是:

if(判斷條件)

{

# 符合判斷條件的話 就會在這裡執行運算

}

而在if之後通常是緊接else,

不過如果你不希望程式,去執行不符合的條件時,else可以捨去不寫。

else是當if判斷條件不成立的時候,則執行大擴號{}內的運算。

綜合以上的這三個控制敘述,我們來看個例子吧:

$number = <STDIN> ;# 程式等待使用者輸入 並把輸入的值存到變數

if ($number > 3)# 當變數大於3時 (記住 這裡沒有使用分號)

{

print "$number這個數大於3喔!\n";# 印出訊息以及換行

}

else # 這裡就不用寫判斷條件了

{

print "$number這個數等於或是小於3喔!\n";# 印出訊息以及換行

}

執行一次吧!你會發現程式真的停下來等你輸入呢!


因為開始使用到了大括號,就需要解釋什麼是程式區塊(Block)

在perl裡,程式區塊(Block)多半指的是大括號包起來的部分

之前我們定義變數都是直接設為$a = 0; 這樣的方式,

表示這個陣列、變數、雜湊可以作為全域(Global)使用,不受區塊限制

不過,如果前面多了一個my,就表示這個陣列、變數、雜湊,

就只能執行在這個特定的區塊裡面,一旦出了區塊,

這個變數或是陣列等,就不會存在。我們稱為區域化(local)

我們用簡單的例子來說明:

$a = 0; # 設$a為0

{

my $b = $a; # $a將$b取代 也就是$b跟$a目前同樣為0

print "$b\n"; # 印出$b以及換行一次

}

print "$b\n"; # 再次印出$b以及換行一次

理論上應該會看到兩次0被印出來,不過因為my的關係,

當你使用了-w這個除錯參數,你會看到印出這樣警告訊息:

Name "main::b" used only once: possible typo at test.pl line 11.

0

Use of uninitialized value $b in concatenation (.) or string at test.pl line 11.

第一行表示$b只被使用到了一次,

第二行可以看到$b順利被印了一次,也就是0這個值,

第三行則是表示$b不見了,uninitialized value表示$b沒有被定義,

而且也會看到清楚指出錯誤在第幾行。


了解區塊以後,我們回到if和else的部分。

有的時候我們希望不只一個判斷的時候,

if ($number == 1) {......} # 當變數等於1時

if ($number == 2) {......} # 當變數等於2時

if ($number == 3) {......} # 當變數等於3時

※注意,因為單等於(=)表示取代,所以做判斷的時候,是用雙等於(==)表示相等

一旦越來越多的判斷,這樣的寫法會因而降低你的程式易讀性,

所以更簡單的方法就是使用elsif,這是else if的合併寫法。

然而,什麼時候會使用到這麼多判斷呢?

不外乎就是用來判斷使用者有沒有亂輸入一些值了,

比方說在填寫表格的時候:

if ($MayDay eq '怪獸') {......} # 字串的判定用eq(equal相等)表示

elsif ($MayDay eq '阿信') {......} # 字串的判定用eq(equal相等)表示

elsif ($MayDay eq '石頭') {......} # 字串的判定用eq(equal相等)表示

elsif ($MayDay eq '瑪莎') {......} # 字串的判定用eq(equal相等)表示

elsif ($MayDay eq '冠佑') {......} # 字串的判定用eq(equal相等)表示

else {print "當然也有$MayDay";} # 以上都沒有符合 就執行這裡


接下來要談談,控制敘述中的重複執行吧!

重複執行讓你的程式,在還沒到達某一個門檻之前,反覆進行同一個運算流程。

舉例來說:假設我希望從1加到10(1+2+3...+10),那麼10就是門檻,而持續做加法就是反覆進行同一個的運算流程。

這裡先介紹兩種迴圈 while 以及 untail

while的用法是,當判斷句為真(true)時,會執行運算;也就表示,

一旦判斷句為假(false)時,會停止運算,結束這個迴圈。

一樣我們來看例子吧,假設我今天要從1加到10(1+2+3...+10):

$number = 1; # 設$number為1

$result = 0; # 設$result為0

while ($number <= 10) # 當$number小於等於10的時候都會執行 (即 當大10時停止運算)

{

$result = $result+$number; # 把$number的值 加上$result以後取代原本(左式)的$result

$number = $number+1; # 把$number的值+1以後 取代原本(左邊)的$number

# 而 $number = $number+1 可以縮寫為 $number++

}

print $result; # 寫在迴圈之後 表示走完迴圈才會印結果

來解釋上面這段程式流程吧!

當第一次進入while判斷句的時候,因為此時$number是1,符合執行條件,就會進入執行運算{}內

右式的$result+$number是 0+1,並且會把結果取代原本的$result,經過此行,$result被替換成1。

下一行,一樣又是$number+1是 1+1,所以經過此行,$number被替換成2。

大括號{}內的計算都完成以後,會跳回while的判斷句檢查,

(記住 是回判斷句 不是回到最上面的程式碼喔!)

因為$number此時為2,判斷句依舊成立,因此會繼續執行。

第二次的迴圈,$result被替換成3,$number被替換成2,繼續回到判斷句。

......

......

因此最後的執行結果$result會是55

untail的用法跟while用法一樣,

差別只在於判斷句,while(條件為真){執行}、untail(條件為假){執行}。


接下來介紹for以及foreach這兩個迴圈,

foreach是專門給陣列用的,在陣列(Array)那篇有介紹過。

在這裡我們就講for迴圈吧!

在perl敘述裡,for的使用上常常被簡化,我們還是從最傳統的方式來說明,

for的使用方法是:for(起始;條件;間隔){執行運算}

小括號裡面可以想像有一個變數正在當計數器使用。

來看看例子吧!

print "庭院";

for ($i=0;$i<3;$i=$i+1) # 而 $i = $i+1 可以縮寫為 $i++

{ # $i會先從0開始 每跑完一次就會累加1

print "深"; # 所以當$i為0、1、2都會執行(3就不符合小於條件)

}

print "幾許\n"; # 迴圈走完以後再print這行

執行結果就會是字串 庭院深深深幾許


接下來是我覺得很初學者很容易卡住的部分 - 雜湊(Hash)