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)

2011年10月6日 星期四

如何在個人網站加入Facebook留言板(Comments Box)

如何在個人網站加入Facebook留言板(Comments Box)

Facebook,相信大家再熟不過了,這幾年迅速爆紅的社群網站,

透過簡單的操作介面,讓用戶可以在短時間了解並分享各式各樣訊息,

隨著使用人數上升,Facebook也推出了Facebook connect,

可以讓外部網站利用Facebook帳號來進行各種程式應用。

我個人認為這功能最大的優點就是,因為需要帳號,

所以可以避免不少留言機器人把你的網頁弄得亂七八糟。

不過,這功能只適用於自己架站的使用者,如果你是使用無名小站(wrecth.cc)、Pixnet等,

這些部落格服務的話,恐怕沒辦法適用。


來看看怎麼使用吧:

首先,先連到 Facebook 的 Social Plugins

裡面會有很多讓Facebook連到外部網站的網路工具,

在這裡,我們選擇Comments(留言板)來崁入我們的個人網站中。



再來,把要填寫的訊息填入表格中,


取得程式碼後,全部複製,貼到你個人網頁中要放的位置就可以了。

如果你希望以中文顯示,也可以這麼做:

這樣就完成了!

陣列(Array)

陣列(Array)

陣列,你可以想像是多個存放空間,

可以用來存放變數。當然,同樣地,也可以存放數字、文字、甚至特殊符號。

Perl敘述用小老鼠符號(@)表示陣列,後面要賦予這個陣列的名稱,並且要以英文開頭,

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

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


而正如上面說的,陣列是多個存放空間。那要如何分辨順序或是編號呢?

表示的方法就是: 陣列名稱換成 變數[位置] 即是:

$array[0] = 123;

注意到哪裡不一樣了嗎?對,就是陣列怎麼成變數了?

只要記得,我們用@array代表整個數列,例如:

@array = () ; # 表示我要清空整個陣列

而當我要指定位置的時候,則把陣列換成變數,以及位置(名稱不變)。即是:

$array[0] = 123; # 表示我要指定陣列第一個位置是數字123

這裡有個地方要注意,陣列位置的順序是從0開始,別忘了喔!


因此,我們可以馬上猜到一個觀念,即是怎麼按照順序把東西放到陣列裡:

$array[0] = 123; # 表示我要指定陣列第一個位置是數字123

$array[1] = 456; # 表示我要指定陣列第二個位置是數字456

$array[2] = 789; # 表示我要指定陣列第三個位置是數字789

看起來的確整齊,而且又不需要分一大堆變數來存。

當然,如果你不想這麼麻煩,你也可以當作串列來處理:

@array = qw/123 456 789/; #其中 qw/123 456 789/ 就是串列

結果會跟上面的一樣。


再來,如果我想加入一個新的值,該怎麼做?

或是,如果我想移除一個舊的值,該怎麼做?

簡單的方法是使用push 以及 pop,這兩個保留字都是對陣列的最後一個元素做操作。

我們直接看例子:

@array = qw/123 456 789/; #設一個陣列 內有3個值

push @array, 135; # 把新值"推"到@array裡

print "$array[0]\n"; # 印出$array[0]以及換行一次

print "$array[1]\n"; # 印出$array[1]以及換行一次

print "$array[2]\n"; # 印出$array[2]以及換行一次

print "$array[3]\n"; # 印出$array[3]以及換行一次

執行結果可以看到,新加入的值被放到[3]的位置,也就是印出 135

而如果是pop,使用的方式也很直覺,指定說我要移除哪一個陣列就好:

@array = qw/123 456 789/; # 設一個陣列 內有3個值

pop @array; # 把@array裡的最後一個值拿掉 記住 是要指定陣列 而不是位置

透過上面兩行,這樣就把@array裡面的最後一個值拿掉了。


不過既然使用了陣列(Array),就不得不提索引值(index)了。

陣列的索引值,指的就是前面所講的存放位置。

判別一個陣列最後一個索引,有個好用的方法,就是錢號井號($#)

一樣直接看例子:

@array = qw/123 456 789/; #設一個陣列 內有3個值

print $#array; # 印出@array的最後一個索引值

執行結果就會是 2 ,即是$array[2] 這個中括號裡面的2。

透過這樣的方式,我們回去上面驗證剛剛pop的程式,

@array = qw/123 456 789/; # 設一個陣列 內有3個值

print "$#array\n"; # 印出@array索引以及換行一次(會印出2)

pop @array;# 把@array裡的最後一個值拿掉

print "$#array\n"; # 印出@array索引以及換行一次(會印出1)

執行結果可以看到,透過pop,陣列的最後一個索引值被拿掉了。

當然,也可以從最前面加入,使用的保留字就是shift以及unshift

使用方法跟pop以及push一樣。shift是移除第一個,unshift是從最前面補上。


接下來,我們來看看可以利用陣列(Array)來完成什麼事情吧!

常用的有sortjoin等等,先來看看sort吧!

sort字面上的意思就是排序,當我希望陣列裡面所有的值由小到大排序時,

sort可以幫助我們達到這個目的,直接看例子吧!

@array = qw/5 -7 3 -2 9 -8 4/; #指定一個串列給陣列 @array

@array_sorted = sort @array; # 將排序過的@array存到@array_sorted

foreach $temp (@array_sorted) # foreach是針對陣列用的迴圈,

# 每一次都會讀取出一個值放到變數$temp裡

{

print "$temp\n";# 跑一次迴圈就印出一次$temp及換行

}

執行結果就會是

注意到了嗎?sort 只會對數字大小作排序,

如果有負號的時候,如果只用sort是不夠的,

因此,我們進行複雜一點的排序,會使用比較特殊的用法

像是這樣:

@array = qw/5 -7 3 -2 9 -8 4/; # 指定一個串列給陣列 @array

@array_sorted = sort { $a <=> $b}@array; # 將排序過的@array存到@array_sorted

foreach $temp (@array_sorted) # foreach是針對陣列用的迴圈,

# 每一次都會讀取出一個值放到變數$temp裡

{

print "$temp\n";# 跑一次迴圈就印出一次$temp及換行

}

$a跟$b在這裡的用法不太一樣,這裡當作Perl的預設變數,

在排序時,被拿來作為取出的兩個數字,而<=>則是表示兩數字的比較。

很類似bubble sort(泡沫排序法)。

而執行結果,我們可以看到:

負數的問題被處裡掉了,陣列都由大到小排列


再來,看看join吧!

join是在陣列之間加入一個字串,便於分開每個陣列的值:

@array = qw/123 456 789/; # 設一個陣列 內有3個值

print join "," , @array; # 表示在陣列間加入逗號 並且印出"整個陣列"

結果就會是 123,456,789

相較於join,不得不提的就是split(分離)

比方說,我們需要把字串依照空格或是逗號做分割,存到陣列裡,

需要使用到的就是split

直接看例子:

$line = "阿逸 的 Perl 學習紀錄 網站"; # 將一列字串存入變數

@array = split(/\s/, $line); # 表示依照\s (space空白)將$line分開的字存入陣列

foreach $temp (@array_sorted) #foreach是針對陣列用的迴圈,

# 每一次都會讀取出一個值放到變數$temp裡

{

print "$temp\n";# 跑一次迴圈就印出一次$temp及換行

}

而執行結果會是:

可以看到字串依空白而分割開來,丟進陣列裡。


在上面的幾個例子中,我們看到foreach被一直使用,

foreach這類的保留字,算是一種控制敘述

控制敘述可以依照使用者需要,讓程式執行不同的運算,而這就是接下來要提到的部分了!

變數(Scalar)

變數(Scalar)

變數,你可以想像是一個存放空間,可以存放數字、文字、甚至特殊符號。

Perl跟其他語言不一樣,不用特地宣告說,這個新變數是什麼類型,

有的程式語言,你要先宣告說,這個變數存的是數字,還是其他類型。

所以Perl的變數用法上很簡單,但是自己要知道變數存的是什麼,這樣才不會出錯。

Perl敘述用錢字符號($)表示變數,後面要賦予這個變數的名稱,並且要以英文開頭,

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

要注意,大寫、小寫視為不同變數,別搞混了!

直接看例子吧!底下是程式碼:

$a = 0;

$b = 1;

print $a+$b;

執行結果就會是 1


很直覺吧!不過有個地方要注意,這是非資訊背景的人,

常常會搞不懂的地方,上面程式碼中的等號(=),要當作取代(或是覆蓋)

所以程式碼的解讀要從右邊,解釋到左邊

$b = 1; 這個敘述句,用「數字1變數$b取代」這樣的方式解讀,

這樣才不會陷入數學的邏輯裡面。

一樣,我們舉個例子:

$a = 0; # 從右邊解讀回來,變數$a被0取代(覆蓋)所以現在$a裡面的值是0

$a = $a+1; # 從右邊解讀回來,經上式,$a+1其實就是0+1,以右式會是1

# 接著,右式的1,把左邊的$a取代(覆蓋),以現在$a裡面的值是1

$a = $a+1; # 原理同上,所以現在$a裡面的值是2

print $a; # 印出 $a到螢幕上

執行結果就會是 2


上面的例子是數字部分,接下來談談字串部分,

Perl可以使用單引號(')雙引號(")來表示字串,但是使用上略有不同。

一樣,我們直接看例子:

$a = "這個變數是\t字串"; # 這裡使用雙引號

$b = '這個變數是\t字串'; # 這裡使用單引號

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

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

執行結果會是





看出差異了吧,單引號會無法使用像是\n(換行字元)和\t(跳格字元)這些特殊字元

因此在單引號中,這些字元都會被當作文字,而完整的呈現。

其他特殊字元還有:

\a 會發出嗶一聲的警示聲
\e 跳脫符號(escape)
\f 換頁
\n 換行
\s 空白字元
\t 跳格字元 (Tab)

其他的就自行搜尋囉!

Perl的變數不用宣告類別,但是會有個問題,

如果變數裡都是數字,但是我只想做字串處理怎麼辦?

只要記得,數字跟字串各有各的運算方式

像是數字用加號(+)計算,字串用點(.)連接

我們直接看例子:

$a = 0;

$b = 1;

print $a+$b; # 當作數字運算

執行結果會是 1

而換成字串的話,

$a = 0;

$b = 1;

print $a.$b; # 當作字串來處理

執行結果會是 01

透過這樣的方式,可以讓變數依照你的需要,當作數字或是字串來處理。


既然講到了運算,那就要提一下Perl的運算式,

Perl的運算跟日常生活的一樣,

一樣會進行先乘除、後加減的動作。(即是先處理乘號、除號,再處理加減)

不過,不同的是,

Perl的運算裡,沒有數學裡的中括號、大括號(有別的用途)

所以,跟工程數學計算機的操作很類似,都是用小括號把想先行計算的部分括起來,

除了這些簡單的數學運算符號以外,

還有一些比較特別的,而你可能必須要記下來的符號,像是:

++  --       分別代表 遞增、遞減 (因此 $a++相當於 $a=$a+1)
% 求餘數
&& AND邏輯;即是"並且"的意思 (兩條件都要成立)
|| OR邏輯;即是"或"的意思 (任一條件成立即可)

更多的符號我們以後用到時,阿逸會再做解釋。

如何執行perl

執行perl

對,你沒看錯,就是執行!

這應該是很多跟Perl有關的網頁,不會寫上去的東西,

當你沒有程式背景時,架好環境後,寫了點程式碼,會驚覺「咦?要怎麼執行啊?」

真的會有這樣的情況,阿逸本身就是一個例子... Orz

不過還好,之後發現其他人也問過同樣的問題,自然鬆了一口氣。 (喂)

首先,先把下面這段程式碼貼到你的編輯器裡,注意,分號一定要一起複製!

print "Hello Perl\n";

記得,編輯器裡,要把選擇程式語言選擇P -> Perl,再把檔案檔案另存到你要的資料夾內,

假設我存在桌面,那接下來要開啟命令提示字元

可以在[開始] -> 執行 -> 輸入cmd 可開啟命令提示字元

或是 [開始] -> 所有程式(或程式集) -> 附屬應用程式 -> 點選命令提示字元

接下來就要指定路徑,所使用的指令是 cd (目錄交換) 加上 目錄的絕對路徑

即是 cd C:\User\I-Fan\Desktop

※ I-Fan 是使用者名稱,會因為你自己所設定的使用者而有所不同。

會看到目錄已經交換到桌面了!

再來,就是執行perl,

方法很簡單,輸入 perl 加上 檔案名稱(連同副檔名) 就可以了,

不過,建議你在中間加上 -w 這個參數,

-w 可以幫助除錯,一旦程式寫錯了,或是邏輯有問題,

會出現一些錯誤訊息,或是提示訊息,

讓你可以藉由這些警告,修正你的程式。

這就是剛剛的程式碼,執行後跑出來的結果。


寫程式有幾件事情要強調,

在Perl的敘述句裡,是用分號(;)表示結束,這意味著,空白跟段行並不會影響敘述句,

直接看例子,剛剛上面示範的程式碼,改寫成為:

print "Hello Perl\n" ;

或是

print
"Hello Perl\n
"
;

執行都會得到同樣的結果。

適時的空白或是段行,可以增加瀏覽的便利性,但切記別濫用!


再來是註解,Perl裡是使用井字號(#)

在執行的時候,註解的部分不會被程式讀取,

所以可以寫上自己的筆記,方便以後回來看程式碼的時候,

可以很快的知道這部分在做什麼。

我們來看看例子:

print "Hello Perl\n"; # 印出 Hello Perl 以及換行

執行結果一樣會是跟最上面的示範一樣,

但是註解不會被印出來。

※ 小技巧: 有時候要註解的行數很多,如果你使用的編輯器是Notepad++

可以把你要註解的所有行,全部用滑鼠反白框起來按下Ctrl+Q 就可以區塊註解

安裝Notepad++

安裝Notepad++

安裝好perl以後,阿逸原本都是在記事本撰寫好程式碼以後,再執行perl。

這樣做其實也沒什麼不好,但是如果使用編輯器,會讓自己在瀏覽的時候特別方便,

阿逸也是透過同學的建議,開始使用Notepad++

好處在哪?直接看比較圖就知道原因了:




上面這張是使用Nodepad++建立檔案,選擇好你要編輯的程式語言,在這裡我們選擇Perl(從上方標籤的程式語言選擇),會看到文字被上了顏色,藍色代表是系統保留字,是有特殊的功能在。



下面這張則是直接在記事本做編輯,可以看到,不同於使用Notepad++ ,程式碼並沒有上色。

一旦程式碼越寫越長的時候,自己在瀏覽上會很不方便。



比較下來,就可以知道為什麼阿逸建議要安裝這類型的程式碼編輯器了吧!

環境都架好,接下來要開始自己練習寫一段小小的程式,並且順利執行

安裝Perl

安裝Perl

目前Windows上的Perl是以Active Perl這家公司所提供的直譯器為主。

連結到網頁後,右邊選單,點選Free Downloads (免費下載)

選擇適合你作業系統的版本,下載msi檔案來進行安裝。

而筆者所安裝的版本為ActivePerl 5.12.2。

安裝完成後,先確定是否安裝成功,

可以在[開始] -> 執行 -> 輸入cmd 可開啟命令提示字元

或是 [開始] -> 所有程式(或程式集) -> 附屬應用程式 -> 點選命令提示字元

輸入 perl -v 按下enter鍵,可以看到如下圖,Perl的版本說明、以及著作者等訊息

如果有看到這面這樣的訊息,恭喜,安裝完成囉!

接下來要可以開始學著怎麼使用編輯器來撰寫自己的程式了!