7-1 ��������P���R�G�J���g

Perl ¦b Web µ{¦¡³]­p»PÀ³¥Îªº¥Î³~¥i¥H¤j²¤¤À¬°¤T¤è­±¡G
  1. ¥Î©ó CGI¡]Common Gateway Interface¡^µ{¦¡³]­p¡A¥ç§Y¦b¦øªA¾¹ºÝ¨Ï¥Î Perl µ{¦¡¨Ó±µ¦¬¨Ï¥ÎªÌ¥Ñºô­¶¤¤ªºªí³æ¡]Forms¡^©Ò¶ñ¼gªº¸ê®Æ¡A¨Ã¦^ÂоA·íªº°T®§¡C
  2. ¥Î©ó Web Client Programming¡A¥ç§Y¨Ï¥Î¦b¥Î¤áºÝªº Perl µ{¦¡¡A¨Ó§ì¨ú©Ò»Ýªººô­¶©Î¨ä¥Lºô¸ô¤Wªº¸ê®Æ¡C
  3. ¥Î©ó¸ê®Æ³B²z¡A¨Ò¦p±qºô·~¤¤©â¨ú¦³¥Îªº¸ê°T¡C
¥»¸`±N°w¹ï²Ä¤G¤Î²Ä¤TÂI¨Ó»¡©ú¡C

¦b¥Î¤áºÝ­n¥Î Perl µ{¦¡¨Ó§ì¨ú©Ò»Ýªººô­¶¡A³Ì¥D­n¦³¨âµ{¦¡®w¥i¨Ñ¨Ï¥Î¡G

  1. LWP Library: ³o¬O¤@²Õ¾A¥Î©ó Perl ²Ä¤­ª©ªº¼Ò²Õ¡]Module¡^¡A¥i¥H¬Ý¦¨¬O±Mªù¥Î©ó Web Client Programming ªºÀ³¥Îµ{¦¡¤¶­±¡]Application Program Interface, API¡^¡A¨äµ{¦¡¤¶­±¸û²³æ¡A¥Î¦¹¼Ò²Õ¼g¥X¨Óªºµ{¦¡½X¤]¸û¬°Â²¼ä¡C
  2. Socket Library: ³o¬O¤@²Õ¸û§C¼h¦¸ªºÀ³¥Îµ{¦¡¤¶­±¡A¥i¥HÅý¥Î¤áºÝ©M¦øªA¾¹«Ø¥ß TCP/IP ³sµ²¡A¨Ã¶i¦æ¦UºØ³q°T»P·¾³q¡CSocket Library ªº¥\¯à¸û±j¤j¡A¦ý¥Ñ©ó¥]§t¤Ó¦h²Ó¸`¡A¦]¦¹¾Ç²ßªùÂe¸û°ª¡C
¥Ñ©ó¤@¯ë¥Î¤á¥u¬O­n¹ï Web ¦øªA¾¹§ì¨úºô­¶¦Ó¤w¡A¦]¦¹¥»¸`¤¶²Ð´N¥H LWP Library ¬°¥D¡C

LWP Library ¤SºÙ¬° libwww-perl-5¡A¨ä¥D­n§@ªÌ¡]¤]¬O±À°ÊªÌ¡^¬O Gisle Aas¡A¥L¬O®Ú¾Ú Roy Fielding ¦b Perl 4 ©Òµo®iªº libwww library ¨Ó¥[¥H±À¼s¡B§ï¨}¦Ó±o¨ìªº¼Ò²Õ¡C©M LWP Library ¬ÛÃöªº¦UºØ¸ê°T¥i¦b¨äºô­¶Àò±o¡G

http://www.linpro.no/lwp/
ºI¦Ü¥»®Ñµo±ê¬°¤î¡ALWP Library ªº³Ì·sª©¥»¬O 5.48¡Aµo¦æ¤é´Á¬O 2000 ¦~¥|¤ë¤E¸¹¡C¥Ø«e¦b¥«­±¤W¥H LWP Library ¬°°ò¦©Ò¼gªº­ì¤å®Ñ¦³¨â¥»¡G Á|¤@­Ó³Ì²³æªº¨Ò¤l¡A¦pªG­n§ì¨ú²MµØ¤j¾Ç¸ê°T¨tªººô­¶¡A¥i¥H¨Ï¥Î¤U¦Cµ{¦¡½X¡]lwp1.pl¡^¡G

­ì©lÀÉ¡]lwp1.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
$doc = get 'http://www.cs.nthu.edu.tw';
print($doc);

¤W­zµ{¦¡½Xªº²Ä¤@¦C¡A¥Nªí¦¹µ{¦¡½X·|¥Î¨ì LWP Library ¤¤¦WºÙ¬° Simple ªº¼Ò²Õ¡C²Ä¤G¦Cµ{¦¡½X±N²M¤j¸ê°T¨tªº­º­¶§ì¦^¡A¨Ã±N¸ê°T¶ñ¤J¦r¦êÅÜ¼Æ $doc¡C²Ä¤T¦Cµ{¦¡½X«h¦L¥XÅÜ¼Æ $doc¡Cµ§ªÌ¬Û«H¡A¦b©Ò¦³§ì¨úºô­¶ªº¥ô¦óµ{¦¡½X¡A¤£½×¨Ï¥Î¥ô¦ó»y¨¥¡A¦A¤]¤£¥i¯à·|¦³¤ñ¤W­zµ{¦¡½X§ó²¼äªºª©¥»¤F¡I

¨Æ¹ê¤W¡A­Y­n§ì¨úºô­¶¨Ã±N¨ä¤º®eÅã¥Ü¦b¿Ã¹õ¤W¡A§Ú­Ì¥i¥H¦b DOS ©R¥Oµøµ¡¤U¿é¤J¤U¦C³æ¦æªº±Ô­z¡G

perl -MLWP::Simple -e 'getprint "http://www.cs.nthu.edu.tw";' ¦¹®É Perl ´N·|¨Ï¥Î LWP Library ¨Ó®»¨úºô­¶¡A¨Ã±N HTML ­ì©lÀÉÅã¥Ü¦b¿Ã¹õ¤W¡AŪªÌ¤£§«¤@¸Õ¡I

­Y¦b¨ú±oºô­¶­ì©l½X«á¡A§Æ±æ¯à§R°£ HTML ªº¼ÐÅÒ¡]Tags¡^¡A«h¥i¨Ï¥Î¤U¦Cªºµ{¦¡½X¡]lwp2.pl¡^¡G

­ì©lÀÉ¡]lwp2.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
foreach (get $ARGV[0]) {
	s/<[^>]*>//g;
	print;
}

¦b¤W­z½d¨Ò¤¤¡AARGV[0] ¥Nªí¥Ñ©R¥O¦C¿é¤Jªº²Ä¤@­Ó°Ñ¼Æ¡A¦]¦¹¥H¤U¬O¤@­Ó©I¥s¦¹½d¨Òµ{¦¡ªº¨Ò¤l¡G

perl lwp2.pl http://neural.cs.nthu.edu.tw/jang ­Y¦b¨ú±oºô­¶­ì©l½X«á¡A§Æ±æ¯à¥H ASCII ÀÉ®×Åã¥Ü¡A¦ýºÉ¶q«O¯d HTML ªº±Æª©®ÄªG¡A«h¥i¨Ï¥Î¤U¦Cªºµ{¦¡½X¡]lwp3.pl¡^¡G

­ì©lÀÉ¡]lwp3.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
use HTML::Parse;
print parse_html(get ($ARGV[0]))->format;

­Y§Æ±æ¯à©â¨úºô­¶­ì©l½X©Ò¥]§tªº©Ò¦³³sµ²¡A¥i¨Ï¥Î¤U¦Cµ{¦¡½X¡]tlink1.pl¡^¡G

­ì©lÀÉ¡]tlink1.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
use HTML::Parse;
use HTML::Element;
$html = get $ARGV[0];
$parsed_html = HTML::Parse::parse_html($html);
for (@{ $parsed_html->extract_links() }) {
	$link = $_->[0];
	print "$link\n";
}

§Ú­Ì¥i°õ¦æ¤W­zµ{¦¡½X¡A¦p¤U¡G

perl tlink1.pl http://neural.cs.nthu.edu.tw/jang °õ¦æ«áªºµ²ªG¦p¤U¡G sandbox/html/autoload.htm /jang/cgi-bin/rand_image.pl graphics/myname.jpg graphics/animgif/flare.gif graphics/course.gif graphics/research.gif http://neural.cs.nthu.edu.tw/jang/courses/cs4601/ http://neural.cs.nthu.edu.tw/jang/courses/cs5652/ http://www.cs.nthu.edu.tw/~jang/courses/cs3331/ ... ¦¹ Perl µ{¦¡ÁöµM¤w±N¦U­Ó³sµ²¦L¥X¡A¦ý¦³¨Ç¬O¬Û¹ïºô§}¡A¦³¨Ç«h¬Oµ´¹ïºô§}¡A«D±`¤£¤è«K¡C¥H¤Uµ{¦¡½X¡]tlink2.pl¡^¥i¥H±N©Ò¦³³sµ²ªº¬Û¹ïºô§}Âনµ´¹ïºô§}¡G

­ì©lÀÉ¡]tlink2.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
use HTML::Parse;
use HTML::Element;
use URI::URL;
$html = get $ARGV[0];
$parsed_html = HTML::Parse::parse_html($html);
for (@{ $parsed_html->extract_links() }) {
	$link = $_->[0];
	$url = new URI::URL $link;
	$full_url = $url->abs($ARGV[0]);
	print "$full_url\n";
}

§Ú­Ì¥i°õ¦æ¤W­zµ{¦¡½X¡A¦p¤U¡G

perl tlink2.pl http://neural.cs.nthu.edu.tw/jang °õ¦æ«áªºµ²ªG¦p¤U¡G http://neural.cs.nthu.edu.tw/sandbox/html/autoload.htm http://neural.cs.nthu.edu.tw/jang/cgi-bin/rand_image.pl http://neural.cs.nthu.edu.tw/graphics/myname.jpg http://neural.cs.nthu.edu.tw/graphics/animgif/flare.gif http://neural.cs.nthu.edu.tw/graphics/course.gif http://neural.cs.nthu.edu.tw/graphics/research.gif http://neural.cs.nthu.edu.tw/jang/courses/cs4601/ http://neural.cs.nthu.edu.tw/jang/courses/cs5652/ http://www.cs.nthu.edu.tw/~jang/courses/cs3331/ ... «Ü©úÅã¦a¡A©Ò¦³ªº¬Û¹ï¸ô®|¤w¸g³QÂনµ´¹ï¸ô®|¡C¦ý¬O¡A¨ä¤¤¦³«Ü¦h³sµ²¬O³s¨ì¤@­Ó¼v¹³ÀÉ¡]¦p*.jpg)¡A¨Ã¤£¬O§Ú­Ì©Ò·Q¨ìªº¸ê°T¡A¦]¦¹§Ú­Ì¥i¥Î¤U¦Cµ{¦¡½X¡]tlink3.pl¡^¨Ó³W½d©Ò·Q­nªº¤å¦r³sµ²¡G

­ì©lÀÉ¡]tlink3.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
use LWP::Simple;
use HTML::Parse;
use HTML::Element;
use URI::URL;
$html = get $ARGV[0];
$parsed_html = HTML::Parse::parse_html($html);
for (@{ $parsed_html->extract_links((¡§a¡¨)) }) {
	$link = $_->[0];
	$url = new URI::URL $link;
	$full_url = $url->abs($ARGV[0]);
	print ¡§$full_url\n¡¨;
}

§Ú­Ì¥i°õ¦æ¤W­zµ{¦¡½X¡A¦p¤U¡G

perl tlink3.pl http://neural.cs.nthu.edu.tw/jang °õ¦æ«áªºµ²ªG¦p¤U¡G http://neural.cs.nthu.edu.tw/sandbox/html/autoload.htm http://neural.cs.nthu.edu.tw/jang/courses/cs4601/ http://neural.cs.nthu.edu.tw/jang/courses/cs5652/ http://www.cs.nthu.edu.tw/~jang/courses/cs3331/ http://neural.cs.nthu.edu.tw/jang/courses/cs3430/ http://www.cs.nthu.edu.tw/~jang/mlbook/demo http://www.cs.nthu.edu.tw/~jang/mlbook http://neural.cs.nthu.edu.tw/research/undergrad http://anfis.cs.nthu.edu.tw/vod/ http://140.114.119.1/~vm ... ¥Ñ¦¹¥i¨£ tlink3.pl ¤w¸g¥i¥H§ì¨ú¥Xºô­¶ªº³sµ²¡A¦Ó¥B©Ò¦³³sµ²ºô§}¤]³£Âà´«¬°µ´¹ïºô§}¡C¦pªG§Ú­Ì­n¹ê§@¤@­Ó Web ªº·j´M¤ÞÀº¡A²Ä¤@¨BÆJ´N¬O­n¼g¥X¤@­Ó Web Robot¡A¥¦ªº¥\¯à´N¬O­n¯à§ì¨úºô­¶¡A¨Ã©â¨ú¨C¤@­Óºô­¶ªº³sµ²ºô§}¡AµM«á¦A©¹¤UÄ~Äò§ì¨ú³Q³sµ²ºô­¶¡A¦p¦¹¨Ì¦¹Ãþ±À¡C©Ò¥H¤W­zªº½d¨Òµ{¦¡¡A´N¬O¤@­Ó²³æ Web Robot ªºÂú§Î¡C
Perl