ÀÌ ±ÛÀº CGIÀÇ ÀÇ¹Ì ¹× ÆÞÀ» ÀÌ¿ëÇÑ CGI °³¹ß¿¡¼ ¼³¸íÇÑ ³»¿ëÀ» ¹ÙÅÁÀ¸·Î À¥ ±â¹Ý º¹¸®°è»ê±â ¸¸µå´Â °úÁ¤À» ¾Ë¾Æ º¸´Â ±ÛÀÔ´Ï´Ù. Âü°íÇÒ ³»¿ëÀº ´ÙÀ½°ú °°½À´Ï´Ù.
¸¸µé¾î º¼ cgi ÇÁ·Î±×·¥Àº ¿ø±Ý°ú ¿¬ÀÌÀ², ±×¸®°í ÇÞ¼ö¸¦ ÀÔ·ÂÇϸé À̸¦ º¹¸®·Î °è»êÇØ¼ ¿ø¸®ÇÕ°èÇ¥¸¦ ¸¸µé¾î ÁÖ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ÀÌ cgi´Â ´Ü¼øÇØ º¸ÀÌÁö¸¸ »ç½Ç»ó cgi ÇÁ·Î±×·¥ÀÇ ±âº» ¿ø¸®´Â ¸ðµÎ ´Ù ´ã°í ÀÖ½À´Ï´Ù.
»ç¿ëÀÚ°¡ ÆûÀ» ÅëÇØ ÀÔ·ÂÇÑ Á¤º¸´Â cgi¸¦ ÅëÇØ À¥½á¹ö·Î Àü´ÞµÈ´Ù°í Çß½À´Ï´Ù. ¿ø±Ý ÀԷ¶õÀ̳ª ÀÌÀ² ÀԷ¶õ¿¡ ÀÔ·ÂÇÑ ¼ýÀÚµéÀÌ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ Á¤º¸ÀÔ´Ï´Ù. À̵é Á¤º¸´Â "º¸³»±â" ¹öưÀ» ÅëÇØ¼ À¥ ½á¹ö·Î Àü´ÞµË´Ï´Ù. ±×·¸´Ù¸é ±× µ¥ÀÌŸ´Â ¾îµð·Î °¡´Â °ÍÀϱî¿ä?
¿©±â¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æ º¸±â Àü¿¡ ¾Ë°í ÀÖ¾î¾ß ÇÒ ³»¿ëÀÌ ÀÖ½À´Ï´Ù. ÆûÀ» ÅëÇØ ÀÔ·ÂµÈ Á¤º¸°¡ À¥ ½á¹ö·Î Àü´ÞµÇ´Â ¹æ½Ä¿¡´Â Å©°Ô µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. "GET"°ú "POST"ÀÔ´Ï´Ù.
compound.pl?principal=10000&rate=6&years=10ó·³ µÇ¾î ÀÖ½À´Ï´Ù. ±×·¸°Ô cgi ÇÁ·Î±×·¥ url µÚ¿¡ ¹°À½Ç¥ ?°¡ ³ª¿À°í name1=value1&name2=value2&... ÇüÅ·ΠÀ̸§°ú °ªÀÌ ºÙ¾î¼ Àü´ÞµÇ´Â ¹æ½ÄÀ» "GET method"¶ó ÇÕ´Ï´Ù. GET ¹æ½Ä¿¡ ÀÇÇØ Àü´ÞµÈ Á¤º¸´Â ȯ°æº¯¼ö Áß $ENV{'QUERY_STRING'}¿¡ ÀúÀåµË´Ï´Ù.$ENV{'CONTENT_LENGTH'}¶ó´Â ȯ°æº¯¼ö¿¡ ´ã±é´Ï´Ù. ±×·¯¹Ç·Î POST ¹æ½ÄÀ¸·Î º¸³»Áø Á¤º¸´Â "Ç¥ÁØÀԷ¿¡¼ CONTENT_LENGTH ±æÀ̸¸Å Àоî¶ó"´Â ½ÄÀ¸·Î ÀÐ¾î ¿À°Ô µË´Ï´Ù.°¢°¢ÀÇ °æ¿ì ½á¹ö¿¡ Àü´ÞµÇ´Â ¿äûÀÇ ½ÇÁ¦ ¸ð½ÀÀ» º¸¸é ´õ ÀÌÇØ°¡ ½±½À´Ï´Ù.
GET ¹æ½ÄÀÇ °æ¿ì ½á¹ö¿¡ Àü´ÞµÇ´Â ¿äû:
GET /cgi-bin/compound.pl?principal=10000&rate=6&years=10
Accept: www/source
Accept: text/html
Accept: text/plain
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
POST ¹æ½ÄÀÇ °æ¿ì ½á¹ö¿¡ Àü´ÞµÇ´Â ¿äû:
POST /cgi-bin/compound.pl HTTP/1.1
Accept: www/source
Accept: text/html
Accept: text/plain
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Content-type: application/x-www-form-urlencoded
Content-length: 31
principal=10000&rate=6&years=10
µÎ ¹æ½ÄÀÌ ÀüÇô ´Ù¸£°Ô Àü´ÞµÈ´Ù´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
GET ¹æ½Ä, POST ¹æ½ÄÀº °¢°¢ Àå´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. GET ¹æ½ÄÀº urlÀ» ÅëÇØ¼ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ Á¤º¸°¡ ³ëÃâµÈ´Ù´Â Á¡ÀÌ ´ÜÁ¡ÀÔ´Ï´Ù. ³ëÃâµÉ »Ó¸¸ ¾Æ´Ï¶ó, À¥ ÆûÀ» ÅëÇÏÁö ¾Ê°íµµ ÁÖ¼ÒâÀÇ cgi ÁÖ¼Ò ³¡¿¡ aaa=bbb&ccc=ddd ÇüÅ·Πµ¥ÀÌŸ¸¦ ºÙ¿©¼ cgi ÇÁ·Î±×·¥À» µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù´Â º¸¾È»óÀÇ ¾àÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¶Ç, Ŭ¶óÀÌ¾ðÆ®³ª ½á¹ö¿¡ µû¶ó¼ urlÀ» Àß¶ó³» ¹ö¸®´Â °æ¿ì(truncate) µ¥ÀÌŸ°¡ Á¦´ë·Î Àü´ÞµÇÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.
¹Ý¸é¿¡ GET ¹æ½ÄÀº url¿¡ ÀÔ·ÂÇÑ °ªÀÌ °°ÀÌ ´ã°Ü ÀÖÀ¸¹Ç·Î »ç¿ëÀÚ ÂÊ¿¡¼´Â ºÏ¸¶Å©Çϱ⿡ ¿ëÀÌÇÏ´Ù´Â ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¿¹ÄÁµ¥ °Ë»ö¿£ÁøÀÇ Æ¯Á¤ °Ë»ö¾î¿¡ ´ëÇÑ °á°ú¸¦ ºÏ¸¶Å©ÇÏ°í ½ÍÀº °æ¿ì search.pl?q=°Ë»ö¾î·Î ºÏ¸¶Å©°¡ µÇ¹Ç·Î ¾ÆÁÖ Æí¸®ÇÕ´Ï´Ù. ±×·¡¼ ´ëºÎºÐÀÇ ¸ÞÀÌÁ® °Ë»ö¿£ÁøÀº GET ¹æ½ÄÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù.
Æû¿¡ ÀÔ·ÂµÈ Á¤º¸°¡ ¾î¶² ¹æ½ÄÀ¸·Î Àü´ÞµÇ´Â°¡´Â ½á¹ö¿¡¼ °áÁ¤ÇÏ´Â °Ô ¾Æ´Ï¶ó HTML ÂÊ¿¡¼ °áÁ¤µË´Ï´Ù.ÀÌ·± ½ÄÀÌÁÒ.
±×·±µ¥ Æû ÀÔ·Â Á¤º¸¸¦ ÃßÃâÇÏ´Â ¹æ½ÄÀº °¢°¢ ÀüÇô ´Ù¸¥½ÄÀ¸·Î ÀÌ·ïÁö¹Ç·Î, È¥ÀÚ¼ html µðÀÚÀΰú cgi ÇÁ·Î±×·¡¹ÖÀ» ´ÙÇÏ´Â °æ¿ì¶ó¸é ¸ô¶óµµ À¥ µðÀÚÀÌ³Ê¿Í À¥ ÇÁ·Î±×·¡¸Ó°¡ °¢±â ÀÛ¾÷À» ÇÏ´Â °æ¿ì À¥ µðÀÚÀ̳ʰ¡ ¾î¶² ¹æ½ÄÀ¸·Î htmlÀ» ¸¸µé¾ú´ÂÁö ÀÏÀÏÀÌ È®ÀÎÇØ¾ß ÇϹǷΠ¹ø°Å·Ó½À´Ï´Ù. ±×·¯¹Ç·Î cgi¸¦ ¸¸µé ¶§´Â µðÀÚÀ̳ʰ¡ ¾î¶² ¹æ½ÄÀ¸·Î ÇØ ³õ¾Òµç »ç¿ëÀÚ ÀÔ·Â Á¤º¸¸¦ Àß Ã³¸®Çس¾ ¼ö ÀÖµµ·Ï ÄÚµùÀ» ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.
±×·¯¸é ½ÇÁ¦ ½á¹ö¿¡ Àü´ÞµÈ Æû ÀÔ·Â Á¤º¸¸¦ ¾î¶»°Ô ó¸®ÇÏ´ÂÁö ÀÚ¼¼È÷ ¾Ë¾Æº¾½Ã´Ù.
À§¿¡¼ GET ¹æ½ÄÀ¸·Î Àü´ÞµÈ Á¤º¸´Â $ENV{'QUERY_STRING'}¿¡ ´ã±â°í POST ¹æ½ÄÀ¸·Î Àü´ÞµÈ Á¤º¸´Â STDIN(Ç¥ÁØÀÔ·Â)¿¡ ÀúÀåµÈ´Ù°í Çß½À´Ï´Ù. ±×¸®°í, ¾î¶² ¹æ½ÄÀ¸·Î Àü´ÞµÇ¾ú´ÂÁö´Â $ENV{'REQUEST_METHOD'}¶ó´Â ȯ°æº¯¼ö¿¡ ´ã±é´Ï´Ù. º¸¼¼¿ä.
sub parseArgument {
local ($buffer, $data, $name, $value);
my @pair;
if($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
else {
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
@pair = split /&/, $buffer;
foreach $data (@pair) {
($name,$value) = split(/=/,$data);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;
$FORM{$name} = $value;
}
}
À§ ÄÚµå´Â cgi ÇÁ·Î±×·¥À̶ó¸é °ÅÀÇ ¹Ù²ÙÁö ¾Ê°í ±×´ë·Î »ç¿ëÇß´ø ¶óÀ̺귯¸® °ÝÀÎ ÄÚµåÀÔ´Ï´Ù. HTML ¿¡¼ POST ¹æ½ÄÀ¸·Î Àü´ÞÀ» Çϵç GET ¹æ½ÄÀ¸·Î Àü´ÞÇϵç À§ ÄÚµå´Â °¢°¢ÀÇ name=value ½ÖÀ» %FORM À̶ó´Â ÇØ½¬¿¡ ÀúÀåÇÕ´Ï´Ù.
ù µÎ ÁÙÀº º¯¼ö¸¦ ¼±¾ðÇÑ °ÍÀÔ´Ï´Ù. local·Î ¼±¾ðÇß±º¿ä. localÀº { } ³»ºÎ¿¡¼´Â Áö¿ªº¯¼öó·³ »ç¿ëµÇ´Ù°¡ { }¸¦ ¹þ¾î³ª¸é Àü¿ªº¯¼ö·Î »ç¿ëµÇ´Â º¯¼öÇüÀÔ´Ï´Ù. ºñ½ÁÇÑ °ÍÀ¸·Î { } ³»ºÎ¿¡¼¸¸ Àǹ̸¦ °®´Â Áö¿ªº¯¼ö¸¦ ¸¸µå´Â my°¡ ÀÖ½À´Ï´Ù. local·Î ¼±¾ðÇÑ °ÍÀº $nameÀ̳ª $value¸¦ À§ ÇÔ¼ö ¿ÜºÎ¿¡¼ ºÒ·¯¾ß ÇÒ °æ¿ì¸¦ ´ëºñÇÑ °ÍÀÔ´Ï´Ù. ¿©±â¼´Â my·Î ÇØµµ Å« »ó°üÀº ¾ø½À´Ï´Ù.
±× ´ÙÀ½ ÁÙÀ» º¾½Ã´Ù. $ENV{'REQUEST_METHOD'}°¡ GETÀ̸é $ENV{'QUERY_STRING'}¿¡ ´ã°ÜÀÖ´Â °ÍÀ» $buffer¿¡ ´ã´Â´Ù¶ó°í µÇ¾î ÀÖ½À´Ï´Ù. ½±°Ô ÀÌÇØ°¡ µÇÁÒ? GET ¹æ½ÄÀÇ °æ¿ì QUERY_STRING¿¡ ÀúÀåµÇ¹Ç·Î °Å±â ÀÖ´Â °ÍÀ» ²ôÁý¾î ³»´Â °ÍÀÔ´Ï´Ù. ±× ´ÙÀ½ else, Áï GET ¹æ½ÄÀÌ ¾Æ´Ï¶ó¸é read ±¸¹®ÀÌ ½ÇÇàµË´Ï´Ù.
read ±¸¹®Àº read (A, B, C) ÇüÅ·Π¾²¸ç, "A¿¡ ÀÖ´Â °ÍÀ» C¸¸Å ÀÐ¾î µé¿©¼ B¿¡ ÀúÀåÇØ¶ó"´Â ÀǹÌÀÔ´Ï´Ù. µû¶ó¼ À§ÀÇ read ±¸¹®Àº Ç¥ÁØÀÔ·Â(STDIN)¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ $ENV{'CONTENT_LENGTH'} ±æÀ̸¸Å ÀÐ¾î µé¿©¼ $buffer¿¡ ÀúÀåÇØ¶ó´Â °ÍÀÌ µË´Ï´Ù. POST ¹æ½ÄÀÇ °æ¿ì Ç¥ÁØÀÔ·ÂÀ¸·Î Á¤º¸°¡ Àü´ÞµÈ´Ù°í Çß½À´Ï´Ù.
ÀÌÁ¦ GET ¹æ½ÄÀ¸·Î Àü´ÞµÇ¾úµç POST ¹æ½ÄÀ¸·Î Àü´ÞµÇ¾úµç $buffer¿¡´Â name1=value1&name2=value2&name3=value3&...°¡ ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. À̹ø¿¡´Â À̰ÍÀ» ÇϳªÇϳª ³ª´²¾ß ÇÒ Â÷·ÊÀÔ´Ï´Ù. ¿ì¼± $buffer ³»¿¡ µé¾î ÀÖ´Â °ªÀ» name1=value1, name2=value2, name3=value3,...À¸·Î ³ª´²¾ß ÇϹǷΠsplit ±¸¹®À» »ç¿ëÇÕ´Ï´Ù. split /&/, $buffer;´Â $buffer¿¡ ÀÖ´Â °ÍÀ» &¸¦ ±âÁØÀ¸·Î ³ª´« ´ÙÀ½ °¢°¢À» ¹è¿·Î µÇµ¹·Á ÁÝ´Ï´Ù. À§¿¡¼´Â @pair¶ó´Â ¹è¿¿¡ &¸¦ ±âÁØÀ¸·Î ³ª´©¾îÁø name1=value1, name2=value2, name3=value3 µîÀÌ °¢°¢ÀÇ ¿ø¼Ò·Î ´ã±â°Ô µË´Ï´Ù.
¸¶Áö¸· ºÎºÐ¿¡¼´Â °¢°¢ÀÇ name=value ½ÖÀ» ÇØ½¬·Î ÀüȯÇÕ´Ï´Ù. foreach ±¸¹®Àº ½±°Ô ÀÌÇØ°¡ µÇÁÒ? split ±¸¹®Àº $data¸¦ =¸¦ ±âÁØÀ¸·Î ³ª´©¾î¼ $name°ú $value¿¡ ´ã½À´Ï´Ù. ±× ´ÙÀ½ ³ª¿À´Â µÎ ÁÙÀº ¹Ø¿¡¼ ¼³¸íÇÕ´Ï´Ù. ¸¶Áö¸· ÁÙ¿¡¼´Â $value¸¦ $FORM{$name}¿¡ ÇÒ´çÇÔÀ¸·Î½á %FORM ÇØ½¬¸¦ ¸¸µå´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. °Ç³Ê¶Ú µÎ ÁÙÀ» Á¦¿ÜÇϰí´Â ÆòÀÌÇÑ ÆÞ ÄÚµåÀÔ´Ï´Ù.
ÀÌÁ¦ ¹®Á¦ÀÇ µÎ ÁÙ¿¡ ´ëÇØ¼ ¼³¸íÇϰڽÀ´Ï´Ù.
¸ÕÀú, $value =~ tr/+/ /;Àº $value¿¡ µé¾îÀÖ´Â ¸ðµç Ç÷¯½º Ç¥½Ã¸¦ °ø¹éÀ¸·Î ¹Ù²Ù´Â °ÍÀÔ´Ï´Ù. °©ÀÚ±â À¢ Ç÷¯½º Ç¥½ÃÀϱî¿ä? ¿ì¸®°¡ Æû¿¡ ÀÔ·ÂÇÑ °ª¿¡´Â °ø¹éÀÌ ÀÖ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î À̸§À» ÀÔ·ÂÇϸé "ÀÌ ¸íÇå"À̶ó°í ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± °ø¹é¹®ÀÚ´Â http¸¦ ÅëÇØ ½á¹ö¿¡ Àü´ÞµÉ ¶§ ÀÚµ¿À¸·Î Ç÷¯½º Ç¥½Ã·Î ¹Ù²î¾î¼[ÀÎÄÚµù(encoding)µÇ¾î¼] Àü´ÞµË´Ï´Ù. ±×·¯¹Ç·Î Àü´ÞµÈ °ª¿¡ ÀÖ´Â Ç÷¯½º Ç¥½Ã¸¦(ÀÖ´Ù¸é) ´Ù½Ã °ø¹éÀ¸·Î ¹Ù²ã Áà¾ß ¿ø·¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ´ë·Î µÇµ¹·Á ³õÀ» ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.
±× ´ÙÀ½ ÁÙ $value =~ s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;
±¦È÷ ±äÀåµÇ½ÃÁÒ? ¤Ñ_¤Ñ;
ÀÚ¼¼È÷ º¸¸é ¾Æ¹« °Íµµ ¾Æ´Õ´Ï´Ù.
s///eg;´Â ·¹±Ö¶ó ÀͽºÇÁ·¹¼Ç(regular expression)À» ¾Ë°í ÀÖ´Ù¸é ¾î·ÆÁö ¾ÊÀº °ÍÀÔ´Ï´Ù. Ç÷¢À¸·Î ºÙÀº g´Â global, Áï, ÇØ´ç ÆÐÅÏÀ» ³ª¿À´Â ´ë·Î ´Ù ã´Â´Ù´Â ÀǹÌÀÔ´Ï´Ù. e´Â expression, Áï, ´ëüµÉ ºÎºÐ¿¡ pack ±¸¹® °°Àº expressionÀÌ ´ã±æ ¶§ ¾²´Â Ç÷¢ÀÔ´Ï´Ù.
ù ¹øÂ° ½½·¡½¬ »çÀÌ¿¡ ÀÖ´Â ·¹±Ö¶ó ÀͽºÇ÷¹¼ÇÀ» ÀÚ¼¼È÷ »ìÆì º¾½Ã´Ù. ¸ÕÀú % ±âÈ£°¡ ³ª¿À°í a-f ¶Ç´Â A-F ¶Ç´Â 0-9 Áß ÇÑ ±ÛÀÚ¾¿, µÎ ±ÛÀÚ·Î ÀÌ·ïÁø ÆÐÅÏÀ» ã´Â °ÍÀÔ´Ï´Ù. Áï, ÀÌ·± ÇüŸ¦ ã½À´Ï´Ù.
%3f, %07, %2a, %ba, %7a, ...
¾îµð¼ ¸¹ÀÌ º» ÇüÅÂÁÒ? ¹Ù·Î 16Áø¼ö °ªÀÔ´Ï´Ù. À̵éÀº ¾Æ½ºÅ° ÄÚµå(ASCII Code) 16Áø¼ö °ªÀÔ´Ï´Ù. ¾Õ¿¡ %°¡ ºÙÀº°ÍÀº °ø¹éÀÌ Ç÷¯½º Ç¥½Ã·Î ¹Ù²î´Â °Íó·³ ¹®ÀÚµéÀÌ POST ¹æ½ÄÀ¸·Î Àü´ÞµÉ ¶§ %·Î ½ÃÀ۵Ǵ 16Áø¼ö°ªÀ¸·Î ÀÚµ¿º¯È¯µÇ±â ¶§¹®ÀÔ´Ï´Ù. 16Áø¼ö °ªÀº °¢ ¹®ÀÚÀÇ ¾Æ½ºÅ° °ªÀÔ´Ï´Ù.
µû¶ó¼ ÀÌÁ¦´Â ¿ªÀ¸·Î %·Î ½ÃÀ۵Ǵ 16Áø¼ö °ªÀ» ´Ù½Ã ¿ø·¡ ¹®ÀÚ·Î µÇµ¹·Á ³õ¾Æ¾ß ÇÕ´Ï´Ù. $1Àº ¾ÕÀÇ regexÀÇ °ýÈ£ ºÎºÐÀ» °¡¸®Å°¹Ç·Î hex($1)Àº ±× %¸¦ Á¦¿ÜÇÑ 16Áø¼ö ºÎºÐ¸¸À» 10Áø¼ö·Î ¹Ù²Ù´Â °ÍÀ̱º¿ä. ¹Ù²Û 10Áø¼ö °ªÀ» "C"(character)·Î packÇØ ³ÖÀ½À¸·Î½á ´Ù½Ã ¿ø·¡ ¹®ÀÚ¸¦ ¾ò¾î³¾ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù. Áï, decodingÇÏ´Â °ÍÀÔ´Ï´Ù.
°°Àº ±â´ÉÀ» ÇÏ´Â ´Ù¸¥ Äڵ嵵 ÀÖ½À´Ï´Ù.
$value =~ s/%([\da-f][\da-f])/chr(hex($1))/egi;
\d´Â 0-9 ÁßÀÇ Çϳª¸¦ °¡¸®Å°´Â °ÍÀÔ´Ï´Ù. ±×·¯¹Ç·Î ù µÎ ½½·¡½¬ »çÀÌ¿¡ ´ã±ä ÄÚµå´Â À§¿¡¼ ¼ýÀÚ·Î Á÷Á¢ ¾´ °Í°ú ¸¶Âù°¡Áö·Î %·Î ½ÃÀÛÇÏ´Â 16Áø¼ö °ªÀÔ´Ï´Ù. ¹Ù²Ü ºÎºÐÀÇ Äڵ忡 ³ª¿À´Â chr() ÇÔ¼ö´Â 16Áø¼ö °ªÀ» ¹®ÀÚ¿·Î º¯È¯ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ÈξÀ ±ò²ûÇÑ ÄÚµåÀÔ´Ï´Ù.
ÀÌ»óÀÇ Äڵ带 ÅëÇØ GET ¹æ½ÄÀ̵ç POST ¹æ½ÄÀ̵ç Àü´ÞµÈ name=value ½ÖÀ» %FORM ÇØ½¬·Î ¹Ù²ã ³õ¾Ò½À´Ï´Ù. ÀÌÁ¦ ÀÌ ÇØ½¬¿¡ Á¢±ÙÇØ¼ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌŸ¸¦ ó¸®ÇÏ¸é µË´Ï´Ù. ¿¹¸¦ µé¾î name1À̶ó´Â À̸§ÀÇ ÀÔ·Â Æû¿¡ ÀÔ·ÂµÈ °ªÀº $FORM{$name1}ÀÌ µË´Ï´Ù. »ç¿ëÀÚ ÀÔ·Â °ªµéÀ» ÀԷ¶õ º°·Î ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ °ÍÀÔ´Ï´Ù.
À§ ÄÚµå´Â ±×¾ß¸»·Î cgi ÇÁ·Î±×·¥À̶ó¸é ¸ðµÎ ´Ù »ç¿ëÇÏ´Â °ÍÀ̹ǷΠCOPY-PASTEÇØ¼ ¸¹ÀÌ »ç¿ëÇß½À´Ï´Ù. ÇÏÁö¸¸, ÆÞ ¸ðµâ(Perl Module) Áß CGI.pmÀ» »ç¿ëÇϸé À§¿Í °°ÀÌ º¹ÀâÇÑ Äڵ带 ¾²Áö ¾Ê°í °£´ÜÇÏ°Ô ¶È°°Àº ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ÆÞ ¸ðµâ¿¡ °üÇØ¼´Â ¸¹Àº ¾ê±â°¡ ÀÖÀ¸¹Ç·Î ´ÙÀ½¿¡ ÀÚ¼¼È÷ ´Ù·ç°Ú½À´Ï´Ù¸¸ ÀÌ ±Û°ú °ü·Ã µÇ´Â ºÎºÐ¸¸ ¾Ë¾Æ º¾½Ã´Ù. ¸ÕÀú ¸ðµâÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀº useÀÔ´Ï´Ù. ¿¹¸¦ µé¾î CGI.pmÀ̶ó´Â ÆÞ ¸ðµâÀ» »ç¿ëÇÑ´Ù¸é use CGI;¸¦ ÇÁ·Î±×·¥ÀÇ Ã¹ ¸Ó¸®¿¡ ½á ÁÖ¸é µË´Ï´Ù. ´ë°³ÀÇ CGI ÇÁ·Î±×·¥Àº ÆÞ ÇÁ·Î±×·¥ ùÁÙ¿¡ use CGI qw(:standard);ó·³ ¾´´Ù°í ÀÏ´Ü ¿Ü¿öµÎ½Ã±â ¹Ù¶ø´Ï´Ù. À̰ÍÀº CGI.pm ¸ðµâ ÁßÀÇ standard ÇÔ¼öµéÀ» °¡Á® ¿À°Ú´Ù´Â(import) ¶æÀÔ´Ï´Ù. ÀÌ ÇÑ ÁÙÀ» »ç¿ëÇÔÀ¸·Î½á À§¿¡¼ º¹ÀâÇÏ°Ô ¼³¸íÇÑ »ç¿ëÀÚ ÀԷ ó¸®°¡ ÇãÅ»ÇÒ Á¤µµ·Î °£´ÜÇØÁý´Ï´Ù. CGI.pm ÆÞ ¸ðµâ¿¡´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌŸ¸¦ ½±°Ô °¡Á®¿Ã ¼ö ÀÖ°Ô Çϱâ À§ÇØ param()À̶õ °ÍÀÌ ÀÖ½À´Ï´Ù. $value = param('name')À̶ó°í Çϸé nameÀ̶ó´Â À̸§ÀÇ ÀԷ¶õ¿¡ ÀÔ·ÂµÈ °ªÀÌ $value¶ó´Â ½ºÄÉÀÏ¶ó º¯¼ö¿¡ ¹Ù·Î ´ã±é´Ï´Ù. Áï, À§¿¡¼ º¹ÀâÇÏ°Ô ¼³¸íÇÑ parseArgument()¶ó´Â ÇÔ¼ö´Â $value = param('name') ÇÑ ÁÙ·Î ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù.(ÇãÅ»~) ½ÇÁ¦ Äڵ带 º¸¸é ´õ ½±°Ô ÀÌÇØµË´Ï´Ù. ÀÌÁ¦, À§¿¡¼ ¼³¸íÇÑ ³»¿ëÀ» ¹ÙÅÁÀ¸·Î À¥ ±â¹Ý º¹¸®°è»ê±â¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¸ÕÀú ÀüÅëÀûÀÌ ¹æ½ÄÀ¸·Î ÄÚµùÇϸé,
#!/usr/bin/perl
&parseNumbers;
&htmlHeader;
if ($FORM{"principal"} && $FORM{"rate"} && $FORM{"years"}) { &calculate; }
else { &inputForm; }
&htmlFooter;
# ÀÔ·ÂµÈ ¼ýÀÚ¸¦ ³Ñ°Ü¹Þ½À´Ï´Ù
sub parseNumbers {
local ($buffer, $data, $name, $value);
local (@pair);
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
else {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
@pair = split(/&/, $buffer);
foreach $data (@pair) {
($name, $value) = split(/=/, $data);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
}
# HTML header Ãâ·Â
sub htmlHeader {
print qq|Content-type: text/html\n\n|;
print qq( html ÅÂ±×¿Í ³»¿ëÀ» ÀÔ·Â. ½ÇÁ¦ ÄÚµå´Â »ý·«ÇÕ´Ï´Ù.);
}
# HTML footer Ãâ·Â
sub htmlFooter {
print qq(html ÅÂ±×¿Í ³»¿ëÀ» ÀÔ·Â. ½ÇÁ¦ ÄÚµå´Â »ý·«ÇÕ´Ï´Ù.);
}
# »ç¿ëÀÚ ÀÔ·Â Æû Ãâ·Â
sub inputForm {
Æû ű׸¦ ÀÔ·Â. ½ÇÁ¦ ÄÚµå´Â »ý·«ÇÕ´Ï´Ù.
}
# ¿ø¸®Çհ踦 °è»ê ÇÕ´Ï´Ù
sub calculate {
# »ç¿ëÀÚ ÀÔ·ÂÇÑ °ª ÇÒ´ç
($principal, $rate, $years) = ($FORM{'principal'}, $FORM{'rate'}, $FORM{'years'});
$first = $principal;
for my $i (1..$years) {
my $interest = int(($rate/100) * $principal); # ÀÌÀÚ°è»ê
$sum[$i] = $principal + $interest; # ¿ø¸®ÇÕ°è °è»ê
$principal = $sum[$i]; # ¿ø¸®Çհ踦 ´Ù½Ã ´ÙÀ½·çÇÁ ¿ø±ÝÀ¸·Î
}
&printNumbers;
}
# ÃÖÁ¾°á°ú¸¦ Ãâ·ÂÇÕ´Ï´Ù
sub printNumbers {
µð½ºÇ÷¹ÀÌÇÏ´Â html Àº »ý·«ÇÕ´Ï´Ù.
}
À§¿Í °°ÀÌ µË´Ï´Ù. principal, rate µî ÀÔ·Â ¿ä¼Ò¿¡ ´ã±ä °ªµéÀÌ parseNumbers()¶ó´Â ÇÔ¼ö¿¡ ÀÇÇØ ¼¹ö·Î Àü´ÞµÇ¾î¼ $FORM{'principal'}, $FORM{'rate'} µîÀÇ ÇØ½¬ °ª¿¡ ´ã±ä´Ù´Â °ÍÀÌ ½±°Ô ÀÌÇØµË´Ï´Ù. ³ª¸ÓÁö º¹¸® °è»êÇÏ´Â ºÎºÐÀº °£´ÜÇÑ °ÍÀ̹ǷΠ¼³¸íÀ» »ý·«ÇÕ´Ï´Ù.
print qq| ... |;´Â print " ... "¿Í ¶È°°½À´Ï´Ù¸¸, Å« µû¿ÈÇ¥ ¾È¿¡ ¶Ç ´Ù½Ã Å« µû¿ÈÇ¥¸¦ ¾µ ¶§µµ Å»Ãâ(\")ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡ ¾ÆÁÖ À¯¿ëÇÕ´Ï´Ù. qq|...|´Â ...¸¦ Å« µû¿ÈÇ¥·Î ¹Àº °Í°ú ¶È°°°í q|...|;´Â ÀÛÀº µû¿ÈÇ¥·Î ¹Àº °Í°ú °°°í, qw|a b c|´Â ("a", "b", "c")¿Í °°½À´Ï´Ù. qw´Â ´Ü¾î(word)º°·Î µû¿ÈÇ¥·Î ¹´Â´Ù´Â ÀǹÌÀÔ´Ï´Ù. ´ë°³ htmlÀ» Ãâ·ÂÇÒ¶§ ÅÂ±×¿Í ÇÔ²² Å« µû¿ÈÇ¥°¡ ¸¹ÀÌ ¾²À̹ǷΠ°¡±ÞÀûÀ̸é qq|..|¸¦ Ȱ¿ëÇÏ´Â °ÍÀÌ print "..."¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ´õ ÁÁ½À´Ï´Ù. ±×¸®°í ¶Ç Çϳª, qq(...), qq#...#ó·³ ¿°í ´Ý´Â ¹®ÀÚ¸¸ ¸ÂÃçÁÖ¸é |, ()µîÀ» »ç¿ëÇØµµ µË´Ï´Ù.
À§ÀÇ ÄÚµå´Â ÆÞ ¸ðµâ CGI.pmÀ» »ç¿ëÇϸé parseNumbers()¸¦ ÀüÇô »ç¿ëÇÒ ÇÊ¿ä ¾øÀÌ,
$principal = parma('principal');
À̶ó°í ÇÏ¸é °ð¹Ù·Î principal ÀԷ¶õ¿¡ ÀÔ·ÂÇÑ °ªÀÌ $principalÀ̶ó´Â ½ºÄÉÀÏ¶ó º¯¼ö¿¡ ´ã±é´Ï´Ù. CGI.pmÀ» »ç¿ëÇÏ¸é ´ë·« ÀÌ·± ½ÄÀ¸·Î µË´Ï´Ù.
#!/usr/bin/perl
use CGI qw(:standard);
# ÀÔ·ÂµÈ ¼ýÀÚ¸¦ ³Ñ°Ü¹Þ½À´Ï´Ù
$principal = param('principal');
$rate = param('rate');
$years = param('years');
# parseNumbers() ¾øÀÌ À§¿Í °°ÀÌ °£´ÜÇÏ°Ô µË´Ï´Ù
&htmlHeader;
if ($FORM{"principal"} && $FORM{"rate"} && $FORM{"years"}) { &calculate; }
else { &inputForm; }
&htmlFooter;
# HTML header Ãâ·Â
...
# HTML footer Ãâ·Â
...
# »ç¿ëÀÚ ÀÔ·Â Æû Ãâ·Â
...
sub valid {
if ($principal && $rate && $years) {
&calculate;
}
}
# ¿ø¸®Çհ踦 °è»ê ÇÕ´Ï´Ù
sub calculate {
$first = $principal;
for my $i (1..$years) {
$interest = int(($rate/100) * $principal); # ÀÌÀÚ°è»ê
$sum[$i] = $principal + $interest; # ¿ø¸®ÇÕ°è °è»ê
$principal = $sum[$i]; # ¿ø¸®Çհ踦 ´Ù½Ã ´ÙÀ½ ·çÇÁ ¿ø±ÝÀ¸·Î
}
&printNumbers;
}
# ÃÖÁ¾°á°ú¸¦ Ãâ·ÂÇÕ´Ï´Ù
...
Äڵ尡 ÈξÀ ´õ °£¼ÒÇØÁö°í ±ò²ûÇÕ´Ï´Ù. ±×·¯¹Ç·Î °¡±ÞÀû CGI.pmÀ» »ç¿ëÇØ¼ ÄÚµùÇϼ¼¿ä. CGI.pmÀ» »ç¿ëÇÏ¸é »ç¿ëÀÚ ÀÔ·Â ³»¿ëÀ» ÆÄ½ÌÇÏ´Â ºÎºÐ ¾øÀÌ $value = param('name');¶ó´Â ÄÚµå·Î °ð¹Ù·Î ÀÔ·ÂµÈ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
