¸ÞÀÎȨ | ÆÞ¸¶´Ï¾Æ ¼Ò°³ | ÀÚÀ¯ °Ô½ÃÆÇ | ¹®¼­¸ðÀ½ | °ü¸®ÀÚ¸ÞÀÏ  
print  comment


Á¦¸ñ

ÆÞ(Perl) ÄÚµù ½ºÅ¸ÀÏ(Code Layout)


½ÃÀÛÇϸç

¸¹Àº »ç¶÷µéÀº ÆÞ(Perl)ÀÇ Äڵ忡 ´ëÇØ µÎ·Á¿òÀ» °¡Áö°í ÀÖ½À´Ï´Ù. °ÆÁ¤ÇÏÁö ¸¶¼¼¿ä. ´ëºÎºÐÀÇ °æ¿ì ÀÌ·± ¿ÀÇØ´Â °æÇèÇØº¸Áö ¸øÇÑ »óÅÂÀÇ ¸·¿¬ÇÑ °ÆÁ¤ÀÎ °æ¿ì°¡ ´ëºÎºÐÀÔ´Ï´Ù. ¾î¶² ¾ð¾î¶óµµ ÀϰüµÇ°í Áö¼ÓÀûÀ̸ç, ±ò²ûÇÑ ÄÚµù ½ºÅ¸ÀÏÀ» ÁöŰÁö ¾Ê´Â´Ù¸é ÀÌÇØÇϱ⠾î·Á¿ì¸ç, ¹ö±×¸¦ Àâ´Â °Íµµ, ¼öÁ¤À» ÇÏ´Â °Íµµ ½¬¿î ÀÏÀÌ ¾Æ´Õ´Ï´Ù. ÀÌ ¹®¼­´Â ÆÞ ÇÁ·Î±×·¥À» °ß°íÇϸç È¿À²ÀûÀ̰í, À¯Áöº¸¼ö°¡ ¼Õ½¬¿î Äڵ带 ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù.


ÄÚµù ½ºÅ¸ÀÏÀ̶õ ¹«¾ùÀԴϱî?

µ¿ÀÏÇÑ Ç¥Çö

- Æ÷¸ËÆÃ(Formatting)
- µé¿©¾²±â(Indentation)
- ½ºÅ¸ÀÏ(Style)
- ÄÚµå ·¹À̾ƿô(Code Layout)


¿Ö ÄÚµù ½ºÅ¸ÀÏÀ» ÁöÄÑ¾ß Çϳª¿ä?

¿Ã¹Ù¸¥ ÄÚµù ½ºÅ¸ÀÏÀº °ß°íÇϰí, È¿À²ÀûÀ̸ç, À¯Áöº¸¼ö°¡ ¼Õ½¬¿î Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇÕ´Ï´Ù. ¾Æ·¡ÀÇ ÄÚµù ½ºÅ¸ÀÏÀº ·êÀÌ ¾Æ´Ï¶ó °¡À̵å¶óÀÎÀÔ´Ï´Ù. Áï ÀÌ·± ·êÀ» µû¸£±â¸¦ ¿©·¯ºÐ¿¡°Ô ±Ç°íÇÏ´Â °ÍÀÔ´Ï´Ù. ¸¸¾à µ¿ÀÇÇÒ ¼ö ¾ø´Â ºÎºÐÀÌ ÀÖ´Ù¸é ÆÀ¿øµé°ú ¿©·¯¹ø ¼÷°íÇÏ°í ³íÀǸ¦ °ÅÄ£´ÙÀ½ ÇÁ·ÎÁ§Æ®¿Í ÆÀ¿øµé¿¡°Ô °¡Àå Àû´çÇÑ ÄÚµù ½ºÅ¸ÀÏÀ» ¼±ÅÃÇÏ¸é µË´Ï´Ù. ´Ü Áß¿äÇÑ °ÍÀº ÀϰüµÇ°í, Áö¼ÓÀûÀ¸·Î ÇϳªÀÇ ÄÚµù ½ºÅ¸ÀÏÀ» À¯ÁöÇØ¾ß ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù.

¼Ò°³ÇÏ´Â °¡À̵å¶óÀεéÀº ºñ´Ü ÆÞ »Ó¸¸¾Æ´Ï¶ó ´Ù¸¥ ÇÁ·Î±×·¡¹Ö½Ã¿¡µµ µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. ³í¶õÀÇ ¿©Áö°¡ ÀÖ´Ù¸é, Àû¾îµµ ÆÞ·Î Äڵ带 ÀÛ¼ºÇÒ ¶§ ¸¸Å­ÀÌ¶óµµ °¡À̵å¶óÀÎÀ» ÁöŰ·Á´Â ³ë·ÂÀ» ÇÏ´Â °ÍÀ» ÃßõÇÕ´Ï´Ù. ÀÌ ´Ü¶ôÀÇ ¸ðµç °¡À̵å¶óÀÎÀº CPANÀÇ ±½Á÷±½Á÷ÇÑ ¸ðµâÀÇ ÀúÀÚÀÎ Damian ConwayÀÇ Perl Best Practices(O'REILLY)¿¡¼­ ¹ßÃéÇß½À´Ï´Ù.


ÆÞ Ä¿¹Â´ÏƼ°¡ ÃßõÇÏ´Â °¡À̵å¶óÀÎ

°ýÈ£·Î ¹­´Â ¹æ¹ý(Bracketing)

Áß°ýÈ£({}, brace)¿Í ¼Ò°ýÈ£((), parenthesize)´Â K&R ½ºÅ¸ÀÏÀ» µû¸¨´Ï´Ù.

ÄÚµå ºí·ÏÀ» ¼³Á¤ÇÒ ¶§´Â K&R Çü½ÄÀÇ ºê¶óÄÏÆÃÀ» »ç¿ëÇÕ´Ï´Ù. ºí·ÏÀ» Á¦¾îÇÏ´Â ÄÁ½ºÆ®·°Æ®ÀÇ ³¡¿¡ °ýÈ£¸¦ ¿±´Ï´Ù. ´ÙÀ½ ÁÙ¿¡¼­ ÇÑ ·¹º§ÀÇ µé¿©¾²±â¸¦ ÇÑ ÈÄ ³»¿ëÀ» ÀÛ¼ºÇÕ´Ï´Ù. ºí·ÏÀ» Á¦¾îÇÏ´Â ÄÁ½ºÆ®·°Æ®¿Í µ¿ÀÏÇÑ µé¿©¾²±â ¼öÁØ¿¡¼­ °ýÈ£¸¦ ´Ýµµ·Ï ÇÕ´Ï´Ù.

»ç¿ë ¿¹:

- ¿©·¯ ÁÙ¿¡ °ÉÃÄ ¸®½ºÆ®¸¦ ¼³Á¤ÇÒ ¶§
- for, while, if, unless µî Á¦¾î ¹®À» »ç¿ëÇÒ ¶§
    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;
    }

Else(Elses)

else ±¸¹®À» ºÙ¿© ¾²Áö ¾Ê½À´Ï´Ù.

else ±¸¹®À» ºÙ¿©¾²¸é ´ÙÀ½°ú °°½À´Ï´Ù:

    } else {

else ±¸¹®Àº ºÙ¿© ¾²Áö ¾Ê½À´Ï´Ù:

    }
    else {

else ±¸¹®À» ºÙ¿©¾²´Â °æ¿ì ±×¿¡ »óÀÀÇÏ´Â if ±¸¹®°ú ½Ã°¢ÀûÀ¸·Î ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¹Ç·Î °¡µ¶¼ºÀÌ ¶³¾îÁý´Ï´Ù. ¶ÇÇÑ else ¸¦ »ç¿ëÇÏ´Â °ÍÀº if ¿¡ ´ëÇØ ´Ù¸¥ µ¿ÀÛÀ» ÇÏ´Â °ÍÀ» ÀǹÌÇϴµ¥ ÀÌ Â÷À̶ó´Â °ÍÀÌ ¾àÇØÁý´Ï´Ù(½Ã°¢ÀûÀÎ ¿äÀο¡ ÀÇÇØ). ¾Õ¼­ ¾ð±ÞÇÑ ÄÚµå´Â ´Ü¶ôº°·Î µ¢¾î¸®Á®¾ß Çϴµ¥ else ±¸¹®À» ºÙ¿©¾²Áö ¾ÊÀ¸¸é ÀÚ¿¬½º·¹ else ÀÌÀüÀÇ ´Ü¶ôÀº µ¢¾î¸®Á®¼­ else ÇϺΠ±¸¹®°ú ºÐ¸®¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    if ($sigil eq '$') {
        if ($subsigil eq '?') {
            $sym_table{ substr($var_name,2) } = delete $sym_table{$var_name};
            $internal_count++;
            $has_internal{$var_name}++;
        }
        else {
            ${$var_ref} = q{$sym_table{$var_name}};
            $external_count++;
            $has_external{$var_name}++;
        }
    }
    elsif ($sigil eq '@' && $subsigil eq '?' ) {
        @{ $sym_table{$var_name} }
            = grep {defined $_} @{$sym_table{$var_name}};
    }
    elsif ($sigil eq '%' && $subsigil eq '?' ) {
        delete $sym_table{$var_name}{$EMPTY_STR};
    }
    else {
        ${$var_ref} = q{$sym_table{$var_name}};
    }

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    if ($sigil eq '$') {
        if ($subsigil eq '?') {
            $sym_table{ substr($var_name,2) } = delete $sym_table{$var_name};
            $internal_count++;
            $has_internal{$var_name}++;
        } else {
            ${$var_ref} = q{$sym_table{$var_name}};
            $external_count++;
            $has_external{$var_name}++;
        }
    } elsif ($sigil eq '@' && $subsigil eq '?' ) {
        @{ $sym_table{$var_name} }
            = grep {defined $_} @{$sym_table{$var_name}};
    } elsif ($sigil eq '%' && $subsigil eq '?' ) {
        delete $sym_table{$var_name}{$EMPTY_STR};
    } else {
        ${$var_ref} = q{$sym_table{$var_name}};
    }

¼öÁ÷ Á¤·Ä(Vertical Alignment)

´ëÀÀÇÏ´Â(À¯»çÇÑ, ÀÏÄ¡ÇÏ´Â, »óÀÀÇÏ´Â) ¾ÆÀÌÅÛµéÀº ¼öÁ÷ Á¤·ÄÇÕ´Ï´Ù.

Å×À̺íÀº °ü·ÃÀÖ´Â Á¤º¸¸¦ µ¢¾î¸® Áþ´Â Ä£¼÷ÇÑ ¹æ¹ýÀÔ´Ï´Ù. ±×¸®°í ¹°¸®ÀûÀÎ ·¹À̾ƿôÀ» »ç¿ëÇÔÀ¸·Î½á ³í¸®ÀûÀÎ °ü°è¸¦ °¡¸®Å³ ¼ö ÀÖ½À´Ï´Ù. Äڵ带 ÀÛ¼ºÇÒ ¶§ µ¥ÀÌÅ͸¦ Å×À̺íó·³ ÀÛ¼ºÇÏ´Â °ÍÀº À¯¿ëÇÕ´Ï´Ù. ÀϰüµÇ°Ô µé¿©¾²±â¸¦ ÇÏ¸é ±¸Á¶³ª, »ç¿ëÀ̳ª ¸ñÀû¿¡ ÀÖ¾î µ¿ÀÏÇÔÀ» ¿¹»óÇÒ ¼ö ÀÖ½À´Ï´Ù.

½ºÄ®¶ó º¯¼ö°¡ ¾Æ´Ñ ÇØ½¬³ª ¸®½ºÆ®´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù:

    my @months = qw(
        January     Febuary     March
        April       May         June
        July        August      September
        October     November    December
    );
    my %expansion_of = (
        q{it's}     => q{it is},
        q{we're}    => q{we are},
        q{didn't}   => q{did not},
        q{must've}  => q{must have},
        q{I'll}     => q{I will},
    );

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    my @months = qw(
        January Febuary March April May June July August September
        October November December
    );
    my %expansion_of = (
        q{it's} => q{it is}, q{we're} => q{we are}, q{didn't} => q{did not},
        q{must've} => q{must have}, q{I'll} => q{I will},
    );

À§¿Í °°Àº Å×À̺í ÇüÅÂÀÇ Á¢±Ù ¹æ¹ýÀº °ü·Ã º¯¼öÀÇ °ªÀ» ÇÒ´çÇÏ´Â ½ÃÄö½º¿¡¼­µµ Àû¿ë Çϵµ·Ï ÇÕ´Ï´Ù. ÇÒ´ç ¿¬»êÀÚ¸¦ Á¤·ÄÇϵµ·Ï ÇÕ´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    $name   = standardize_name($name);
    $age    = time - $birth_date;
    $status = 'active';

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    $name = standardize_name($name);
    $age = time - $birth_date;
    $status = 'active';

ÇØ½¬ ¿£Æ®¸®³ª ¸®½ºÆ®ÀÇ ¿ø¼Ò¸¦ ÇÒ´çÇÏ´Â °Í ¿ª½Ã Áß¿äÇÕ´Ï´Ù. ÀÌ·± °æ¿ì ÀÌ·¯ÇÑ Å°³ª À妽º´Â Ä­¿¡ ¸Â°Ô Á¤·ÄÇÕ´Ï´Ù. Ű¿Í À妽º¸¦ µÑ·¯½Ñ °ýÈ£ ¿ª½Ã Á¤·ÄÇÕ´Ï´Ù:

    $indent{ name   } = standardize_name($name);
    $indent{ age    } = time - $birth_date;
    $indent{ status } = 'active';

Å×À̺í ÇüÅÂÀÇ ·¹À̾ƿôÀÌ ¿£Æ®¸®ÀÇ Å°ÀÇ Á¢±ÙÀ» ¾ó¸¶³ª °­Á¶Çؼ­ º¸¿©ÁÖ´ÂÁö ÁÖ¸ñÇÕ´Ï´Ù. ±× ¶§¹®¿¡ °¢°¢ÀÇ ÇÒ´çÀÇ ¸ñÀûÀÌ µÎµå·¯Áý´Ï´Ù. ÀÌ·¯ÇÑ ·¹À̾ƿôÀÌ ¾ø´Ù¸é $indent Á¢µÎ»ç¸¦ Á¦¿ÜÇϰí´Â ±¸ºÐÇϱⰡ ¾î·Á¿öÁý´Ï´Ù:

    $indent{name} = standardize_name($name);
    $indent{age} = time - $birth_date;
    $indent{status} = 'active';

ÇÒ´ç ¿¬»êÀÚ¸¦ Á¤·ÄÇϰí ÇØ½¬Å°¸¦ Á¤·ÄÇÏÁö ¾ÊÀº °ÍÀº Á¤·ÄÇÏÁö ¾ÊÀº °Íº¸´Ù´Â ³´½À´Ï´Ù. ±×·¸Áö¸¸ µÑ´Ù Á¤·ÄÇÑ °Í¿¡ ºñÇØ °¡µ¶¼ºÀÌ ¶³¾îÁý´Ï´Ù:

    $indent{ name }     = standardize_name($name);
    $indent{ age }      = time - $birth_date;
    $indent{ status }   = 'active';

±ä ÁÙ ³ª´©±â(Breaking Long Lines)

±ä Ç¥Çö½Ä(expression)Àº ¿¬»êÀÚ ¾Õ¿¡¼­ ³ª´¯´Ï´Ù.

Ç¥Çö½Ä(expression)ÀÌ ±æ °æ¿ì ¿¬»êÀÚ ´ÙÀ½¿¡¼­ ³ª´©°í ³ª´« µÞ ºÎºÐÀº ÇϳªÀÇ µé¿©¾²±â ±íÀ̸¦ °¡Áö°í ÀÛ¼ºÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÔ´Ï´Ù:

    push @steps, $steps[-1] +
        $radial_velocity * $elapsed_time +
        $orbital_velocity * ($phase + $phase_shift) -
        $DRAG_COEFF * $altitude;

ÀÌ·¸°Ô ÀÛ¼ºÇÏ´Â °ÍÀº ¿¬»êÀÚ°¡ ÁÙ ³¡¿¡¼­ ¿¬°áÀÚ ¿ªÇÒÀ» ÇÏ¿© Ç¥Çö½ÄÀÌ ´ÙÀ½ ÁÙ¿¡¼­ °è¼Ó À̾îÁú °ÍÀ̶ó°í »ý°¢ÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.

¿¬»êÀÚ¸¦ °¢ ÁÙ °£ÀÇ ¿¬°áÀÚ ¿ªÇÒÀ» ÇÏ°Ô ÇÏ´Â °ÍÀº ÁÁÀº »ý°¢ÀÔ´Ï´Ù. ±×·¸Áö¸¸ »ç¶÷µéÀº ´ëºÎºÐ ÄÚµåÀÇ ¿À¸¥ÂÊ ³¡À» À¯½ÉÈ÷ º¸Áö ¾Ê´Â´Ù´Â °ÍÀÌ ¹®Á¦ÀÔ´Ï´Ù. ´ëºÎºÐÀÇ Áß¿äÇÑ ÀǹÌÀû(semantic) ÈùÆ®´Â - Ű¿öµå ¸»ÀÔ´Ï´Ù. - ÄÚµåÀÇ ¿Þ Æí¿¡ ³ªÅ¸³³´Ï´Ù. ¿¬»êÀÚ¸¦ È®ÀÎÇϱâ À§ÇØ ¿À¸¥ÂÊ ³¡±îÁö ´«À» À̵¿ÇØ¾ß ÇÕ´Ï´Ù.

±×·¯¹Ç·Î ±ä Ç¥Çö½ÄÀ» ¿©·¯ ÁÙ·Î ³ª´©¾î¼­ Ç¥±âÇÒ ¶§´Â ¿¬»êÀÚ Á÷Àü¿¡ ÁÙ ¹Ù²ÞÀ» ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é ¿©·¯ ÁÙ·Î ³ª´©¾îÁø °¢°¢ÀÇ Ç¥Çö½ÄÀº ¿¬»êÀÚ·Î ½ÃÀÛÇÏ°Ô µÇ°í »ç½Ç Perl Äڵ忡¼­ »ç¿ëÇϱ⠾˸ÂÁö ¾Ê½À´Ï´Ù. ÀÌ ¹æ¹ýÀº Àд »ç¶÷ÀÌ ¿ÞÂÊ ¿©¹éÀ» ±âÁØÀ¸·Î Äڵ带 ÈȾ°Ô µÇ¸ç, °¢ ÁÙÀº ¿¬»êÀÚ·Î ½ÃÀÛÇϱ⠶§¹®¿¡ ¿¬°áµÇ¾î ÀÖÀ½À» ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù.

¶ÇÇÑ µÎ ¹øÂ° ÁÙ°ú ±× ÀÌÈÄÀÇ ÁÙµéÀÇ µé¿©¾²±â ¿ª½Ã Áß¿äÇÕ´Ï´Ù. ÀÌ ÁÙµéÀº ´Ü¼øÈ÷ ÇϳªÀÇ µé¿©¾²±â·Î´Â ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù. ´ë½Å ÇØ´ç ÁÙµéÀÌ ¼ÓÇØ ÀÖ¾î¾ßÇϴ ǥÇö½ÄÀÇ Ä­ÀÇ ½ÃÀÛ À§Ä¡¿¡ ¸ÂÃß¾î µé¿©¾²±â¸¦ ÇÕ´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ´Â °Íº¸´Ù:

    push @steps, $steps[-1]
        + $radial_velocity * $elapsed_time
        + $orbital_velocity * ($phase + $phase_shift)
        - $DRAG_COEFF * $altitude
        ;

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    push @steps, $steps[-1]
                 + $radial_velocity * $elapsed_time
                 + $orbital_velocity * ($phase + $phase_shift)
                 - $DRAG_COEFF * $altitude
                 ;

ÀÌ·¯ÇÑ ½ºÅ¸ÀÏÀ» »ç¿ëÇÒ °æ¿ì pushÀÇ µÎ ÀÎÀÚ¸¦ ½Ã°¢ÀûÀ¸·Î ½±°Ô ±¸ºÐÇÒ ¼ö ÀÖ´Ù´Â Ãß°¡ÀûÀÎ ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¶ÇÇÑ ÀÌ·¸°Ô ÀÛ¼ºÇÒ °æ¿ì ¼¼¹ÌÄÝ·ÐÀ» µû·Î ºÐ¸®ÇÕ´Ï´Ù. ±×¸®°í ¼¼¹ÌÄÝ·ÐÀº ÀÌÀüÀÇ ÄÚµå¿Í °°Àº µé¿©¾²±â ±íÀ̸¦ ¸ÂÃä´Ï´Ù. Ç¥Çö½ÄÀÌ ´õ ±æ¾îÁ®¼­, ´õ ¸¹Àº ÁÙ·Î ³ª´©¾îÁ®¾ß ÇÒ ¶§ Àд »ç¶÷Àº ¼¼¹ÌÄÝ·ÐÀ» ¸¸³µÀ»¶§ ½±°Ô Ç¥Çö½ÄÀÌ ³¡³µÀ½À» ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù.

¸¶Áö¸· Ç¥Çö½ÄÀÌ ¾Æ´Ñ °æ¿ì(Non-Terminal Expression)

¸í·É¹®(statement)ÀÇ Áß°£¿¡ ÀÖ´Â ±ä Ç¥Çö½ÄÀº »©³À´Ï´Ù.

¹Ù·Î ÀÌÀüÀÇ °¡À̵å¶óÀÎÀº ´ÙÀ½°ú °¥Àº °æ¿ì¿¡¸¸ Àû¿ëÇÕ´Ï´Ù. ¸í·É¹®¿¡¼­ ±ä Ç¥Çö½ÄÀÌ °¡Àå ¸¶Áö¸· °ªÀÏ ¶§ ÇÑÇØ¼­ Àß¶ó¾ßÇÕ´Ï´Ù. ¸¸¾à Ç¥Çö½ÄÀÌ ¸í·É¹®ÀÇ Áß°£¿¡ ³ªÅ¸³­´Ù¸é º°°³ÀÇ º¯¼ö ÇÒ´çÀ» ÅëÇØ ºÐ¸®ÇÕ´Ï´Ù.

´ÙÀ½°ú °¥ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    my $next_step = $steps[-1]
                    + $radial_velocity * $elapsed_time
                    + $orbital_velocity * ($phase + $phase_shift)
                    - $DRAG_COEFF * $altitude
                    ;
    add_step( \@steps, $next_step, $elapsed_time );

´ÙÀ½°ú °¥ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    add_step( \@steps, $steps[-1],
                       + $radial_velocity * $elapsed_time
                       + $orbital_velocity * ($phase + $phase_shift)
                       - $DRAG_COEFF * $altitude
                       , $elapsed_time );
                       ;

¿ì¼±¼øÀ§¸¦ Àû¿ëÇØ¼­ ³ª´©±â(Breaking by Precedence)

¾ðÁ¦³ª ±ä Ç¥Çö½Ä(expression)Àº °¡Àå ³·Àº °¡´ÉÇÑ ¿ì¼±¼øÀ§¸¦ ±âÁØÀ¸·Î ³ª´¯´Ï´Ù. (Always break along expression at the operator of the lowest possible precedence.)

ÀÌÀüÀÇ µÎ °¡À̵å¶óÀο¡¼­ º¸µíÀÌ Ç¥Çö½Ä(expression)À» ¿©·¯ ÁÙ·Î ³ª´­ ¶§´Â ³·Àº ¿ì¼±¼øÀ§ÀÇ ¿¬»êÀÚ ¾Õ¿¡¼­ ³ª´©µµ·Ï ÇÕ´Ï´Ù. ³ôÀº ¿ì¼±¼øÀ§ÀÇ ¿¬»êÀÚ ¾Õ¿¡¼­ ÁٹٲÞÀ» ÇÒ °æ¿ì Äڵ带 Àд »ç¶÷ÀÌ ½ÅÁßÇÏÁö ¸øÇÏ´Ù¸é Ç¥Çö½ÄÀ» À߸ø ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    push @steps, $steps[-1] + $radial_velocity
                 * $elapsed_time + $orbital_velocity
                 * ($phase + $phase_shift) - $DRAG_COEFF
                 * $altitude
                 ;

¸¸¾à¿¡ ¿ì¼±¼øÀ§°¡ Á¦ÀÏ ³·Áö ¾ÊÀº ¿¬»êÀÚ¿¡¼­ ÁÙÀ» ¹Ù²ã¾ß ÇÏ¸é ´ÙÀ½°ú °°ÀÌ ÇÑ ¼öÁØÀ» Ãß°¡ÀûÀ¸·Î µé¿©¾²±â ÇÕ´Ï´Ù (¿ªÁÖ: ½ÇÁ¦·Î ÅÇ۸¦ ´©¸£¸é ³× Ä­¸¸Å­ À̵¿ÇÏÁö ¾ÊÀ»¼öµµ ÀÖÀ¸¹Ç·Î ÀÌ °æ¿ì´Â ½ºÆäÀ̽º¸¦ ³× ¹ø ´©¸£´Â ¹æ¹ýÀ» ÅÃÇØ¾ß ÇÒ °Í °°½À´Ï´Ù.):

    push @steps, $steps[-1]
                 + $radial_velocity * $elapsed_time
                 + $orbital_velocity
                     * ($phase + $phase_shift)
                 - $DRAG_COEFF * $altitude
                 ;

ÀÌ ¹æ¹ýÀ» µû¸¥´Ù¸é Ç¥Çö½ÄÀÇ ºÎºÐµéÀÌ ½Ã°¢ÀûÀ¸·Î ³ôÀº ¿ì¼±¼øÀ§·Î µ¢¾î¸®Áý´Ï´Ù.

ÇÒ´ç(Assignments)

±ä ÇÒ´ç¹®Àº ÇÒ´ç ¿¬»êÀÚ ¾Õ¿¡¼­ ÁÙÀ» ºÐ¸®ÇÕ´Ï´Ù.

ÇÒ´ç¹®¿¡¼­ À§ÀÇ °¡À̵å¶óÀÎÀ» Àû¿ëÇÒ ¼ö ÀÖÀ¸³ª ÀÌ °æ¿ì ¹ÌÀû °¨°¢ÀÌ ¶³¾îÁú »Ó¸¸ ¾Æ´Ï¶ó Àб⠶ÇÇÑ Èûµì´Ï´Ù:

    $predicted_val = $average
                     + $predicted_change * $fudge_factor
                     ;

ÈξÀ ³ªÀº ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ÇÒ´ç ¿¬»êÀÚ ¾Õ¿¡¼­ ÁÙÀ» ¹Ù²Ù´Â °ÍÀÔ´Ï´Ù. ±×¸®°í ÇÒ´çÇÒ °ªÀ¸·Î ½ÃÀÛÇ쵂 ÇÑ ¼öÁØÀÇ µé¿©¾²±â¸¦ ÇÕ´Ï´Ù:

    $predicted_val
        = $average + $predicted_change * $fudge_factor;

ÀÌ ¹æ¹ýÀ» ¾²¸é ´ëºÎºÐÀÇ °æ¿ì ÇÑ ÁÙ¿¡ ÇÒ´çµÉ °ªÀ» Ç¥±âÇÒ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ ¹æ¹ýÀ» »ç¿ëÇßÀ½¿¡µµ ºÒ±¸ÇÏ°í ¿©ÀüÈ÷ ÇÒ´çÇÒ °ªÀÌ ±æ´Ù¸é ÀÌÀüÀÇ °¡À̵å¶óÀÎÀ» Àû¿ëÇÕ´Ï´Ù:

    $predicted_val
        = ($minimum + $maximum) / 2
          + $predicted_change * max($fudge_factor, $local_epsilon);

ÀÚÁÖ »ç¿ëÇÏ´Â ¶Ç ´Ù¸¥ Ç¥ÇöÀº ÇÒ´ç ¿¬»êÀÚ ´ÙÀ½À» ±âÁØÀ¸·Î ÁÙÀ» ³ª´©´Â °ÍÀÔ´Ï´Ù. À̰ÍÀº ÀÌÀü¿¡ ¾ð±ÞÇÑ °Í°ú °°Àº ´ÜÁ¡À» °¡Áý´Ï´Ù. ÇÒ´ç¹®À̶õ °ÍÀ» ¾Ë±â À§ÇØ ¿À¸¥ÂÊ ³¡±îÁö º¸¾Æ¾ßÇϸç, Ưº°ÇÑ Ç¥½Ã( = )¾øÀÌ µé¿©¾²±â¸¦ Ç߱⠶§¹®¿¡ Äڵ带 Àд »ç¶÷ÀÌ À߸ø ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Ê½À´Ï´Ù:

    $predicted_val = 
        $average + $predicted_change * $fudge_factor;

ÀÌ·± ¹æ¹ýÀº ÇÒ´çÇÒ º¯¼öÀÇ Ç¥±â°¡ ±æ¾îÁú °æ¿ì ƯÈ÷ ´õ ½ÉÇØÁý´Ï´Ù. µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    $predicted_val{$current_data_set}[$next_iteration] = 
        $average + $predicted_change * $fudge_factor;

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    $predicted_val{$current_data_set}[$next_iteration]
        = $average + $predicted_change * $fudge_factor;

»ïÇ׿¬»êÀÚ(Ternaries)

»ïÇ× ¿¬»êÀÚ´Â Ä­¿¡ ¸ÂÃß¾î ´Ü°èÀûÀ¸·Î(cascade) ÇüŸ¦ ¸ÂÃä´Ï´Ù.

»ïÇ× ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸é ±ä Ç¥Çö½Ä(expression)ÀÌ µÇ±â ½±½À´Ï´Ù. »ïÇ× ¿¬»êÀÚÀÇ ?¿Í :´Â ¸Å¿ì ³·Àº ¿ì¼±¼øÀ§¸¦ °¡Áö±â ¶§¹®¿¡ Ç¥Çö½ÄÀ» ³ª´©´Â À§ÀÇ °¡À̵å¶óÀÎÀº ÀûÇÕÇÏÁö ¾Ê½À´Ï´Ù. Àû¿ëÇÒ °æ¿ì ´ÙÀ½°ú °°Àº Àб⠾î·Á¿î Äڵ尡 µË´Ï´Ù:

    my $salute = $name eq $EMPTY_STR ? 'Customer'
                 : $name =~ m/\A((?:Sir|Dame) \s+ \S+)/xms ? $1
                 : $name =~ m/(.*), \s+ Ph[.]?D \z/xms ? "Dr $1" : $name;

ÃÖ¼±ÀÇ ¹æ¹ýÀº »ïÇ× ¿¬»êÀÚ¸¦ µÎ °³ÀÇ Ä­¿¡ Á¤·ÄÇÏ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

                 # When their name is...                      Address them as...
    my $salute = $name eq $EMPTY_STR                        ? 'Customer'
               : $name =~ m/\A((?:Sir|Dame) \s+ \S+) /xms   ? $1
               : $name =~ m/(.*), \s+ Ph[.]?D \z     /xms   ? "Dr $q"
               :                                              $name
               ;

¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù. ¸Å¹ø ÄÝ·Ð ¹Ù·Î ¾Õ¿¡¼­ »ïÇ× ¿¬»êÀÚ¸¦ ³ª´¯´Ï´Ù. ±×¸®°í ÄÝ·ÐÀº ù¹øÂ° Á¶°Ç ¾Õ¿¡ ÀÖ´Â ¿¬»êÀÚ¿Í ¼öÁ÷ Á¤·ÄÇÕ´Ï´Ù. °á±¹ ÄÝ·ÐÀ» ±âÁØÀ¸·Î Á¤·ÄÀÌ µÇ°í Á¶°ÇÀº ÄÝ·Ð ¹Ù·Î ´ÙÀ½¿¡ ¼öÁ÷ Á¤·ÄµË´Ï´Ù. »ïÇ× ¿¬»êÀÚÀÇ ?´Â °á°ú Ç׸ñÀ» Á¤·Ä½ÃŰ¹Ç·Î ÀÌ ¿ª½Ã ¼öÁ÷ Á¤·ÄÇÕ´Ï´Ù. ¸¶Áö¸·À¸·Î ¸¶Áö¸· °á°ú(Á¶°ÇÀÌ ¾ø´Â ºÎºÐÀ» ÀǹÌÇÕ´Ï´Ù.)´Â ÀÌÀüÀÇ °á°ú Ç׸ñ°ú µ¿ÀÏÇÑ À§Ä¡¿¡ ¼öÁ÷ Á¤·ÄÇϵµ·Ï ÇÕ´Ï´Ù.

ÀÌ·± Ưº°ÇÑ ·¹À̾ƿôÀº º¹ÀâÇϰí ÀÌÇØÇϱ⠾î·Á¿î »ïÇ× ¿¬»êÀÚ¸¦ ´Ü¼øÇÑ ·è-¾÷ Å×À̺í(simple look-up table)À¸·Î º¯È¯ÇÕ´Ï´Ù. ù ¹øÂ° Ä­ÀÇ Á¶°ÇÀÌ ÁÖ¾îÁö¸é µÎ ¹øÂ° Ä­ÀÇ °á°ú·Î À̵¿ÇÏ´Â °ÍÀÔ´Ï´Ù.

½ÉÁö¾î ÇϳªÀÇ »ïÇ× ¿¬»êÀÚ¸¦ °¡Áö°í ÀÖ´õ¶óµµ Å×À̺í½Ä Ç¥±â¸¦ »ç¿ëÇϵµ·Ï ÇÕ´Ï´Ù:

    my $name = defined $customer{name} ? $customer{name}
             :                           'Sir or Madam'
             ;

ÀÌ·¸°Ô »ç¿ëÇÒ °æ¿ì »ïÇ× ¿¬»êÀÚ¸¦ Ãß°¡ÇϱⰡ ½¬¿öÁý´Ï´Ù.

¸®½ºÆ®(Lists)

±ä ¸®½ºÆ®´Â °ýÈ£ ¾È¿¡ ³Ö½À´Ï´Ù.

½°Ç¥ ¿¬»êÀÚ´Â ½ºÄ®¶ó ¹®¸Æ¿¡¼­¸¸ ¿¬»êÀÚÀÔ´Ï´Ù. ¸®½ºÆ®¿¡¼­ ½°Ç¥´Â ¾ÆÀÌÅÛ ±¸ºÐÀÚÀÔ´Ï´Ù. µû¶ó¼­ ¸®½ºÆ®¸¦ ¿©·¯ ÁٷΠǥ±âÇÒ ¶§ ½°Ç¥´Â ¾ÆÀÌÅÛ Á¾°áÀÚ(terminator)·Î¼­ »ç¿ëÇÏ´Â °ÍÀÌ ÃÖ¼±ÀÇ ¹æ¹ýÀÔ´Ï´Ù. °Ô´Ù°¡ ½°Ç¥¿Í ¼¼¹ÌÄÝ·ÐÀº ºñ½ÁÇÏ°Ô »ý°å±â ¶§¹®¿¡ ¸í·É¹®(statements)°ú ¿©·¯ÁÙÀÇ ¸®½ºÆ®Àº Çò°¥¸± ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·± ÀáÀçÀûÀΠȥ¶õÀÌ ÀÖÀ¸¹Ç·Î ¿©·¯ ÁÙÀÇ ¸®½ºÆ®¸¦ ¸®½ºÆ®´ä°Ô ¸¸µå´Â °ÍÀº Áß¿äÇÕ´Ï´Ù. ±×·¯¹Ç·Î ¸®½ºÆ®¸¦ ¿©·¯ ÁÙ·Î ³ª´­ Çʿ䰡 ÀÖÀ» °æ¿ì °ýÈ£¸¦ »ç¿ëÇØ¼­ µÑ·¯½Îµµ·Ï ÇÕ´Ï´Ù. ¿©´Â °ýÈ£´Â À̰ÍÀÌ ¸®½ºÆ® ÀÓÀ» ¾Ë ¼ö ÀÖ°Ô ÇØÁÖ¸ç, ¶ÇÇÑ ´Ý´Â °ýÈ£´Â ¸®½ºÆ®°¡ ³¡³µÀ½À» ¸í¹éÇÏ°Ô ¾Ë ¼ö ÀÖ°Ô ÇÕ´Ï´Ù.

¸®½ºÆ®¸¦ ³ª´­ ¶§ ¿©´Â °ýÈ£´Â ¾ÕÀÇ ¸í·É¹®(statement)¿Í µ¿ÀÏÇÑ ÁÙ¿¡ À§Ä¡ÇÏ°Ô ÇÕ´Ï´Ù. ¸®½ºÆ®¸¦ ³ª´­ ¶§´Â ½°Ç¥ ´ÙÀ½ºÎÅÍ ³ª´¯´Ï´Ù. ±×¸®°í µÎ ¹øÂ° ÁÙºÎÅÍ µé¾î°¡´Â ³ª¸ÓÁö Ç׸ñÀº ÇÑ ¼öÁØÀÇ µé¿©¾²±â¸¦ Çϰí ÀÏÁ¤ÇÑ ¼öÀÇ ¾ÆÀÌÅÛÀ» ³ª¿­ÇÕ´Ï´Ù. ÀÌ ¾ÆÀÌÅÛµéÀº °¢±â ¼öÁ÷ Á¤·ÄÀ» ÇÕ´Ï´Ù. ¸¶Áö¸·À¸·Î ´Ý´Â °ýÈ£´Â ¿ø·¡ÀÇ ¸í·É¹®°ú µ¿ÀÏÇÑ ¼öÁØÀÇ µé¿©¾²±â·Î ¸ÂÃä´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇϵµ·Ï ÇÕ´Ï´Ù:

    my @months = qw(
        January     Febuary     March
        April       May         June
        July        August      Septermber
        October     November    December
    );
    for my $item (@requested_items) {
        push @items, (
            "A brand new $item",
            "A fully refurbished $item",
            "a ratty old $item",
        );
    }
    print (
        'Processing ',
        scalar(@items),
        ' items at ',
        time,
        "\n",
    );

¾Ë´Ù½ÃÇÇ ±¸¹®ÀûÀ¸·Î ½°Ç¥°¡ ÇÊ¿ä¾ø°ÚÁö¸¸, ¸®½ºÆ®ÀÇ ¸¶Áö¸· Ç׸ñÀÌ ¿©ÀüÈ÷ ½°Ç¥¸¦ °¡Áö°í ÀÖ¾î¾ßÇÏ´Â °ÍÀ» À¯ÀÇÇÕ´Ï´Ù.

¿©·¯ ÁÙ¿¡ °ÉÄ£ ¸®½ºÆ®¸¦ ÀÛ¼ºÇÒ ¶§´Â ¾ðÁ¦³ª °ýÈ£¸¦ »ç¿ëÇÕ´Ï´Ù. K&R ½ºÅ¸ÀÏÀÇ °ýÈ£¸¦ Àû¿ëÇÕ´Ï´Ù. ±×¸®°í °¢ ÁÙ¿¡´Â °°Àº ¼öÀÇ Ç׸ñÀ» °¡Á®¾ßÇÕ´Ï´Ù. ¶ÇÇÑ ¸®½ºÆ® ¹®¸Æ¿¡¼­ ½°Ç¥´Â ¿¬»êÀÚ(operator)°¡ ¾Æ´Ï¹Ç·Î ¿¬»êÀÚ ¾Õ¿¡¼­ ÁÙÀ» ³ª´©¶ó´Â °¡À̵å¶óÀÎÀ» Àû¿ëÇÏÁö ¾Ê½À´Ï´Ù.

´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÕ´Ï´Ù:

    my @months = qw( January    Febuary    March    April    May    June    July    August
                     Septermber    October    November    December
                    );
    for my $item (@requested_items) {
        push @items, "A brand new $item"
                   , "A fully refurbished $item"
                   , "a ratty old $item"
                   ;
    }
    print 'Processing '
          , scalar(@items)
          , ' items at '
          , time
          , "\n"
          ;

ÀÚµ¿ ·¹À̾ƿô(Automated Layout)

ÀÚµ¿À¸·Î ÀÌ·¯ÇÑ ·¹À̾ƿôÀ» ¼³Á¤ÇÕ´Ï´Ù. (Enforce your chosen layout style mechanically.) (perltidy ÅøÀ» »ç¿ëÇϽʽÿÀ!)

°¡Àå ÁÁÀº ¹æ¹ýÀº ÀϰüÀûÀ̰í, ÇÕ¸®ÀûÀ̰í, Àб⠽±°Ô Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ¿¬¸¶(training)ÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¸Áö¸¸ ½Ã°£°ú ³ë·ÂÀÇ ¹®Á¦·Î ÀÎÇØ À̰ÍÀÌ ¾ðÁ¦³ª °¡´ÉÇÏÁö ¸øÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± °æ¿ì °ø½ÄÀûÀ¸·Î Äڵ带 Ä¿¹ÔÇϰųª ¸®ºäÇϰųª µð½ºÇ÷¹ÀÌÇÒ ¶§ ÆÀ¿ø ¸ðµÎ°¡ Ç¥ÁØ ÄÚµå-Æ÷¸ËÆÃ ÅøÀ» »ç¿ëÇÏ°Ô ÇÏ´Â °Í°ú °°Àº ÇÕ¸®ÀûÀΠŸÇùÀ» ÇØ¾ßÇÕ´Ï´Ù.

PerlÀ» À§ÇÑ ÃÖ°íÀÇ ÄÚµå-Æ÷¸ÅÅÍ(code formatter)´Â perltidy ÀÔ´Ï´Ù. À̰ÍÀº SourceForge http://perltidy.sourceforge.net ¿¡¼­ ÀÚÀ¯·Ó°Ô ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ µé¿©¾²±â¿Í ºí·Ï ±¸ºÐÀÚ À§Ä¡, Ä­ ±âÁØ Á¤·Ä(column-like alignment), ÁÖ¼® À§Ä¡¸¦ ±¤¹üÀ§ÇÏ°Ô »ç¿ëÀÚ°¡ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

perltidy¸¦ »ç¿ëÇÏ¸é ¾Æ·¡¿Í °°Àº Äڵ带:

    if($sigil eq '$'){
        if($subsigil eq '?'){                        
            $sym_table{substr($var_name,2)}=delete $sym_table{locate_orig_var($var_name)};
            $internal_count++;$has_internal{$var_name}++
        } else {
            ${$var_ref} =
                q{$sym_table{$var_name}}; $external_count++; $has_external{$var_name}++;
    }} elsif ($sigil eq '@'&&$subsigil eq '?') {
        @{$sym_table{$var_name}} = grep
            {defined $_} @{$sym_table{$var_name}};
    } elsif ($sigil eq '%' && $subsigil eq '?') {
    delete $sym_table{$var_name}{$EMPTY_STR}; } else
    {
    ${$var_ref}
    =
    q{$sym_table{$var_name}}
    }

´ÙÀ½°ú °°ÀÌ Àбâ ÁÁ°Ô º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù:

    if ( $sigil eq '$' ) {
        if ( $subsigil eq '?' ) {
            $sym_table{ substr( $var_name, 2 ) }
                = delete $sym_table{ locate_orig_var($var_name) };
            $internal_count++;
            $has_internal{$var_name}++;
        }
        else {
            ${$var_ref} = q{$sym_table{$var_name}};
            $external_count++;
            $has_external{$var_name}++;
        }
    }
    elsif ( $sigil eq '@' && $subsigil eq '?' ) {
        @{ $sym_table{$var_name} } 
            = grep {defined $_} @{ $sym_table{$var_name} };
    }
    elsif ( $sigil eq '%' && $subsigil eq '?' ) {
        delete $sym_table{$var_name}{$EMPTY_STR};
    }
    else {
        ${$var_ref} = q{$sym_table{$var_name}};
    }

Áö±Ý±îÁö ¾ð±ÞÇÑ °¡À̵å¶óÀÎÀ» ¸ÂÃß±â À§ÇØ .perltidyrc ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ÆíÁýÇÕ´Ï´Ù:

    -l=78   # Max line width is 78 cols
    -i=4    # Indent level is 4 cols
    -ci=4   # Continuation indent is 4 cols
    -st     # Output to STDOUT
    -se     # Errors to STDERR
    -vt=2   # Maximal vertical tightness
    -cti=0  # No extra indentation for closing brackets
    -pt=1   # Medium parenthesis tightness
    -bt=1   # Medium brace tightness
    -sbt=1  # Medium square bracket tightness
    -bbt=1  # Medium block brace tightness
    -nsfs   # No space before semicolons
    -nolq   # Don't outdent long quoted strings
    -wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="    
            # Break before all operators


Á¤¸®Çϸç

ÀÌ ¹®¼­¿¡¼­´Â ÆÞÀÇ Äڵ尡 °¡µ¶¼ºÀÌ ¶³¾îÁö±â ¶§¹®¿¡ ÆÞÀ» ÇÁ·ÎÁ§Æ® ¹× ´ë±Ô¸ð ÀÛ¾÷¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù´Â ¼Ó¼³°ú Æí°ßÀ» ±ú¹ö¸± ¼ö ÀÖ´Â ÆÞ Ä¿¹Â´ÏƼ¿¡¼­ ±Ç°íÇÏ´Â ÃÖ°íÀÇ °¡À̵å¶óÀÎÀ» ¼Ò°³Çß½À´Ï´Ù. (¹°·Ð ÀÌ °¡À̵å¶óÀÎ Áß ÄÚµå ·¹À̾ƿô¿¡ ÇØ´çÇÏ´Â ºÎºÐ¸¸ ¼Ò°³¸¦ Çß½À´Ï´Ù.) JAPH(Just Another Perl Hacker)ó·³ ÀÚÀ¯·Ó°Ô Äڵ带 ÀÛ¼ºÇÒÁö, ¼öµµ½Â(Perl Monks)ó·³ Áö³ªÄ¡¸® ¸¸Å­ ¾ö°ÝÇÏ°í ²à²àÇÏ°Ô Äڵ带 ÀÛ¼ºÇÒÁöµµ ¿©·¯ºÐÀÇ ¼±ÅÃÀÇ ¸òÀÔ´Ï´Ù. À̰ÍÀº ·êÀÌ ¾Æ´Ï¶ó °¡À̵å¶óÀÎÀÏ »ÓÀÌ¸ç ¼±È£ÀÇ ¹®Á¦ÀÏ »ÓÀÔ´Ï´Ù. ±×·¯³ª ¿©·¯ »ç¶÷µé°ú Çù·Â ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù¸é °¡À̵å¶óÀÎÀ» µû¶óÇÒ °ÍÀ» °­·ÂÇÏ°Ô ±ÇÇÕ´Ï´Ù.


Âü°íÀÚ·á

¼­Àû:

- Perl Best Practices, O'REILLY, Ch. 02
- Perl Hacks, O'REILLY, Ch. 01
- Perl Programming, O'REILLY, Ch. 08


Code Layout ¿ø¹® ÀúÀÚ

Damian Conway


¹ø¿ª ¹× Á¤¸®

Kim Do-hyoung Keedi(keedi_AT_NOSPAM_NAVER_COM)


LICENCE AND COPYRIGHT

Copyright (c) 2007 Kim Do-hyoung Keedi(keedi_AT_NOSPAM_NAVER_COM). All rights reserved.

Followed by whatever licence you wish to release it under. For Perl code that is often just:

This document is free document; you can redistribute it and/or modify it under the same terms as Perl itself. See perldoc perlartistic.

This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.