Showing posts with label perl. Show all posts
Showing posts with label perl. Show all posts

Sunday, May 17, 2009

Beginning with module (cont.)

use Some::Package

will tell Perl to search for module Package in Some/Package.pm

but

@ISA = ("Some::Package")

will not direct Perl correctly to the tree Some/Package.pm

why???? and how to tell Perl that we WANT Some/Package.pm, not Some::Package ???

Beginning with module



All the books and forum about Perl Modules converge in saying this:

when you

use Some::Package;

Perl will look for Package.pm in directory tree ./Some/Package.pm

Sure, but...

The important thing that almost nobody has remembered to refer that, in the Package.pm, the first line must be

package Some::Package;

not

package Package;

if the package is not specified like that, you will undoubtedly receive error message saying that

"can't locate object method via package Some::Package ... perhaps you forgot to load Some::Package at use_some_package.pl line xx"

And here's the example

Tuesday, August 5, 2008

[Chapter 20] Web automation - Perl cookbook

20.1 Truy xuất một URL từ một perl script

Vấn đề
Dùng một script để truy xuất đến một url

Giải pháp
Sử dụng hàm get từ module LWP::Simple.
use LWP::Simple$content = get($url)

Thảo luận
Hàm get trong LWP::SImple trả về undef nếu có lỗi, nên ta có thể kiểm tra lỗi như sau:

use LWP::Simple;
unless (defined ($content = get $url) ) {
die "could not get $url\n";
}

Tuy nhiên, với cách trên, ta không thể xác định được nguyên nhân gây lỗi. Để có được khả năng này cũng như một số xử lý tinh tế hơn, chúng ta cần dùng các module khác.Ví dụ 20.1 là một chương trình truy xuất một tài liệu từ xa. Nếu thất bại, chương trình sẽ xuất ra dòng trạng thái lỗi, ngược lại xuất ra tiêu đề của tài liệu và số byte có trong nội dung. Ở đây chúng ta sử dụng 3 module từ LWP và 1 module khác.

LWP::UserAgent
Module này tạo ra một trình duyệt ảo. Đối tượng trả về từ hàm new được dùng để tạo một request thực. Tên của trạm trình duyệt ảo được đặt là "Schimozilla/v9.14 Platinum" để webmaster thấy ganh tị khi họ kiểm tra file log. :))

HTTP::Request
Là đối tượng được trả về khi trạm người dùng (user agent) chạy request. Dùng để kiểm tra nội dung và lỗi.

URI::Heuristic
Module tí hon này sử dụng thuật toán đoán theo kiểu Netscape để mở rộng các URL chưa hoàn chỉnh. Ví dụ:
Đơn giản Đoán
perl http://www.perl.com/
www.oreilly.com http://www.oreilly.com/
ftp.funet.fi ftp://ftp.funet.fi/
/etc/passwd file:/etc/passwd

Mặc dù những địa chỉ này không phải là những url hợp lệ, Netscape cố đoán url chính xác của chúng. Hầu hết các browser khác cũng làm tương tự.
Source

#!usr/bin/perl# titlebytes - tim tieu de va kich thuoc cua tai lieu
use warnings;
use LWP:::UserAgent;

use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;
my $raw_url = shift or die "usage: $0 url\n";

my $url = URI::Heuristic::uf_urlstr($raw_url);
$ = 1; # flush dòng kế tiếp

printf "%s =>\n\t", $url;

my $ua = LWP::UserAgent->new();
$ua->agent("Schmozilla/v9.14 Platinum"); # đợi đi, thế nào cũng có
my $req = HTTP::Request->new(GET => $url);$req->referer("http://wizard.yellowbrick.oz"); # tung hoả mù cho các chương trình phân tích log
my $response = $ua->request($req);

if ( $response->is_error() ) {
printf " %\n", $response->status_line;
} else {
my $count;
my $byte;
my $content = $response->content();
$bytes = length $content;
$count = ($content =~ tr/\n/\n/);
printf "%s (%d lines,%d bytes)\n", $response->title(), $count, $byte;
}

Khi chạy, chương trình sẽ cho ra kết quả như sau:

% titlebytes http://www.tpj.com/

http://www.tpj.com/ =>
The Perl Journal (109 lines, 4530 bytes)

Xem thêm

Tài liệu CPAN về LWP::Simple, trang hướng dẫn của lwpcook đi kèm với LWP; tài liệu của các module LWP::UserAgent, HTTP::Request, HTTP::REsponse, URI::Heuristic, công thức 20.2.

[Chapter 20] Web automation - Perl cookbook

20.0 Giới thiệu

Chương này tiếp cận Web từ một hướng khác so với chương 19 (CGI programing): thay vì trả lời một yêu cầu từ trình duyệt, ở đây chúng ta giả làm một trình duyệt, phát sinh yêu cầu và xử lý kết quả trả về. Vì các giao thức mạng và các định dạng tài liệu rất phức tạp, chúng ta sẽ tận dụng các module sẵn có để đơn giản hoá quá trình này và có thể tập trung vào chương trình của mình.

Những module thích hợp có thể tìm thấy tại http://www.perl.com/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/

Có những module dùng để kết toán thẻ tín dụng, tương tác với Netscape hay API của server Apache, xử lý bản đồ hình ảnh, kiểm tra tính hợp lệ của HTML, thao tác MIME. Những module lớn nhất và quan trọng nhất đối với chương này được tìm thấy trong bộ module libwww-perl, gọi tắt là LWP. Sau đây là một số module được tích hợp trong LWP:

Các module HTTP và LWP cho phép thực hiện một yêu cầu tài liệu từ một server. Cụ thể, module LWP::Simple cung cấp một cách thức dơn giản đế lấy về một tài liệu. Tuy nhiên , module này không có khả năng truy xuất đến từng thành phần riêng biệt của một trả lời http. Để có thể truy xuất các thành phần này, cần dùng đến TTP::Request, HTTP::Response và LWP::UserAgent.








ModuleMục đích
LWP::UserAgentwww user agent class
LWP::RobotUAPhát triển các ứng dụng robot
LWP::Protocolgiao tiếp với các kiểu giao thức khác nhau
LWP::Authen::BasicXử lý các trả lời 401 và 407
LWP::MEdiaTypescấu hình các kiểu MIME (text/html, ...)
LWP::Debugdebug logging module
LWP::Simplegiao tiếp với các giao thức đơn giản cho các hàm chung
HTTP::Headerscác dạng header MIME/RFC822
HTTP::Messagemessage dạng HTTP
HTTP::RequestHTTP request
HTTP::ResponseHTTP response
HTTP::Deamon1 lớp HTTP server
HTTP::Statusmã status HTTP
HTTP::Datelấy ngày từ định dạng ngày http
HTTP::NegotiateHTTP content negotiation calculation
HTTP::RobotRulesđọc các file robot.txt
File::Listingđọc danh sách liệt kê thư mục


Liên hệ chặt chẽ với LWP nhưng không được phát hành chung với LWP là các module HTML. Các module này cho phép diễn dịch tài liệu HTML. Chúng cung cấp nền tảng cho các recipe được giới thiệu trong phần 20.5, 20.4, 20.3 và 20.7

Recipe 20.12 đưa ra một rehular expression để giải mã các trường trong file log của web server và trình bày cách diễn dịch các trường này. Regular expression này được sử dụng cùng với module Logfile::Apache trong recipe 20.13 để trình bày hai cách tóm lược dữ liệu trong log file của web server.