2012年5月12日 星期六

Perl的模組應用 - WWW::Mechanize

WWW::Mechanize 是Perl裡很代表性的一個模組,
我們稱它為網頁代理人,它可以幫你做瀏覽網頁的動作,
包含:點擊連結、帳號密碼登入、擷取所需資訊等等。
因為是針對網頁做處理,所以建議各位要有一點HTML的觀念才容易理解
在這裡先我們用簡單的例子來說明:
首先,我想先到google的首頁去,並且輸入CPAN下去尋找。



因此我們必須讓程式知道,要在搜尋欄位打上關鍵字,並且按下搜尋按鈕
每個欄位都會有自己的name值,我們可以透過右鍵→檢視原始碼來得知,


很暈對吧!事實上,很多瀏覽器提供的plugin(附加元件)
都可以讓原始碼排的很整齊,讓大家更容易瀏覽,
在這裡要推薦一個好東西,火狐(FireFox)上的一個plugin:Firebug
Firebug可以把CSS、HTML等各自分開,讓使用者更容易閱讀原始碼。


因此我們可以看到,google上的搜尋欄位名稱是q (name="q"),
先做到這裡為止,我們來看程式碼:
 
use WWW::Mechanize; # 表示我要使用這模組
my $agent = WWW::Mechanize->new();# 建立一個新物件 $agent
$agent -> get("http://www.google.com.tw/"); # 讓$agent連到網頁
$agent -> field("q","CPAN"); # 在名為q的欄位填上CPAN
$agent -> click_button(number => 1); # 點選第一個按鈕 也就是搜尋
 
這樣就完成很簡單的,進到網站、填寫資料、送出。
接著,我們希望程式繼續往下探索網頁,



點選了超連結後,會進入CPAN網站中,搜尋的分頁。


因為我們已經讓程式點選搜尋按鈕了,
所以剩餘的程式碼為:
$agent -> follow_link(n => 29); # 點選第29個超連結
my $content = $agent ->{content}; # 把整個內容都取下 存在變數
open HTML, ">Agent.html"; # 開啟一個新檔案
print HTML $content; # 把$content存放的值都存進新檔案
 
這裡的例子,是把所有資訊都存到$content
表示說,如果有必要,可以再利用正規表示,
$content裡,感興趣的東西留下。
 
事實上到這步,已經算是有實質功能了,
不少灌票程式都是利用這模組稍作修改
只是把填寫的欄位變多一點(ex: 帳號、密碼),後續就一樣是,
點第幾個連結、到第幾個頁面、投票給哪位候選人等等。
 
最後,這模組其實能使用的功能很多,絕對不只上面範例中所使用的,
有興趣想深入研究的,CPAN網站上的WWW::Mechanize
有很詳細的介紹。


2012年3月26日 星期一

Perl模組(module)的使用

Perl模組(module)的使用

之前提過,副常式(Subroutine)可以增加程式的重用性,

我們把會重複使用的函式寫進副常式中。

但如果又寫了另外一支程式,同樣要用這些函式呢?

大多數情況,我們會直接把原本的副常式也直接複製進來使用,

但這樣的使用方式,會有一個問題,

萬一往後發現了這個函式有錯誤

那勢必是要把所有用過該函式的程式,全部改過。

因此,讓某些程式需要用到同一個函式時,都使用同一個模組(module),

如此一來,要修改函式時,只需要修改模組(module)

有使用到這模組(module)的各程式也都會同時套用到。


Perl因為擁有很豐富的模組可以自由使用,而使得Perl有一定的使用族群。

CPAN (Comprehensive Perl Archives Network)

是學Perl不可不知的網站。

CPAN上面充滿了各式各樣的模組,大部份的需求幾乎都有現成的模組,

可以用來解決你的問題。

不過,畢竟資源很多,要確切找符合到自己需求的模組,需要花點時間,

在這裡,我們先討論怎麼安裝及使用模組,

之後會陸續補上其他頁面,來解釋各模組如何使用。


安裝

如果你是跟著阿逸的方式,安裝ActivePerl的話,

那麼從[開始]→[程式]→ActivePerl的資料夾中,會有Perl Package Manager

開啟Perl Package Manager會需要點時間,它可以讓你很輕鬆地安裝你所需要的模組。

開啟後,上方可以輸入你要找的關鍵字,找到模組名稱後,

按下右鍵會顯示 Install 以及該模組名稱。


勾選後,模組的圖案會有個綠色加號,※注意 此時還不是安裝

勾選完成後,右上角有個綠色箭頭,

按下去才是真正開始安裝模組,

安裝模組會花些時間,完成後,模組的圖案會改變。

安裝的部分就到這裡,

接下來就是進入一些好用的模組實例練習了!

2012年2月19日 星期日

KEURIG 單杯式咖啡機

KEURIG 單杯式咖啡機

一直很想買一台膠囊咖啡機,

除了最近台灣某家業者的廣告打很勤外,

主要是因為膠囊使用上比較方便,

所以家裡現在多了一個新成員,KEURIG 白金咖啡機 (B70)

美國逸室購(原 美國輕鬆購) 託人代購回來。


直接來看圖片吧!

剛開始送到家裡的樣子


打開後會看到訂購所送的60杯 K-Cups (12杯/一包)


底下則是這篇的主角-咖啡機


外包裝可以看到-KEURIG 白金咖啡機 (B70)


整個保麗龍包著咖啡機外,值得注意的是右下角的灰色物品

那是另外加購的coffee filter,功能類似咖啡濾紙,

知道膠囊咖啡機怎麼運作後再來討論!


說明書圖文都寫得很清楚,第一次使用時,

要先讓水跑一次機器,作清洗的動作。

清洗結束後就可以開始使用了!


其中幾款附贈的膠囊


使用方式很簡單,把咖啡機上蓋打開後,

直接把膠囊放入,蓋上蓋子,按下運作鍵就可以。


因為是一次性使用,可以看到使用完畢的膠囊,

上下部分都會有孔洞,這些孔洞是給熱水流過的,

因此要取出膠囊時,記得小心別被燙傷了!









如果有自己喜歡的咖啡粉,

也可以利用 coffee filter (需另外加購)

把想喝的咖啡粉裝進去沖泡。

coffee filter 打開後,會看到裡面有濾網,

因為coffee filter比起膠囊來的大很多,

所以要依照說明書的方式,將放置膠囊的外殼拆解下來。

之後,把濾網裝入自己喜歡的咖啡粉,

(建議量大概是6分~7分滿)

coffee filter上蓋鎖緊後,

一樣放入機子內,按下運作鍵就可以了!


事實上,官方有超過兩百種的口味可以選擇

包含咖啡、茶、熱可可甚至是果汁(如蘋果、芒果等)

官方網站裡,蘋果、芒果的評價都很高,

這次都選咖啡,下次會帶茶跟果汁回來嚐看看!

2012年2月6日 星期一

Perl的檔案處理

Perl的檔案處理

很多朋友一定有這樣的經驗,當需要剪貼大量資料的時候,

Ctrl+C (複製) 以及 Ctrl+V (貼上) 一筆一筆剪貼,

很費時,但又想不到別的方法,

別懷疑,一有重複的動作,直覺就是用程式幫忙吧!


首先,先簡單講一下檔案存取,

在perl裡,我們要讓作業系統知道,要對哪個檔案進行處理,

需要使用到的就是檔案代號 (FileHandle)

檔案代號是由使用者自行命名,並且用來跟實體檔案進行連結的名稱,

一般來說,我們習慣用全部大寫來作為檔案代號。


現在很多資料都以Excel檔為主,阿逸處理資料上,

習慣上是先另存新檔成.txt(純文字檔)再做處理,


而檔案轉成.txt後,每個欄位都會以Tab分隔,如下圖:


接著再用程式來進行操作。(範例檔案: 點我下載)


用perl進行開檔、關檔也很直覺,只要這麼一行就可以:

open FILE, "File_sample_1.txt"; # FILE 即是使用者自行定義的檔案代號

不過阿逸習慣加上大於(>)、小於(<)符號,表示方向

有方向性的觀念會幫助你很容易記清楚檔案,

所以上面的式子可以多加入小於(<)符號,

open FILE, "; # FILE 即是使用者自行定義的檔案代號

表示我要讀取檔案。反之:

open FILE, ">File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

則表示我要寫入檔案注意:每次執行都會把原有檔案覆蓋。

如果希望不覆蓋檔案,而想把資料繼續寫進去,就要使用遠大於(>>)符號

open FILE, ">>File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

如此一來資料就會繼續加在檔案的結尾。


用幾個例子來試試看吧!首先是寫入檔案:

open FILE, ">File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

{

print FILE "Hello World!";# 表示我要印出字串到FILE所對照的檔案內

}

執行後,可以看到同路徑下,產生了一個檔案 File_sample_2.txt

點開File_sample_2.txt後,剛剛打的Hello World! 就在裡面。

同樣要記住:每次執行都會把原有檔案覆蓋。

再來試試看這個吧!

open FILE, ">>File_sample_2.txt"; # FILE 即是使用者自行定義的檔案代號

{

print FILE "Hello World!";# 表示我要印出字串到FILE所對照的檔案內

}

多執行個幾次,你會看到檔案裡面,Hello World! 多了好幾行!

最後講檔案讀取吧!

讀取檔案這部分我們多著墨來討論,

為了解說方便,請下載剛剛的範例檔案。


下載好後,把範例跟你的練習程式放在同個資料夾下。

while開檔時,檔案內容會一行一行讀取,

只有讀取資料不夠,在這裡,我們要加上一點變化!

即是把資料再作進一步的處理:

openFILE,"<File_sample_1.txt";

while($line=<FILE>)

{

# 檔案是一次讀一行進來

chomp $line; #把換行符號拿掉

@split = split ("\t",$line); #每一行以Tab字元分割 存入陣列

foreach (@split) # 對每一個陣列

{

if ($_ =~ /\D/) # 如果陣列裡面是 非數字 (\D)

{

push @array, $_; # 則放入新的陣列

}

}

}

print $array[0]; # 印出第一個處理後的陣列

執行結果會看到,保留在陣列第一個元素的即是 I

最後,把整個鎮列印出來試試看吧!

看數字是不是都消失了!

print @array; # 把每個陣列印出來


熟悉Perl的檔案處理之後,接下來就要介紹,

Perl的模組實際應用

2012年1月12日 星期四

Google AdSense 身分驗證

Google AdSense 身分驗證

有天,阿逸打開Google AdSense的首頁時,

發現出現這排紅字:

「您的款項目前暫緩支付。若要取消暫緩支付,您必須進行特定操作。」

第一時間看到真的是嚇到了,像是做了什麼虧心事一樣,哈哈!

後來查了一下,發現是達到了「身分驗證門檻」,

即是收入超過10鎂時,會由Google發出信件,

裡面包含驗證碼,確認你填寫的地址正確,

以便日後達到請款門檻時(須達到100鎂),方便把支票寄給你。


原本以為如下圖所示,3~5天就會寄到家裡,


誰知道等了一個星期仍舊沒有下文,

後來去查才知道,那是指美國本地的寄送時間,

其他國家會慢上許多,台灣約是3~4週。


這事情後來就擱著,一直到四週了,

終於收到來自美國Google的信呢!

(正面)

(背面)

可以看到是從美國Google寄過來的呢!

(內文)

而且內文是繁體中文!

個人隱私的部分,就原諒我把它海苔了 (?)


因為很多新手部落客都問過類似問題,

的確很多人超過一、兩週沒收到信,

就擔心是不是遺失了,(阿逸自己也是 Orz)

阿逸自己收到的時間是一個月後!

沒收到的各部落客,可以稍微等一下。