펄 입문

펄 입문 (perlintro)

Perl 프로그래밍 언어를 빠르게 한 바퀴 훑어보는 문서예요. 처음 언어를 배우는 분들을 위한 "부트스트랩" 가이드로서, 다른 사람이 쓴 Perl 코드를 읽고 대략 무슨 일을 하는지 이해하거나, 여러분만의 간단한 스크립트를 작성하는 데 필요한 만큼의 정보를 담고 있어요.

출처: perlintro - a brief introduction and overview of Perl

개요 (DESCRIPTION)

이 문서는 Perl 언어의 빠른 개요와 함께, 더 자세한 문서로 가는 안내를 제공하는 데 목적이 있어요. 이 안내서는 완전함을 목표로 하지 않고, 완전히 정확하기를 목표로 하지도 않아요. 어떤 경우에는 일반적인 개념을 전달하는 데 초점을 맞추느라 완벽함을 다소 희생하기도 했죠. 이 입문서를 읽은 뒤에는 전체 Perl 매뉴얼(목차는 perltoc에 있어요)로 넘어가서 더 자세한 정보를 보시길 강력히 권해요.

이 문서 곳곳에서 Perl 문서의 다른 부분을 가리키는 참조를 보게 될 거예요. 그 문서들은 perldoc 명령이나, 지금 이 문서를 읽고 있는 방식 그대로 읽을 수 있어요.

Perl 문서 전체에서 설명하는 기능을 돕기 위한 수많은 예제를 만나게 됩니다. 그중 상당수가 완전한 프로그램이 아니라 코드 조각(fragment)이라는 점을 기억하세요.

이 예제들은 종종 해당 문서를 쓴 저자의 스타일과 취향을 반영하며, 실제 프로그램의 코드 한 줄보다 더 간결할 수 있어요. 특별한 언급이 없는 한, 예제 앞부분에 use strictuse warnings 문이 있다고, 그리고 사용하는 변수는 이미 선언되어 있다고 가정하세요. 예제를 읽기 쉽게 하려고 선언을 생략했더라도 말이죠.

예제는 수십 년에 걸쳐 여러 저자가 작성했기 때문에 스타일과 기법이 서로 다를 수 있어요. 같은 섹션 안에서 너무 크게 달라지지 않도록 어느 정도 노력은 했지만요. 어떤 스타일이 다른 스타일보다 낫다고 생각하지 마세요 — "하는 방법은 하나 이상이다(There's More Than One Way To Do It)"는 Perl의 좌우명 중 하나예요. 프로그래머로서의 여정에서 여러분은 다양한 스타일을 만나게 될 테니까요.

Perl이란 무엇인가? (What is Perl?)

Perl은 원래 텍스트 조작용으로 개발된 범용 프로그래밍 언어로, 지금은 시스템 관리, 웹 개발, 네트워크 프로그래밍, GUI 개발 등 광범위한 작업에 사용돼요.

이 언어는 아름다움(작고, 우아하고, 최소한)보다 실용성(쉽고, 효율적이며, 완전한)을 지향해요. 주요 특징은 사용하기 쉽고, 절차적 프로그래밍과 객체지향(OO) 프로그래밍을 모두 지원하며, 강력한 텍스트 처리 지원이 내장되어 있고, 세계에서 가장 인상적인 서드파티 모듈 컬렉션 중 하나를 갖고 있다는 점이에요.

Perl의 정의는 perlperlfaq1 그리고 다른 곳에서도 다양하게 주어져요. 이를 통해 Perl이 사람마다 다른 의미를 갖지만, 적어도 글을 쓸 가치가 있다고 생각하는 사람이 많다는 걸 알 수 있어요.

Perl 프로그램 실행하기 (Running Perl programs)

Unix 명령줄에서 Perl 프로그램을 실행하려면:

perl progname.pl

또는 스크립트 첫 줄에 이렇게 넣어도 돼요:

#!/usr/bin/env perl

그리고 스크립트를 /path/to/script.pl 로 실행하세요. 당연히 먼저 실행 권한이 필요하니 (Unix에서) chmod 755 script.pl을 해야 해요.

(이 시작 줄은 env 프로그램이 있다고 가정해요. #!/usr/bin/perl처럼 perl 실행 파일의 경로를 직접 넣을 수도 있어요.)

Windows 같은 다른 플랫폼의 지침을 포함한 더 자세한 정보는 perlrun을 읽어보세요.

안전망 (Safety net)

Perl은 기본적으로 아주 관대해요. 더 견고하게 만들기 위해 모든 프로그램의 시작 부분에 다음 줄을 넣는 걸 권장해요:

#!/usr/bin/perl
use strict;
use warnings;

이 두 줄은 perl에게 코드의 여러 흔한 문제를 잡도록 요청해요. 서로 다른 것들을 검사하기 때문에 둘 다 필요해요. use strict;가 잡는 잠재적 문제는 만나는 즉시 코드 실행이 중단되지만, use warnings;는 (명령줄 스위치 -w처럼) 경고만 줄 뿐 코드는 그대로 실행되게 해요. 각각 strictwarnings 매뉴얼 페이지에서 더 읽어볼 수 있어요.

use v5.35(또는 그 이상) 선언은 strictwarnings를 모두 활성화해요:

#!/usr/bin/perl
use v5.35;

strictwarnings 프래그먼(pragma)을 활성화하는 것 외에도, 이 선언은 "feature bundle"도 활성화해요. 언어에 최근 추가·변경된 많은 기능을 켜는 명명된 기능 모음이고, 때로는 설계상 실수로 판명되어 권장되지 않는 옛 기능을 제거하기도 해요.

기본 문법 개요 (Basic syntax overview)

Perl 스크립트나 프로그램은 하나 이상의 문(statement)으로 구성돼요. 이 문들은 스크립트에 단순하게 작성하면 돼요. main() 함수 같은 건 필요 없어요.

Perl 문은 세미콜론으로 끝나요:

print "Hello, world";

주석은 해시 기호로 시작해서 줄 끝까지 가요:

# This is a comment

공백은 무시돼요:

print
    "Hello, world"
    ;

... 따옴표로 감싼 문자열 안을 제외하고요:

# this would print with a linebreak in the middle
print "Hello
world";

문자열 리터럴에는 큰따옴표나 작은따옴표를 쓸 수 있어요:

print "Hello, world";
print 'Hello, world';

다만 큰따옴표만 변수와 개행(\n) 같은 특수 문자를 "보간(interpolate)"해요:

print "Hello, $name\n";     # works fine
print 'Hello, $name\n';     # prints $name\n literally

숫자는 따옴표가 필요 없어요:

print 42;

함수 인자에 괄호를 쓰는지 여부는 취향에 따라 선택할 수 있어요. 우선순위를 명확히 해야 할 때만 가끔 필요해요.

print("Hello, world\n");
print "Hello, world\n";

Perl 문법에 대한 더 자세한 정보는 perlsyn에서 찾을 수 있어요.

Perl 변수 타입 (Perl variable types)

위의 이상한 문자열 <$name>을 눈치채셨을 거예요. 그것은 변수를 나타내며, 보통 "name"으로 발음돼요. 달러 기호를 "시길(sigil)"이라고 부르며, "name"이 변수임을 나타내요. 대부분의 언어에서 변수가 알파벳·숫자 문자로 된 단순한 문자열인 것과 달리, Perl 변수는 모두 시길이 앞에 붙어요.

Perl에는 세 가지 주요 변수 타입이 있어요: 스칼라(scalar), 배열(array), 해시(hash). 변수 이름에 쓰는 특정 시길이 그 변수의 타입을 나타내요. 달러 기호가 $name으로 시길로 쓰인 걸 이미 봤죠. 달러 기호는 이 변수가 스칼라임을 나타내요.

스칼라 (Scalars)

스칼라는 단일 값을 나타내요:

my $animal = "camel";
my $answer = 42;

스칼라 값은 문자열, 정수, 부동소수점 숫자가 될 수 있고, Perl은 필요할 때 자동으로 변환해요. 처음 사용할 때 my 키워드로 선언해야 해요. (이것이 use strict;의 요구사항 중 하나예요.)

스칼라 값은 다양한 방식으로 쓸 수 있어요:

print $animal;
print "The animal is $animal\n";
print "The square of $answer is ", $answer * $answer, "\n";

Perl은 종종 구두점이나 숫자 하나뿐인 짧은 이름의 특수 스칼라를 여럿 정의해요. 이 변수들은 여러 목적으로 쓰이며 perlvar에 문서화되어 있어요. 지금 알아야 할 것은 $_, 즉 "기본 변수(default variable)"뿐이에요. Perl의 여러 함수에서 기본 인자로 쓰이며, 특정 루프 구조가 암묵적으로 설정해요.

print;          # prints contents of $_ by default

배열 (Arrays)

배열은 값의 목록(list)을 나타내요. @ 시길은 변수가 배열임을 나타내요:

my @animals = ("camel", "llama", "owl");
my @numbers = (23, 42, 69);
my @mixed   = ("camel", 42, 1.23);

이 배열들은 각각 개별 값의 집합(aggregation)이에요. 그리고 각 값은 실제로 스칼라예요.

배열은 0부터 인덱싱돼요. 배열의 개별 스칼라 요소에 접근하는 방법이에요:

print $animals[0];              # prints "camel"
print $animals[1];              # prints "llama"

Perl에서 스칼라는 항상 $ 시길로 참조돼요. 그래서 @animals 배열 안의 0번째 스칼라 변수를 얻기 위해 $animals[0]이라고 쓴 거예요. 대괄호 [...]는 값이 배열에서 오는 것임을 나타내요. 이는 Perl 신규 사용자에게 큰 혼란의 원인이에요. 단일 값을 볼 때는, 그 값이 더 큰 집합의 일부라도 $를 써야 해요.

특수 변수 $#array는 배열의 마지막 요소 인덱스를 알려줘요:

print $mixed[$#mixed];       # last element, prints 1.23

배열의 항목 수를 알려고 $#array + 1을 쓰고 싶을 수도 있어요. 그러지 마세요. Perl이 스칼라 값을 기대하는 곳("스칼라 컨텍스트")에서 @array를 쓰면 배열의 요소 수를 얻을 수 있어요:

if (@animals < 5) { ... }

배열에서 얻는 요소는 $로 시작해요. 배열에서 단일 값 하나만 꺼내는 것이니까요. 스칼라를 요청하면 스칼라를 얻는 거예요.

배열에서 여러 값을 얻으려면:

@animals[0,1];                 # gives ("camel", "llama");
@animals[0..2];                # gives ("camel", "llama", "owl");
@animals[1..$#animals];        # gives all except the first element

이걸 "배열 슬라이스(array slice)"라고 불러요. 여러 값을 원하므로 @ 시길을 쓴 거예요. $는 단일 값을 참조할 때 예약되어 있어요.

목록에 여러 유용한 일을 할 수 있어요:

my @sorted    = sort @animals;
my @backwards = reverse @numbers;

특수 배열도 여러 개 있어요. 예를 들어 @ARGV(스크립트에 전달된 명령줄 인자)와 @_(서브루틴에 전달된 인자)가 있어요. 이들은 perlvar에 문서화되어 있어요.

해시 (Hashes)

해시는 키/값 쌍의 집합을 나타내요. % 시길은 변수가 해시임을 나타내요:

my %fruit_color = ("apple", "red", "banana", "yellow");

공백과 => 연산자를 사용해 더 보기 좋게 나열할 수 있어요:

my %fruit_color = (
    apple  => "red",
    banana => "yellow",
    lime   => "green",
);

해시 요소에 접근하려면:

$fruit_color{"apple"};           # gives "red"

단일 해시 요소에 접근하는 데 $ 시길을 쓴 것에 다시 주목하세요. 중괄호 {...}는 값이 해시에서 오는 것임을 나타내요.

슬라이스를 사용해 여러 값을 얻을 수도 있어요:

my @non_red = @fruit_color{"banana", "lime"};
print $non_red[0], "\n";    # yellow
print $non_red[1], "\n";    # green

여러 값은 @ 시길을, 단일 값은 $를 쓴다는 점을 다시 기억하세요.

keys()values()로 키와 값의 목록을 얻을 수 있어요.

my @fruits = keys %fruit_color;
my @colors = values %fruit_color;

해시에는 특정한 내부 순서가 없지만, 키를 정렬해서 루프를 돌 수는 있어요.

특수 스칼라·배열처럼 특수 해시도 있어요. 가장 잘 알려진 것은 환경 변수를 담고 있는 %ENV예요. perlvar에서 이에 대해 (그리고 다른 특수 변수에 대해) 모두 읽어보세요.

스칼라·배열·해시에 대한 더 완전한 문서는 perldata에 있어요.

$name, @name, %name은 서로 다른 세 변수라는 점을 기억하세요. 같은 영숫자를 써서 다른 변수를 나타내는 건 혼란스러울 수 있지만, 어떤 상황에서는 명확해질 수도 있어요. 예를 들어 배열 @name 안에서 현재 관심 있는 특정 요소를 $name으로 나타내는 식이죠. 이름 선택은 여러분의 몫이고, Perl 인터프리터는 신경 쓰지 않아요. 여러 변수가 같은 이름을 가질 때, 대괄호를 쓰느냐 중괄호를 쓰느냐가 인터프리터에게 어느 것을 의미하는지 알려줘요.

더 복잡한 데이터 타입은 참조(reference)를 사용해 구성할 수 있어요. 참조를 쓰면 목록 안의 목록, 해시 안의 해시를 만들 수 있어요.

참조는 스칼라 값이며 어떤 Perl 데이터 타입이든 가리킬 수 있어요. 참조를 배열이나 해시 요소의 값으로 저장함으로써, 목록 안의 목록·해시 안의 해시를 쉽게 만들 수 있어요. 다음 예제는 익명 해시 참조를 이용한 2단계 해시 오브 해시 구조를 보여줘요.

my $variables = {
    scalar  =>  {
                 description => "single item",
                 sigil => '$',
                },
    array   =>  {
                 description => "ordered list of items",
                 sigil => '@',
                },
    hash    =>  {
                 description => "key/value pairs",
                 sigil => '%',
                },
};

print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";

참조 주제의 철저한 정보는 perlreftut, perllol, perlref, perldsc에 있어요.

변수 스코프 (Variable scoping)

앞선 섹션의 모든 예제는 my $var = "value"; 문법을 썼어요. my는 사실 꼭 필요하지 않고, 그냥 $var = "value";를 써도 돼요.

하지만 위 사용법은 프로그램 전체에 전역 변수를 만들며, 좋은 프로그래밍 관행이 아니에요. 대신 my는 어휘 스코프(lexically scoped) 변수를 만들어요. 변수는 정의된 블록(중괄호로 둘러싸인 문들의 묶음)으로 범위가 제한돼요.

my $x = "foo";
my $some_condition = 1;
if ($some_condition) {
    my $y = "bar";
    print $x;           # prints "foo"
    print $y;           # prints "bar"
}
print $x;               # prints "foo"
print $y;               # prints nothing; $y has fallen out of scope

Perl 스크립트 맨 위의 use strict;와 함께 my를 쓰면 인터프리터가 특정 흔한 프로그래밍 오류를 잡아줘요. 예를 들어 위 예제에서 마지막 print $y는 컴파일 타임 에러를 일으켜 프로그램 실행을 막을 거예요. strict 사용을 강력히 권장해요.

조건문과 반복문 (Conditional and looping constructs)

Perl에는 일반적인 조건문과 반복문이 대부분 있어요.

조건은 어떤 Perl 표현식이든 될 수 있어요. 조건문에서 흔히 쓰는 비교·불리언 논리 연산자는 다음 섹션의 연산자 목록을 참고하세요.

if

if ( condition ) {
    ...
} elsif ( other condition ) {
    ...
} else {
    ...
}

부정 버전도 있어요:

unless ( condition ) {
    ...
}

이것은 if (!*condition*)의 더 읽기 쉬운 버전으로 제공되는 거예요.

Perl에서 블록에 한 줄만 있어도 중괄호가 필요하다는 점을 기억하세요. 하지만 한 줄 조건 블록을 더 영어답게 만드는 영리한 방법이 있어요:

# the traditional way
if ($zippy) {
    print "Yow!";
}

# the Perlish post-condition way
print "Yow!" if $zippy;
print "We have no bananas" unless $bananas;

while

while ( condition ) {
    ...
}

unless가 있는 것과 같은 이유로 부정 버전도 있어요:

until ( condition ) {
    ...
}

후치(후위) 조건으로 while을 쓸 수도 있어요:

print "LA LA LA\n" while 1;          # loops forever

for

정확히 C처럼:

for ($i = 0; $i <= $max; $i++) {
    ...
}

C 스타일 for 루프는 Perl에서 거의 필요 없어요. Perl이 더 친근한 목록 스캔 foreach 루프를 제공하니까요.

foreach

foreach (@array) {
    print "This element is $_\n";
}

print $list[$_] foreach 0 .. $max;

# you don't have to use the default $_ either...
foreach my $key (keys %hash) {
    print "The value of $key is $hash{$key}\n";
}

foreach 키워드는 사실 for 키워드의 동의어예요. perlsyn의 "Foreach Loops"를 보세요.

반복 구조의 더 자세한 내용(이 개요에서 언급하지 않은 것들 포함)은 perlsyn을 보세요.

내장 연산자와 함수 (Builtin operators and functions)

Perl에는 다양한 내장 함수가 함께 제공돼요. 이미 본 것 중에는 print, sort, reverse가 있어요. 목록은 perlfunc의 시작 부분에 있고, 특정 함수는 perldoc -f *functionname*으로 쉽게 읽을 수 있어요.

Perl 연산자는 perlop에 완전히 문서화되어 있지만, 여기 가장 흔한 몇 가지가 있어요:

산술 (Arithmetic)

+   addition
-   subtraction
*   multiplication
/   division

숫자 비교 (Numeric comparison)

==  equality
!=  inequality
<   less than
>   greater than
<=  less than or equal
>=  greater than or equal

문자열 비교 (String comparison)

eq  equality
ne  inequality
lt  less than
gt  greater than
le  less than or equal
ge  greater than or equal

(왜 숫자 비교와 문자열 비교가 따로 있을까요? 특수 변수 타입이 없기 때문에, Perl은 숫자로 정렬할지(99가 100보다 작음) 알파벳으로 정렬할지(100이 99보다 앞에 옴) 알아야 하기 때문이에요.)

불리언 논리 (Boolean logic)

&&  and
||  or
!   not

(and, or, not은 위 표에서 연산자 설명으로만 있는 게 아니에요. 그 자체로도 연산자로 지원돼요. C 스타일 연산자보다 더 읽기 쉽지만, &&와는 우선순위가 달라요. 자세한 내용은 perlop을 확인하세요.)

기타 (Miscellaneous)

=   assignment
.   string concatenation
x   string multiplication (repeats strings)
..  range operator (creates a list of numbers or strings)

많은 연산자를 =와 결합할 수 있어요:

$x += 1;        # same as $x = $x + 1
$x -= 1;        # same as $x = $x - 1
$x .= "\n";     # same as $x = $x . "\n";

파일과 입출력 (Files and I/O)

open() 함수로 파일을 입력 또는 출력용으로 열 수 있어요. perlfuncperlopentut에 아주 상세히 문서화되어 있는데, 간단히는:

open(my $in,  "<",  "input.txt")  or die "Can't open input.txt: $!";
open(my $out, ">",  "output.txt") or die "Can't open output.txt: $!";
open(my $log, ">>", "my.log")     or die "Can't open my.log: $!";

열린 파일핸들에서 <> 연산자로 읽을 수 있어요. 스칼라 컨텍스트에서는 파일핸들에서 한 줄을 읽고, 리스트 컨텍스트에서는 전체 파일을 읽어 각 줄을 목록의 요소에 할당해요:

my $line  = <$in>;
my @lines = <$in>;

한 번에 전체 파일을 읽는 것을 슬러핑(slurping)이라고 불러요. 유용할 수 있지만 메모리를 많이 먹을 수도 있어요. 대부분의 텍스트 파일 처리는 Perl의 반복 구조로 한 줄씩 할 수 있어요.

<> 연산자는 while 루프에서 가장 흔히 볼 수 있어요:

while (<$in>) {     # assigns each line in turn to $_
    print "Just read in this line: $_";
}

print()로 표준 출력에 출력하는 방법을 이미 봤어요. 그러나 print()는 출력할 파일핸들을 지정하는 선택적 첫 인자를 받을 수도 있어요:

print STDERR "This is your final warning.\n";
print $out $record;
print $log $logmessage;

파일핸들 사용이 끝나면 close()해야 해요. (솔직히 잊어도 Perl이 정리해 주긴 하지만요.)

close $in or die "$in: $!";

정규 표현식 (Regular expressions)

Perl의 정규 표현식 지원은 광범위하면서도 깊어서, perlrequick, perlretut 등에서 길게 문서화되어 있어요. 간단히는:

단순 매칭 (Simple matching)

if (/foo/)       { ... }  # true if $_ contains "foo"
if ($x =~ /foo/) { ... }  # true if $x contains "foo"

// 매칭 연산자는 perlop에 문서화되어 있어요. 기본적으로 $_에 대해 동작하며, =~ 결합(binding) 연산자(역시 perlop에 문서화)로 다른 변수에 묶을 수 있어요.

단순 치환 (Simple substitution)

s/foo/bar/;               # replaces foo with bar in $_
$x =~ s/foo/bar/;         # replaces foo with bar in $x
$x =~ s/foo/bar/g;        # replaces ALL INSTANCES of foo with bar
                          # in $x

s/// 치환 연산자는 perlop에 문서화되어 있어요.

더 복잡한 정규 표현식 (More complex regular expressions)

고정 문자열에만 매칭할 필요는 없어요. 사실 더 복잡한 정규 표현식을 사용하면 상상할 수 있는 거의 모든 것에 매칭할 수 있어요. 이들은 perlre에 길게 문서화되어 있지만, 당장은 여기 빠른 치트 시트가 있어요:

.                   a single character
\s                  a whitespace character (space, tab, newline, ...)
\S                  non-whitespace character
\d                  a digit (0-9)
\D                  a non-digit
\w                  a word character (a-z, A-Z, 0-9, _)
\W                  a non-word character
[aeiou]             matches a single character in the given set
[^aeiou]            matches a single character outside the given
                    set
(foo|bar|baz)       matches any of the alternatives specified

^                   start of string
$                   end of string

위에서 $는 달러 기호와 매칭하지 않는다는 점을 주의하세요. 마찬가지로 ., \, [, ], (, ), ^도 여러분이 기대하는 문자와 매칭하지 않아요. 이런 것들을 "메타문자(metacharacter)"라고 불러요. 반대로 예를 들어 a, e, i, o, u 같은 문자는 메타문자가 아니에요. 그것들은 문자 그대로 자기 자신과 매칭해요. 메타문자는 보통 문자 그대로의 값이 아닌 어떤 것과 매칭해요. 위보다 몇 개 더 많은 메타문자가 있어요. 일부 수량자(quantifier)는 아래에 있고, 전체 목록은 perlre의 "Metacharacters"에 있어요.

메타문자가 문자 그대로의 값과 매칭하게 하려면 백슬래시를 앞에 붙여 "이스케이프"(또는 "쿼팅")해야 해요. 그래서 \$는 달러 기호와 매칭하고, \\는 문자 그대로의 백슬래시와 매칭해요.

또한 위에서 예를 들어 \s 문자열은 백슬래시 다음에 문자 s가 오는 것과 매칭하지 않는다는 점도 주의하세요. 이 경우 비메타문자 s 앞에 백슬래시를 붙이면, 문자 그대로의 값과 매칭하지 않는 무언가로 바뀌어요. 그런 수열을 "이스케이프 시퀀스(escape sequence)"라고 불러요. perlrebackslash가 현재의 모든 이스케이프 시퀀스를 문서화해요.

메타문자가 아니고 현재 정의된 이스케이프 시퀀스의 일부도 아닌 문자를 이스케이프하면 경고가 발생해요.

수량자를 사용해 이전 것(여기서 "것"은: 리터럴 문자, 위에 나열된 구조 중 하나, 또는 그 둘의 괄호로 묶인 그룹) 중 몇 개를 매칭할지 지정할 수 있어요.

*                   zero or more of the previous thing
+                   one or more of the previous thing
?                   zero or one of the previous thing
{3}                 matches exactly 3 of the previous thing
{3,6}               matches between 3 and 6 of the previous thing
{3,}                matches 3 or more of the previous thing

몇 가지 간단한 예제:

/^\d+/              string starts with one or more digits
/^$/                nothing in the string (start and end are
                    adjacent)
/(\d\s){3}/         three digits, each followed by a whitespace
                    character (eg "3 4 5 ")
/^(a.)+/            matches a string in which every odd-numbered
                    letter is 'a' (eg "abacadaf")

# This loop reads from STDIN, and prints non-blank lines:
while (<>) {
    next if /^$/;
    print;
}

캡처용 괄호 (Parentheses for capturing)

괄호는 그룹화 외에 두 번째 목적이 있어요. 나중에 사용하기 위해 매치 결과의 일부를 캡처하는 데 쓸 수 있어요. 결과는 $1, $2 등에 담겨요.

# a cheap and nasty way to break an email address up into parts

if ($email =~ /([^@]+)@(.+)/) {
    print "Username is $1\n";
    print "Hostname is $2\n";
}

기타 정규 표현식 기능 (Other regexp features)

Perl 정규 표현식은 역참조(backreference), 전방탐색(lookahead), 그 외 모든 종류의 복잡한 세부사항을 지원해요. 이에 대한 모든 내용은 perlrequick, perlretut, perlre에서 읽어보세요.

서브루틴 작성 (Writing subroutines)

서브루틴 작성은 쉽습니다:

sub logger {
   my $logmessage = shift;
   open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
   print $logfile $logmessage;
}

이제 다른 내장 함수처럼 서브루틴을 사용할 수 있어요:

logger("We have a logger subroutine!");

shift는 뭘까요? 서브루틴의 인자는 @_라는 특수 배열로 사용할 수 있어요(더 자세한 내용은 perlvar 참조). shift 함수의 기본 인자가 마침 @_예요. 그래서 my $logmessage = shift;는 인자 목록의 첫 항목을 빼내 $logmessage에 할당해요.

@_를 다른 방식으로도 조작할 수 있어요:

my ($logmessage, $priority) = @_;       # common
my $logmessage = $_[0];                 # uncommon, and ugly

서브루틴은 값을 반환할 수도 있어요:

sub square {
    my $num = shift;
    my $result = $num * $num;
    return $result;
}

그리고 이렇게 사용해요:

$sq = square(8);

서브루틴 작성에 대한 더 자세한 정보는 perlsub를 보세요.

OO Perl

OO Perl은 비교적 간단하며, Perl의 패키지 개념에 기반해 자신이 어떤 종류의 객체인지 아는 참조를 사용해 구현돼요. 그러나 OO Perl은 이 문서의 범위를 크게 벗어나요. perlootutperlobj를 읽어보세요.

초보 Perl 프로그래머로서 OO Perl을 가장 흔히 쓰는 경우는 서드파티 모듈을 사용할 때인데, 그 모듈은 아래에 문서화되어 있어요.

Perl 모듈 사용 (Using Perl modules)

Perl 모듈은 바퀴를 다시 발명하지 않도록 돕는 다양한 기능을 제공하며, CPAN에서 내려받을 수 있어요. 여러 인기 모듈은 Perl 배포판 자체에 포함되어 있어요.

모듈의 범주는 텍스트 조작부터 네트워크 프로토콜, 데이터베이스 통합, 그래픽까지 다양해요. 범주화된 모듈 목록도 CPAN에서 이용할 수 있어요.

CPAN에서 내려받은 모듈 설치 방법을 배우려면 perlmodinstall을 읽어보세요.

특정 모듈 사용법을 배우려면 perldoc *Module::Name*을 쓰세요. 보통 use *Module::Name*을 원할 텐데, 그러면 내보낸 함수나 모듈의 OO 인터페이스에 접근할 수 있어요.

perlfaq에는 많은 흔한 작업과 관련된 질문·답변과 함께, 좋은 CPAN 모듈을 추천하는 내용이 자주 있어요.

perlmod는 Perl 모듈을 일반적으로 설명하고, perlmodlib는 여러분의 Perl 설치에 포함된 모듈을 나열해요.

Perl 모듈 작성 욕구가 생기면 perlnewmod가 좋은 조언을 줄 거예요.

저자 (AUTHOR)

Kirrily "Skud" Robert [email protected]

더 알아보기 (Learn more)

  • perlsyn — Perl 문법
  • perlop — 연산자
  • perlfunc — 내장 함수
  • perlvar — 특수 변수
  • perlre — 정규 표현식
  • perlref — 참조
  • perlsub — 서브루틴
  • perlootut, perlobj — 객체지향 Perl
  • perlmod, perlmodlib — 모듈