Á¦¸ñÆÞ(Perl) ÄÚµù ½ºÅ¸ÀÏ(Code Layout)
½ÃÀÛÇϸ縹Àº »ç¶÷µéÀº ÆÞ(Perl)ÀÇ Äڵ忡 ´ëÇØ µÎ·Á¿òÀ» °¡Áö°í ÀÖ½À´Ï´Ù. °ÆÁ¤ÇÏÁö ¸¶¼¼¿ä. ´ëºÎºÐÀÇ °æ¿ì ÀÌ·± ¿ÀÇØ´Â °æÇèÇØº¸Áö ¸øÇÑ »óÅÂÀÇ ¸·¿¬ÇÑ °ÆÁ¤ÀÎ °æ¿ì°¡ ´ëºÎºÐÀÔ´Ï´Ù. ¾î¶² ¾ð¾î¶óµµ ÀϰüµÇ°í Áö¼ÓÀûÀ̸ç, ±ò²ûÇÑ ÄÚµù ½ºÅ¸ÀÏÀ» ÁöŰÁö ¾Ê´Â´Ù¸é ÀÌÇØÇϱ⠾î·Á¿ì¸ç, ¹ö±×¸¦ Àâ´Â °Íµµ, ¼öÁ¤À» ÇÏ´Â °Íµµ ½¬¿î ÀÏÀÌ ¾Æ´Õ´Ï´Ù. ÀÌ ¹®¼´Â ÆÞ ÇÁ·Î±×·¥À» °ß°íÇϸç È¿À²ÀûÀ̰í, À¯Áöº¸¼ö°¡ ¼Õ½¬¿î Äڵ带 ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù.
ÄÚµù ½ºÅ¸ÀÏÀ̶õ ¹«¾ùÀԴϱî?µ¿ÀÏÇÑ Ç¥Çö
¿Ö ÄÚµù ½ºÅ¸ÀÏÀ» ÁöÄÑ¾ß Çϳª¿ä?¿Ã¹Ù¸¥ ÄÚµù ½ºÅ¸ÀÏÀº °ß°íÇϰí, È¿À²ÀûÀ̸ç, À¯Áöº¸¼ö°¡ ¼Õ½¬¿î Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇÕ´Ï´Ù. ¾Æ·¡ÀÇ ÄÚµù ½ºÅ¸ÀÏÀº ·êÀÌ ¾Æ´Ï¶ó °¡À̵å¶óÀÎÀÔ´Ï´Ù. Áï ÀÌ·± ·êÀ» µû¸£±â¸¦ ¿©·¯ºÐ¿¡°Ô ±Ç°íÇÏ´Â °ÍÀÔ´Ï´Ù. ¸¸¾à µ¿ÀÇÇÒ ¼ö ¾ø´Â ºÎºÐÀÌ ÀÖ´Ù¸é ÆÀ¿øµé°ú ¿©·¯¹ø ¼÷°íÇÏ°í ³íÀǸ¦ °ÅÄ£´ÙÀ½ ÇÁ·ÎÁ§Æ®¿Í ÆÀ¿øµé¿¡°Ô °¡Àå Àû´çÇÑ ÄÚµù ½ºÅ¸ÀÏÀ» ¼±ÅÃÇÏ¸é µË´Ï´Ù. ´Ü Áß¿äÇÑ °ÍÀº ÀϰüµÇ°í, Áö¼ÓÀûÀ¸·Î ÇϳªÀÇ ÄÚµù ½ºÅ¸ÀÏÀ» À¯ÁöÇØ¾ß ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. ¼Ò°³ÇÏ´Â °¡À̵å¶óÀεéÀº ºñ´Ü ÆÞ »Ó¸¸¾Æ´Ï¶ó ´Ù¸¥ ÇÁ·Î±×·¡¹Ö½Ã¿¡µµ µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. ³í¶õÀÇ ¿©Áö°¡ ÀÖ´Ù¸é, Àû¾îµµ ÆÞ·Î Äڵ带 ÀÛ¼ºÇÒ ¶§ ¸¸ÅÀÌ¶óµµ °¡À̵å¶óÀÎÀ» ÁöŰ·Á´Â ³ë·ÂÀ» ÇÏ´Â °ÍÀ» ÃßõÇÕ´Ï´Ù. ÀÌ ´Ü¶ôÀÇ ¸ðµç °¡À̵å¶óÀÎÀº CPANÀÇ ±½Á÷±½Á÷ÇÑ ¸ðµâÀÇ ÀúÀÚÀÎ Damian ConwayÀÇ Perl Best Practices(O'REILLY)¿¡¼ ¹ßÃéÇß½À´Ï´Ù.
ÆÞ Ä¿¹Â´ÏƼ°¡ ÃßõÇÏ´Â °¡À̵å¶óÀÎ
°ýÈ£·Î ¹´Â ¹æ¹ý(Bracketing)Áß°ýÈ£({}, brace)¿Í ¼Ò°ýÈ£((), parenthesize)´Â K&R ½ºÅ¸ÀÏÀ» µû¸¨´Ï´Ù. ÄÚµå ºí·ÏÀ» ¼³Á¤ÇÒ ¶§´Â K&R Çü½ÄÀÇ ºê¶óÄÏÆÃÀ» »ç¿ëÇÕ´Ï´Ù. ºí·ÏÀ» Á¦¾îÇÏ´Â ÄÁ½ºÆ®·°Æ®ÀÇ ³¡¿¡ °ýÈ£¸¦ ¿±´Ï´Ù. ´ÙÀ½ ÁÙ¿¡¼ ÇÑ ·¹º§ÀÇ µé¿©¾²±â¸¦ ÇÑ ÈÄ ³»¿ëÀ» ÀÛ¼ºÇÕ´Ï´Ù. ºí·ÏÀ» Á¦¾îÇÏ´Â ÄÁ½ºÆ®·°Æ®¿Í µ¿ÀÏÇÑ µé¿©¾²±â ¼öÁØ¿¡¼ °ýÈ£¸¦ ´Ýµµ·Ï ÇÕ´Ï´Ù. »ç¿ë ¿¹:
my @names = (
'Kim', # Last name
'Do-hyoung', # First name
'Keedi', # English name
);
for my $name (@names) {
for my $word ( anagrams_of(lc $name) ) {
print "$word\n";
}
}
BSD ½ºÅ¸Àϰú GNU ½ºÅ¸ÀÏ·Î ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
# BSD ½ºÅ¸ÀÏ
my @names =
(
'Kim', # Last name
'Do-hyoung', # First name
'Keedi', # English name
);
for my $name (@names)
{
for my $word ( anagrams_of(lc $name) )
{
print "$word\n";
}
}
# GNU ½ºÅ¸ÀÏ
for my $name (@names)
{
for my $word ( anagrams_of(lc $name) )
{
print "$word\n";
}
}
vi ¿¡¼´Â '%'¸¦ ÀÌ¿ëÇØ¼ ÇöÀç Ä¿¼°¡ À§Ä¡Çϰí ÀÖ´Â °ýÈ£¿¡ ´ëÀÀÇÏ´Â °ýÈ£·Î À̵¿ÇÒ ¼ö ÀÖÀ¸¸ç, Emacs¿¡¼´Â ÀÌ ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ .emacs ¼³Á¤ ÆÄÀÏ¿¡ ´ÙÀ½ ³»¿ëÀ» Ãß°¡Çϵµ·Ï ÇÕ´Ï´Ù:
;; Use % to match various kinds of brackets...
(global-set-key "%" 'match-paren)
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((string-match "[[{(<]" next-char) (forward-sexp 1))
((string-match "[\]})>]" prev-char) (backward-sexp 1))
(t (self-insert-command (or arg1)))))
Ű¿öµå(Keywords)Á¦¾î Ű¿öµå(control keyword)´Â µû¶ó¿À´Â ¿©´Â °ýÈ£¿Í ºÐ¸®ÇÕ´Ï´Ù. Á¦¾î¹®Àº ÇÁ·Î±×·¥ÀÇ È帧À» º¯°æÇϱ⠶§¹®¿¡ ºó¹øÇÏ°Ô »ç¿ëÇÕ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ Á¦¾î Ű¿öµå´Â ¼Ò½º Äڵ忡¼ ¸íÈ®ÇÏ°Ô º¸¿©¾ß ÇÕ´Ï´Ù. ÆÞ¿¡¼ ´ëºÎºÐÀÇ Á¦¾î ±¸Á¶¿¡ »ç¿ëÇÏ´Â Á¦¾î Ű¿öµå´Â ¿©´Â °ýÈ£°¡ µû¶ó¿À´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. ÀÌ ¼Ò°ýÈ£´Â ÇÔ¼ö È£Ãâ½Ã »ç¿ëÇÏ´Â °ýÈ£¿Í Çò°¥¸± ¼ö ÀÖ½À´Ï´Ù. ±×·¸±â ¶§¹®¿¡ Ű¿öµå¿Í ¿©´Â °ýÈ£ »çÀÌ ÇÑ ÄÀÇ °ø¹é ¹®ÀÚ¸¦ ÁÖ¾î ÇÔ¼ö È£Ãâ°ú Á¦¾î¹®À» ¸íÈ®ÇÏ°Ô ±¸ºÐÇϵµ·Ï ÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
for my $result (@results) {
print_sep();
print $result;
}
while ($min < $max) {
my $try = ($max - $min) / 2;
if ($value[$try] < $target) {
$max = $try;
}
else {
$min = $try;
}
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
for(@results) {
print_sep();
print $result;
}
while($min < $max) {
my $try = ($max - $min) / 2;
if($value[$try] < $target) {
$max = $try;
}
else{
$min = $try;
}
}
¼ºê·çƾ°ú º¯¼ö(Subroutines and Variables)¼ºê·çƾ È£Ãâ°ú º¯¼ö À̸§ ´ÙÀ½¿¡ ¿©´Â °ýÈ£°¡ ³ª¿Ã °æ¿ì ¶ç¾î¾²Áö ¾Ê½À´Ï´Ù. ¾Õ¼ ¸»ÇÑ ±ÔÄ¢°ú ¿¬°üÀÌ ÀÖ´Â ºÎºÐÀÔ´Ï´Ù. ¼ºê·çƾ È£ÃâÀ» Á¦¾î Ű¿öµå·Î Âø°¢Çϰųª, ¶Ç´Â ¹è¿ÀÇ ÇÑ ºÎºÐÀÓ¿¡µµ ºÒ±¸ÇÏ°í µ¶¸³ÀûÀÎ ½ºÄ®¶ó º¯¼ö·Î À߸ø Àд °Í°ú °°Àº ½Ç¼ö¸¦ ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ¼ºê·çƾ È£Ãâ½Ã »ç¿ëÇÏ´Â ()¿Í º¯¼ö À̸§ ´ÙÀ½¿¡ ³ª¿À´Â [], {}ÀÇ °æ¿ì °ø¹é¾øÀÌ ºÙ¿©¼ »ç¿ëÇϵµ·Ï ÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
my @candidates = get_candidates($marker);
CANDIDATE:
for my $i (0..$#candidates) {
next CANDIDATE if open_region($i);
$candidates[$i]
= $incumbent{ $candidates[$i]{reigion} };
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
my @candidates = get_candidates ($marker);
CANDIDATE:
for my $i (0..$#candidates) {
next CANDIDATE if open_region ($i);
$candidates [$i]
= $incumbent {$candidates [$i] {region}};
}
ºôÆ®ÀÎ(Builtins)ºôÆ®Àΰú ¡°honorary¡± ºôÆ®Àο¡ ´ëÇØ¼ ºÒÇÊ¿äÇÑ °ýÈ£¸¦ ³ÖÁö ¾Ê½À´Ï´Ù. perlÀÇ ¸¹Àº ºôÆ®ÀÎ ÇÔ¼öµéÀº »ç½Ç»ó Ű¿öµåÀÔ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ Ưº°È÷ ¿ì¼±¼øÀ§¸¦ °Á¦ÇÏ°í ½ÍÀº °æ¿ì°¡ ¾Æ´Ï¶ó¸é °ýÈ£ ¾øÀÌ »ç¿ëÇÏ´Â °ÍÀº ¹®¹ý¿¡ ¾î±ß³ªÁö ¾Ê½À´Ï´Ù. ºôÆ®ÀÎÀ» È£ÃâÇÒ ¶§ °ýÈ£¸¦ Á¦¿ÜÇϸé Äڵ尡 ³ÀâÇØÁö´Â °ÍÀ» ¸·À» ¼ö ÀÖÀ¸¸ç, °á±¹ °¡µ¶¼ºÀ» ³ôÀÏ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ÇÔ¼ö È£Ãâ°ú ºôÆ®ÀÎÀÇ È£ÃâÀ» ½Ã°¢ÀûÀ¸·Î ±¸ºÐÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
while (my $record = <$results_file>) {
chomp $record;
my ($name, $votes) = split "\t", $record;
print 'Votes for ',
substr($name, 0, 10), # Parens needed for precedence
": $votes (verified)\n";
}
``honorary(¸í¿¹·Î¿î)'' ºôÆ®ÀÎÀº È®½ÇÇÏ°Ô ÀÓÆ÷Æ®(import)ÇÑ ¼ºê·çƾ, Áï ÆÞÀÇ ÄÚ¾î ¹èÆ÷ÆÇ¿¡ ¼ÓÇØÀÖ´Â ¸ðµâÀ» ÀǹÌÇÕ´Ï´Ù. ÀüÇüÀûÀ¸·Î ÀÌ·¯ÇÑ ``honorary'' ºôÆ®ÀÎÀº ¾ð¾î¿¡¼ Á¦°øÇÏ´Â ÆíÀÌ ÁÁÁö¸¸ ½ÇÁ¦·Î ±×·¸Áö ¾ÊÀº ¼ºê·çƾÀ» ÀǹÌÇÕ´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ìµµ °ýÈ£ ¾øÀÌ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡ ¼ÓÇÏ´Â °ÍÀÇ ¿¹·Î´Â Ç¥ÁØ Carp ¸ðµâÀÇ carp, croak, Ç¥ÁØ List::Util ¸ðµâÀÇ first, max, CPAN IO::Prompt ¸ðµâÀÇ prompt µîÀÌ ÀÖ½À´Ï´Ù. ¸¸¾à ºôÆ®Àο¡ ´ëÇØ °ýÈ£¸¦ Ç¥±âÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Ù¸é ¼ºê·çƾÀÇ ±ÔÄ¢À» µû¸¨´Ï´Ù. Á¦¾î Ű¿öµåÀÇ ±ÔÄ¢À» µû¸£Áö ¾Ê½À´Ï´Ù. Áï ºôÆ®ÀÎ À̸§°ú ¿©´Â °ýÈ£ »çÀÌ¿¡ °ø¹é ¹®ÀÚ¸¦ µÎÁö ¾Ê½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
while (my $record = <$result_file>) {
chomp( $record );
my ($name, $votes) = split("\t", $record);
print(
'Votes for ',
substr($name, 0, 10),
": $votes (verified)\n"
);
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
while (my $record = <$result_file>) {
chomp ($record);
my ($name, $votes) = split ("\t", $record);
print(
'Votes for ',
substr ($name, 0, 10),
": $votes (verified)\n"
);
}
Ű¿Í À妽º(Keys and Indices)Ű³ª À妽º°¡ º¹ÀâÇÏ´Ù¸é ±×°ÍÀ» µÑ·¯½Ñ °ýÈ£¿Í ºÐ¸®ÇÕ´Ï´Ù. ¸®½ºÆ®ÀÇ ÇØ½¬ÀÇ ÇØ½¬¿Í °°ÀÌ º¹ÀâÇÑ ÀÚ·á ±¸Á¶ÀÇ ¿ä¼Ò¿¡ Á¢±ÙÇÏ´Â °æ¿ì ±æ°í, º¹ÀâÇϰí, »ª»ªÇÑ ÇüŰ¡ µÇ±â ½±½À´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù:
$candidates[$i] = $incumbent{$candidates[$i]{get_region()}};
°ø¹é ¾øÀÌ »ª»ªÇÏ°Ô Ç¥±âÇÏ´Â °æ¿ì Àб⵵ Èûµé »Ó¸¸ ¾Æ´Ï¶ó °ýÈ£°¡ ºüÁø °æ¿ì ¾Ë¾ÆÃ¤±âµµ ½±Áö ¾Ê½À´Ï´Ù. À妽º°¡ °£´ÜÇÑ »ó¼ö°Å³ª ½ºÄ®¶ó º¯¼ö°¡ ¾Æ´Ò °æ¿ì °ýÈ£ »çÀÌ¿¡ ºó Ä Çϳª¸¦ À妽º Á¿쿡 »ðÀÔÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
$candidates[$i] = $incumbent{ $candidates[$i]{ get_reigion() } };
¶ÇÇÑ ºñ·Ï °£´ÜÇÑ »ó¼ö°Å³ª ½ºÄ®¶ó º¯¼ö¶ó ÇÏ´õ¶óµµ ÀϹÝÀûÀÌÁö ¾Ê°Ô ±æÀ̰¡ ±æ´Ù¸é ¿ª½Ã °ýÈ£ »çÀÌ¿¡ ºó ÄÀ» »ðÀÔÇÏ´Â °ÍÀÌ ³´½À´Ï´Ù:
print $incumbent{ $largest_gerrymandered_constituency };
ÀÌ·¸°Ô ÀÛ¼ºÇÏÁö ¾Ê½À´Ï´Ù:
print $incumbent{$largest_gerrymandered_constituency};
¿¬»êÀÚ(Operators)ÀÌÇ× ¿¬»êÀÚÀÇ °æ¿ì ÇÇ¿¬»êÀÚ¿Í ±¸ºÐÇϱ⠽±°Ô °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ·¸°Ô Ç¥±âÇϱ⠺¸´Ù´Â:
my $displacement=$initial_velocity*$time+0.5*$acceleration*$time**2;
my $price=$coupon_paid*$exp_rate+(($face_val+$coupon_val)*$exp_rate**2);
ÁÙÀ» ´õ »ç¿ëÇÏ´õ¶óµµ ÀÌ·¸°Ô Ç¥±âÇÕ´Ï´Ù:
my $displacement
= $initial_velocity * $time + 0.5 * $acceleration * $time**2;
my $price
= $coupon_paid * $exp_rate + ($face_val + $coupon_paid) * $exp_rate**2;
¿¬»êÀÚÀÇ ¿ì¼±¼øÀ§¸¦ °í·ÁÇÏ¿© °ø¹é ¹®ÀÚÀÇ °³¼ö¸¦ °áÁ¤ÇÕ´Ï´Ù. À̰æ¿ì Àд »ç¶÷Àº ÀÚ¿¬½º·´°Ô ±×·ìȸ¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ ¿¹¿¡¼´Â »ó´ëÀûÀ¸·Î ¿ì¼± ¼øÀ§°¡ ³·Àº + ¿¬»êÀÚ´Â ÁÂ¿ì °ø¹é ¹®ÀÚ¸¦ 2°³ ÁÖ¾úÀ¸¸ç, ** ¿¬»êÀÚ´Â »ª»ªÇÏ°Ô ºÙÀÓÀ¸·Î¼ ³ôÀº ¿ì¼± ¼øÀ§ÀÓÀ» ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù. °ýÈ£¸¦ »ç¿ëÇØ¼ ¿ì¼± ¼øÀ§¸¦ °Á¶ÇÒ ¶§µµ ÇÑ ÄÀÇ ¿©¹éÀ̸é ÃæºÐÇÕ´Ï´Ù:
my $velocity
= $initial_velocity + ($acceleration * ($time + $delta_time));
my $future_price
= $current_price * exp($rate - $dividend_rate_on_index) * ($delivery - $now);
½Éº¼ ´ÜÇ× ¿¬»êÀÚ(symbolic unary operator)ÀÇ °æ¿ì ÇÇ¿¬»êÀÚ¿Í ºÙ¿©¼ »ç¿ëÇÕ´Ï´Ù:
my $spring_force = !$hyperextended ? -$spring_constant * $extension : 0;
my $payoff = max(0, -$asset_price_at_maturity + $strike_price);
À̸§ÀÌ ÀÖ´Â ´ÜÇ× ¿¬»êÀÚÀÇ °æ¿ì ºôÆ®Àΰú µ¿ÀÏÇÏ°Ô ÇÇ¿¬»êÀÚ ¾Õ¿¡ °ø¹é ¹®ÀÚ¸¦ Çϳª µÓ´Ï´Ù:
my $tan_theta = sin $theta / cos $theta;
my $forward_differential_1_year = $delivery_price * exp -$interest_rate;
¼¼¹ÌÄÝ·Ð(Semicolons)¸ðµç ¸í·É¹®(statement) µÚ¿¡´Â ¼¼¹ÌÄÝ·ÐÀ» Ç¥±âÇÕ´Ï´Ù. Perl¿¡¼´Â ¸í·É¹®À» ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐÇÕ´Ï´Ù. ±×·¯¹Ç·Î ºí·ÏÀÇ ¸¶Áö¸· ¸í·É¹®Àº ¼¼¹ÌÄÝ·ÐÀÌ ¾ø¾îµµ »ó°ü¾ø½À´Ï´Ù. ÇϳªÀÇ ¸í·É¹®À¸·Î ºí·ÏÀÌ ±¸¼ºµÇ¾îµµ ¼¼¹ÌÄÝ·ÐÀº ¾ø¾îµµ µË´Ï´Ù. ±×·¸Áö¸¸ ÀÌ µÎ °æ¿ì ¸ðµÎ ¹Ýµå½Ã ¼¼¹ÌÄÝ·ÐÀ» Ç¥±âÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2;
}
print $line;
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2
}
print $line
}
À§¿Í °°ÀÌ ºí·ÏÀÇ ¸¶Áö¸· ¹®Àå¿¡ ¼¼¹ÌÄÝ·ÐÀ» »ý·«ÇÏ´Â °æ¿ì °¡Àå Å« ¹®Á¦´Â ´ÙÀ½°ú °°ÀÌ »õ·Î¿î ¹®ÀåÀ» Ãß°¡ÇÒ ¶§ ÀϾ´Ï´Ù:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2
/shift/mix
}
print $line
$src_len += length;
}
À̰ÍÀº ¹ß°ßÇϱ⵵ ½±Áö ¾ÊÀ» »Ó¸¸ ¾Æ´Ï¶ó ÆÞ ÄÄÆÄÀÏ·¯´Â º¯°æÇÑ ¼Ò½º Äڵ带 ´ÙÀ½°ú °°ÀÌ ÇØ¼®ÇÒ °ÍÀÔ´Ï´Ù. ¿¡·¯°¡ ³ªÁö ¾Ê´Â´Ù¸é ÀÌ·¯ÇÑ ¿À·ù´Â ¹ß°ßÇϱⰡ ´õ¿í ¾î·Æ½À´Ï´Ù:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2 / shift() / mix()
}
print $line ($src_len += length);
}
ÀÌ ±ÔÄ¢Àº map°ú grepÀ» »ç¿ëÇÒ ¶§ {}¾È¿¡ ÇϳªÀÇ ¸í·É¹®À¸·Î ±¸¼ºµÇ´Â °æ¿ì´Â Á¦¿ÜÇÕ´Ï´Ù. À̶§´Â ¼¼¹ÌÄÝ·ÐÀ» »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. ¼¼¹ÌÄÝ·ÐÀ» »ç¿ëÇÏ¸é ¸í·É¹®ÀÌ ³¡³ª´Â À§Ä¡¸¦ ÆÄ¾ÇÇÏ±â ¾î·Æ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÕ´Ï´Ù:
my @sqrt_results
= map { sqrt $_ } @results;
´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù:
my @sqrt_results
= map { sqrt $_; } @results;
mapÀ̳ª grepÀÇ {}¾È¿¡¼ °úµµÇÏ°Ô ¸¹Àº ¸í·É¹®À» »ç¿ëÇÏ´Â °æ¿ì´Â À§ÀÇ ±ÔÄ¢À» Àû¿ëÇÏÁö ¾Ê½À´Ï´Ù. ±×·¸Áö¸¸ ÀÌ·¸°Ô map°ú grep¾È¿¡¼ ¸¹Àº ¸í·É¹®À» »ç¿ëÇÏ´Â °ÍÀº ÁÁÀº ¼±ÅÃÀÌ ¾Æ´Õ´Ï´Ù. {}¾È¿¡¼ ¸¹Àº ¸í·É¹®À» »ç¿ëÇØ¾ß ÇÑ´Ù¸é ±× ¸í·É¹®µéÀ» ¼ºê·çƾ ¾È¿¡ ³Ö½À´Ï´Ù.
½°Ç¥(Commas)¿©·¯ ÁٷΠǥÇöÇÏ´Â ¸®½ºÆ®´Â ¸ðµç °ªµé ´ÙÀ½¿¡ ½°Ç¥¸¦ ³Ö½À´Ï´Ù. ¼¼¹ÌÄÝ·ÐÀÌ ¸í·É¹®À» ±¸ºÐÇÑ´Ù¸é ½°Ç¥´Â ¸®½ºÆ®ÀÇ °ªµéÀ» ±¸ºÐÇÕ´Ï´Ù. °ªÀ» ±¸ºÐÇÑ´Ù´Â Ãø¸é¿¡¼ ½°Ç¥¸¦ Á¾°áÀÚ(¼¼¹ÌÄÝ·Ð)°ú µ¿ÀÏÇÏ°Ô ´Ù·ì´Ï´Ù. Áï ¸ðµç °ªµé ´ÙÀ½¿¡ ½°Ç¥¸¦ ³Ö½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù:
my @dwarves = (
'Happy',
'Sleepy',
'Dopey',
'Sneezy',
'Grumpy',
'Bashful',
'Doc',
);
ÀÌ ¸®½ºÆ®ÀÇ ¼ø¼¸¦ ¹Ù²Ù´Â °ÍÀº ½¬¿î ÀÏÀÔ´Ï´Ù. ´ÜÁö Àß¶ó³»°í ºÙÀÌ¸é ±×¸¸ÀÔ´Ï´Ù:
my @dwarves = (
'Bashful',
'Doc',
'Dopey',
'Grumpy',
'Happy',
'Sleepy',
'Sneezy',
);
¸¸¾à¿¡ ¿ø·¡ÀÇ ¸®½ºÆ®¿¡¼ 'Doc' ´ÙÀ½¿¡ ½°Ç¥¸¦ Ç¥±âÇÏÁö ¾Ê¾Ò´Ù¸é ¼ø¼¸¦ ¹Ù²Ù°í ³ ´ÙÀ½ ÄÚµå´Â ¿øÄ¡ ¾Ê´Â °á°ú¸¦ ÃÊ·¡ÇÕ´Ï´Ù:
my @dwarves = (
'Bashful',
'Doc'
'Dopey',
'Grumpy',
'Happy',
'Sleepy',
'Sneezy',
);
ÁÙ ±æÀÌ(Line Lengths)ÇÑ ÁÙÀ» 78ÄÀ¸·Î »ç¿ëÇÕ´Ï´Ù. °íÇØ»óµµÀÇ ¸ð´ÏÅÍ¿Í ¾ÈƼ-¾Ù¸®¾î½º ÆùÆ® µî Çö´ëÀÇ Àåºñ¿¡¼ Å͹̳ΠÀ©µµ¿ìÀÇ ÇÑ ÁÙÀÇ ±æÀ̸¦ 300ÄÀ¸·Î ÇÏ´Â °ÍÀº ¹®Á¦°¡ ¾Æ´Õ´Ï´Ù. Á¦¹ß ±×·¯Áö¸»±æ ¹Ù¶ø´Ï´Ù. Ãâ·Â ¹®¼, VGA µð½ºÇ÷¹ÀÌ ÀåÄ¡, ÇÁ¸®Á¨Å×ÀÌ¼Ç ¼ÒÇÁÆ®¿þ¾î, ¿¾³¯ ½ºÅ¸ÀÏÀÇ °ü¸®ÀÚ¿Í °°Àº ÇѰ踦 »ý°¢Çϵµ·Ï ÇÕ´Ï´Ù. text-wrapping ij¸¯ÅͰ¡ ÀÖ´Â ¸î¸îÀÇ Å͹̳ΰú ¿¡µðÅͱâ, ±×¸®°í ¸ÞÀÏ ½Ã½ºÅÛÀ» »ý°¢ÇÑ´Ù¸é 80ĵµ ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù. vi ¿¡¼´Â ¿À¸¥ÂÊ ¸¶ÁøÀ» ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù:
set textwidth=78
Emacs ¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÕ´Ï´Ù:
(setq fill-column 78)
(setq auto-fill-mode t)
78ÄÀ» »ç¿ëÇÒ ¶§ÀÇ ¶Ç ´Ù¸¥ ÀåÁ¡Àº ÀÌ ¸ÞÀÏÀ» ÅëÇØ º¸³¾ ¶§ Àû¾îµµ ÇѹøÀº ·¡ÇÎ(wrapping)µÇ´Â °ÍÀ» ¸·À» ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. (À̸ÞÀÏ ´äÀåÀ» º¸³¾ ¶§ ¹®ÀÚ¿ ¾Õ¿¡ '> '°¡ ºÙ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.)
µé¿©¾²±â(Indentation)4ÄÀÇ µé¿©¾²±â¸¦ »ç¿ëÇÕ´Ï´Ù. µé¿©¾²±âÀÇ ±íÀÌ´Â ÁÙ ±æÀ̺¸´Ù ´õ ¸¹Àº ³íÀïÀ» ºÒ·¯ÀÏÀ¸Åµ´Ï´Ù. ³× ¸íÀÇ ÇÁ·Î±×·¡¸Ó¿¡°Ô ÀûÇÕÇÑ µé¿©¾²±âÀÇ ±íÀÌ¿¡ ´ëÇØ¼ ¹¯´Â´Ù¸é ¾Æ¸¶µµ ³× °¡Áö ´Ù¸¥ ´äÀ» ¾òÀ» ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. 2Ä?, 3Ä?, 4Ä, ¶Ç´Â 8Ä... ±×¸®°í ¿©·¯ºÐ ¿ª½Ã ±× ³íÀïÀ» °Ý·ÄÇÏ°Ô ¸¸µé °ÍÀÔ´Ï´Ù. ±íÀº µé¿©¾²±â´Â ±¸Á¶ÀûÀ¸·Î °¡µ¶¼ºÀ» ³ôÀ̳ª ¹®¸ÆÀû °¡µ¶¼ºÀº ¶³¾îÁý´Ï´Ù. ¾èÀº ±íÀÌÀÇ µé¿©¾²±â´Â À§¿Í ¹Ý´ëÀÔ´Ï´Ù. ¾î·µç PerlÀ» »ç¿ëÇÑ´Ù¸é 4ÄÀÇ µé¿©¾²±â¸¦ »ç¿ëÇϵµ·Ï ÇÕ´Ï´Ù. ¹°·Ð µé¿©¾²±â ·¹º§ÀÌ 4´Ü°è ÀÌ»óÀ¸·Î µé¾î°£´Ù¸é ÇÔ¼ö³ª ¸ðµâ·Î ºÐ¸®¸¦ ÇØ¾ßÇÒ °ÍÀÔ´Ï´Ù. ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù:
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2;
}
print $line;
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Ê½À´Ï´Ù:
# µé¿©¾²±â ±íÀÌ: 8
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2;
}
print $line;
}
# µé¿©¾²±â ±íÀÌ: 2
while (my $line = <>) {
chomp $line;
if ( $line =~ s{\A (\s*) -- (.*)}{$1#$2}xms ) {
push @comments, $2;
}
print $line;
}
ÅÇ(Tabs)ÅÇÀÌ ¾Æ´Ñ ½ºÆäÀ̽º·Î µé¿©¾²±â¸¦ ÇÕ´Ï´Ù. ¿¡µðÅͱ⿡¼ ÅǽºÆäÀ̽º¸¦ 4ÄÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù ÇÒÁö¶óµµ ÅÇ ¹®ÀÚ¸¦ »ç¿ëÇÏ´Â °ÍÀº ³ª»Û ¼±ÅÃÀÔ´Ï´Ù. ÇÁ¸°ÆÃÀ» Çϰųª ´Ù¸¥ Ãâ·Â ÀåÄ¡¿¡¼, ¶Ç´Â ¿öµå ÇÁ·Î¼¼¼ ¹®¼·Î ºÙ¿©³Ö°Å³ª ´Ù¸¥ ÅǽºÆäÀ̽ºÀÇ ¿¡µðÅÍ¿¡¼ º¼ ¶§ µ¿ÀÏÇÏ°Ô º¸ÀÌÁö ¾Ê½À´Ï´Ù. ±×·¯¹Ç·Î ÅÇÀ» ¾²°Å³ª, Åǰú ½ºÆäÀ̽º¸¦ È¥¿ëÇØ¼ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. µé¿©¾²±â´Â ½ºÆäÀ̽º·Î¸¸ ±¸¼ºÇϸç, ¾Õ¼ ³ª¿Â µé¿©¾²±â ±íÀÌ¿Í °ü·ÃÇÑ ·êÀ» Áö۵µ·Ï ÇÕ´Ï´Ù:
sub addarray_interval {
my ($var_name, $need_quotemeta) = @_;
$raw .= $var_name;
my $quotemeta = $need_quotemeta ? q{ map {quotemeta $_} }
: $EMPTY_STR
;
my $perl5pat
= qq{(??{join q{|}, $quotemeta \@{$var_name}})};
push @perl5pats, $perl5pat;
return;
}
µé¿©¾²±â ±íÀ̸¦ 4ÄÀ¸·Î ÇÏ°í °ø¹é ¹®ÀÚ¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù°í ÅÇ۸¦ »ç¿ëÇÏÁö ¸øÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ¸¹Àº Çö´ëÀûÀÎ ¿¡µðÅ͵éÀº ÅÇ ¹®ÀÚ¸¦ °ø¹é ¹®ÀÚ·Î È®ÀåÇÏ´Â ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. viÀÇ °æ¿ì:
set tabstop=4 "An indentation level every four columns"
set expandtab "Convert all tabs typed into spaces"
set shiftwidth=4 "Indent/outdent by four columns"
set shiftround "Always indent/outdent to the nearest tabstop"
EmacsÀÇ °æ¿ì(using ``cperl'' mode):
(defalias 'perl-mode 'cperl-mode)
;; 4 space indents in cperl mode
'(cperl-close-paren-offset -4)
'(cperl-continued-statement-offset 4)
'(cperl-indent-level 4)
'(cperl-indent-parens-as-block t)
'(cperl-tab-always-indent t)
ºí·Ï(Blocks)Àý´ë·Î °°Àº ÁÙ¿¡ µÎ °³ÀÇ ¸í·É¹®À» ÀÛ¼ºÇÏÁö ¾Ê½À´Ï´Ù. ´ÙÀ½°ú ÀÛ¼ºÇÏÁö ¾Ê½À´Ï´Ù:
RECORD:
while (my $record = <$inventory_file>) {
chomp $record; next RECORD if $record eq $EMTPY_STR;
my @fields = split $FIELD_SEPARATOR, $record; update_sales(\@fields);$count++;
}
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù:
RECORD:
while (my $record = <$inventory_file>) {
chomp $record;
next RECORD if $result eq $EMTPY_STR;
my @fields = split $FIELD_SEPARATOR, $record;
update_sales(\@fields);
$count++;
}
ÀÌ ±ÔÄ¢Àº ¸í·É¹®ÀÌ Çϳª¸¦ ³Ñ¾î°¡´Â map°ú grep ºí·Ï¿¡µµ Àû¿ëÇϵµ·Ï ÇÕ´Ï´Ù:
my @clean_words
= map {
my $word = $_;
$word =~ s/$EXPLETIVE/[DELETED]/gxms;
$word;
} @raw_words;
´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:
my @clean_words
= map { my $word = $_; $word =~ s/$EXPLETIVE/[DELETED]/gxms; $word; } @raw_words;
ûũ, µ¢¾î¸®(Chunking)ÄÚµå´Â ´Ü¶ô(paragraph) ÇüÅ·ΠÀÛ¼ºÇÕ´Ï´Ù. ´Ü¶ô(paragraph)Àº ´ÜÀÏÇÑ ÀÛ¾÷À» ¼öÇàÇÏ´Â ¸í·É¹®ÀÇ ÁýÇÕÀÔ´Ï´Ù. ¹®Çп¡¼ ´Ü¶ôÀº ÇϳªÀÇ »ý°¢À» ³ªÅ¸³»´Â ¹®ÀåµéÀÇ ÁýÇÕÀÔ´Ï´Ù. ÇÁ·Î±×·¡¹Ö¿¡¼ ´Ü¶ôÀº ¾Ë°í¸®ÁòÀÇ ÇÑ ´Ü°è(single step)ÀÇ ±¸ÇöÀ» À§ÇÑ ¸í·É¾îÀÇ ÁýÇÕÀÔ´Ï´Ù. ÄÚµåÀÇ °¢ Á¶°¢À» ÇÑ ´Ü°è¸¦ ¼öÇàÇÏ´Â ½ÃÄö½º´ë·Î ³ª´©°í, °¢°¢ÀÇ ½ÃÄö½º »çÀÌ´Â ÇϳªÀÇ ºó ÁÙÀ» »ðÀÔÇÕ´Ï´Ù. ÄÚµåÀÇ À¯Áöº¸¼ö¸¦ ½±°Ô ÇϱâÀ§ÇØ °¢°¢ÀÇ ´Ü¶ôÀÇ ½ÃÀÛ ¾Õ¿¡´Â ¸í·É¹®µéÀÇ ½ÃÄö½º°¡ ¹«¾ùÀ» ÇÏ´ÂÁö¿¡ ´ëÇÑ 1Á٠¥¸® ÁÖ¼®À» ´Þµµ·Ï ÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:
# Process an array that has been recognized...
sub addarray_internal {
my ($var_name, $needs_quotemeta) = @_;
# Cache the original...
$raw .= $var_name;
# Build meta-quoting code, if requested...
my $quotemeta = $needs_quotemeta ? q{map {quotemeta $_} } : $EMPTY_STR;
# Expand elements of variable, conjoin with ORs...
my $perl5pat = qq{(??{join q{|}, $quotemeta \@{$var_name}})};
# Insert debugging code if requested...
my $type = $quotemeta ? 'literal' : 'pattern';
debug_now("Adding $var_name (as $type)");
add_debug_mesg("Trying $var_name (as $type)");
return $perl5pat;
}
»ç¶÷ÀÌ ¼ø°£ÀûÀ¸·Î ÁýÁßÇØ¼ ±â¾ïÇÒ ¼ö ÀÖ´Â °ø°£ÀÌ Å©Áö ¾Ê±â ¶§¹®¿¡ ´Ü¶ô º°·Î ³ª´©¾î ÄÚµùÀ» Çϸé ÀбⰡ ½¬¿öÁö¸ç °¢°¢ÀÇ ´Ü¶ô¿¡ ÁýÁßÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ´Ü¶ôÀº ³í¸®ÀûÀÎ ±¸Á¶¸¦ ¹°¸®ÀûÀÎ ±¸Á¶·Î ¹Ý¿µÇÏ¸ç ¶ÇÇÑ °Á¶ÇÕ´Ï´Ù. °¢ ´Ü¶ôÀÇ ½ÃÀÛ¿¡ ÁÖ¼®À» ´Þ¾Æ ¸í½ÃÀûÀ¸·Î °¢°¢ÀÇ µ¢¾î¸®(chunk)ÀÇ ¸ñÀû¿¡ ´ëÇØ ¿ä¾àÇÔÀ¸·Î½á µ¢¾î¸® º°·Î ³ª´©´Â °ÍÀ» °ÈÇÒ ¼ö ÀÖ½À´Ï´Ù. ÁÖ¼®Àº °¢°¢ÀÇ µ¢¾î¸®ÀÇ µ¿ÀÛ(actions)¿¡ ´ëÇØ ¾ð±ÞÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¸ñÀû(purpose), ¿Ö ÀÌ Äڵ尡 ÇÊ¿äÇѰ¡? ¿¡ ´ëÇØ¼ ¾ð±ÞÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¸Áö¸¸ ´Ü¶ôÀÇ ³»¿ëÀº µÎ ¹øÂ°·Î Áß¿äÇÕ´Ï´Ù. ´Ü¶ô º°·Î ¼öÁ÷ÀûÀÎ °¸(ºó ÁÙ)ÀÌ Á¤¸» Áß¿äÇÏ´Ù´Â ¸»ÀÔ´Ï´Ù. ÀÌ°Í ¾øÀÌ´Â ÁÖ¼®À» °è¼Ó À¯ÁöÇÑ´Ù°í ÇÏ´õ¶óµµ ÄÚµåÀÇ °¡µ¶¼ºÀº Çö°ÝÇÏ°Ô ¶³¾îÁý´Ï´Ù:
# Process an array that has been recognized...
sub addarray_internal {
my ($var_name, $needs_quotemeta) = @_;
# Cache the original...
$raw .= $var_name;
# Build meta-quoting code, if requested...
my $quotemeta = $needs_quotemeta ? q{map {quotemeta $_} } : $EMPTY_STR;
# Expand elements of variable, conjoin with ORs...
my $perl5pat = qq{(??{join q{|}, $quotemeta \@{$var_name}})};
# Insert debugging code if requested...
my $type = $quotemeta ? 'literal' : 'pattern';
debug_now("Adding $var_name (as $type)");
add_debug_mesg("Trying $var_name (as $type)");
return $perl5pat;
}
|

