코딩 · 프로그래밍 언어
초보자를 위한 Perl 기초 튜토리얼
핵심 답변
Perl은 1987년 Larry Wall이 만든 동적 스크립트 언어로, 텍스트 처리와 강력한 내장 정규 표현식으로 유명합니다. 대부분의 Unix 시스템에 기본 설치되어 있으며 시스템 관리, 로그 처리, 생물정보학에 쓰입니다. 이 페이지에서는 Perl 실행, 스칼라와 배열과 해시, 제어 흐름, 서브루틴, 참조, 정규 표현식, die와 eval을 이용한 오류 처리를 설명합니다.
정규식 테스트 열기Perl이란 무엇이며 어디에 쓰이는가
Perl은 1987년 Larry Wall이 만든 고수준 동적 타입 언어입니다. 텍스트 처리와 보고서 생성을 위해 설계되었고, Unix 시스템 관리와 초기 웹 개발의 접착제 언어로 알려졌습니다. Perl의 정규 표현식은 영향력이 매우 커서 많은 다른 언어가 Perl 호환 정규식 문법을 채택했습니다.
오늘날 Perl은 시스템 관리 스크립트, 로그와 텍스트 처리, 생물정보학, 레거시 웹 애플리케이션, 한 줄짜리 명령줄 필터에 쓰입니다. 대부분의 Linux와 Unix 시스템에 기본 설치되어 있습니다. CPAN(Comprehensive Perl Archive Network)에는 재사용할 수 있는 모듈이 매우 많이 모여 있습니다. 이 튜토리얼은 Perl 5를 다루며, 한때 Perl 6이라 불리던 언어는 지금 Raku라는 별개의 언어입니다.
Hello, world 실행
perl -v로 Perl이 설치되어 있는지 확인합니다. Windows에서는 Strawberry Perl이 흔히 쓰이는 배포판입니다. 모든 스크립트는 use strict;와 use warnings;로 시작하세요. 오타와 안전하지 않은 코드를 잡아 줍니다.
#!/usr/bin/env perl
use strict;
use warnings;
print "Hello, world!\n";perl hello.pl
# Hello, world!
perl -e 'print "Hello from a one-liner\n"'문장은 세미콜론으로 끝나고 주석은 #로 시작합니다. 큰따옴표 문자열은 변수와 \n 같은 이스케이프를 치환하고, 작은따옴표 문자열은 있는 그대로입니다.
변수: 스칼라, 배열, 해시
Perl 변수는 값의 종류를 나타내는 시길(sigil)로 시작합니다. 모든 변수는 my로 선언하며, 그러면 감싸는 블록 안에서만 유효한 지역 변수가 됩니다.
use strict;
use warnings;
my $name = "Perl"; # scalar: one value
my $year = 1987;
my @langs = ("Perl", "C", "sh"); # array: ordered list
my %port = (http => 80, https => 443); # hash: key-value pairs
print "$name since $year\n"; # Perl since 1987
print "First: $langs[0]\n"; # First: Perl (element is a scalar, so $)
print "Count: ", scalar(@langs), "\n"; # Count: 3
print "HTTPS: $port{https}\n"; # HTTPS: 443
print "Sum: ", "10" + 5, "\n"; # Sum: 15 (strings convert to numbers)
print "Join: " . "a" . "b" x 3, "\n"; # Join: abbb| 시길 | 종류 | 예시 |
|---|---|---|
$ | 스칼라: 숫자, 문자열 또는 참조 | my $n = 42; |
@ | 배열: 스칼라의 순서 있는 목록 | my @list = (1, 2); |
% | 해시: 순서 없는 키-값 쌍 | my %h = (a => 1); |
& | 서브루틴(거의 쓰지 않음) | &name |
제어 흐름
Perl에는 if, elsif, else, unless, while, until, for, foreach가 있습니다. 짧은 문장 뒤에 조건을 붙일 수 있어서 영어 문장처럼 읽힙니다. next는 다음 반복으로 넘어가고 last는 반복문을 빠져나갑니다.
use strict;
use warnings;
my $score = 72;
if ($score >= 90) {
print "A\n";
} elsif ($score >= 70) {
print "B\n"; # B
} else {
print "C\n";
}
print "passed\n" if $score >= 50; # statement modifier
print "not perfect\n" unless $score == 100;
for my $i (1 .. 3) {
print "i = $i\n";
}
my @names = ("ann", "bo");
foreach my $n (@names) {
next if $n eq "bo"; # skip to the next item
print ucfirst($n), "\n"; # Ann
}
my $k = 3;
while ($k > 0) { $k--; }거짓 값은 0, "0", 빈 문자열 "", 빈 리스트, undef입니다. 그 밖의 값은 모두 참입니다.
서브루틴
sub로 함수를 정의합니다. 인자는 특수 배열 @_로 전달되며, 보통 첫 줄에서 이름 있는 변수로 복사합니다. 서브루틴은 스칼라나 리스트를 반환할 수 있습니다.
use strict;
use warnings;
sub add {
my ($x, $y) = @_; # arguments arrive in @_
return $x + $y;
}
sub greet {
my ($name, $greeting) = @_;
$greeting //= "Hello"; # default if undefined
return "$greeting, $name!";
}
sub stats {
my @nums = @_;
my $sum = 0;
$sum += $_ for @nums;
return ($sum, $sum / @nums); # return a list
}
print add(2, 3), "\n"; # 5
print greet("Ann"), "\n"; # Hello, Ann!
my ($total, $avg) = stats(4, 8, 6);
print "$total $avg\n"; # 18 6현대 Perl은 sub add($x, $y) { ... } 같은 시그니처도 지원합니다. use v5.36; 이상으로 활성화하며, 이때 strict와 warnings도 함께 켜집니다.
배열, 해시, 참조
배열과 해시에는 push, pop, shift, sort, map, grep, keys, exists 같은 강력한 내장 함수가 있습니다. 중첩된 데이터는 참조를 사용합니다. [ ... ]는 배열 참조를, { ... }는 해시 참조를 만들고, ->로 참조를 따라갑니다.
use strict;
use warnings;
my @nums = (5, 3, 8, 1);
push @nums, 9; # add to the end
my $last = pop @nums; # remove from the end: 9
my @sorted = sort { $a <=> $b } @nums; # numeric sort
my @doubled = map { $_ * 2 } @sorted;
my @big = grep { $_ > 4 } @sorted;
print "@sorted | @doubled | @big\n"; # 1 3 5 8 | 2 6 10 16 | 5 8
my %age = (ann => 31, bo => 25);
$age{cy} = 40;
delete $age{bo};
for my $who (sort keys %age) {
print "$who is $age{$who}\n"; # ann is 31 / cy is 40
}
print "has ann\n" if exists $age{ann};
# references build nested data structures
my $user = { name => "Ann", langs => ["Perl", "SQL"] };
print "$user->{name} knows $user->{langs}[1]\n"; # Ann knows SQL
print scalar @{ $user->{langs} }, "\n"; # 2sort 블록 안에서 $a와 $b는 비교 중인 두 항목입니다. <=>는 숫자로, cmp는 문자열로 비교합니다. 단순한 sort @list는 문자열로 정렬하므로 10이 9보다 앞에 옵니다.
정규 표현식
정규 표현식은 Perl 문법에 내장되어 있으며 Perl의 대표 기능입니다. =~는 매치 m/.../ 또는 치환 s/.../.../을 적용합니다. 캡처한 그룹은 $1, $2 등으로 사용할 수 있고, g(전역)나 i(대소문자 무시) 같은 수식어는 닫는 슬래시 뒤에 붙입니다.
use strict;
use warnings;
my $line = "2026-10-31 ERROR disk full on /dev/sda1";
if ($line =~ /^(\d{4})-(\d\d)-(\d\d)\s+(\w+)/) {
print "year=$1 level=$4\n"; # year=2026 level=ERROR
}
(my $masked = $line) =~ s/\d/#/g; # copy, then replace digits
print "$masked\n"; # ####-##-## ERROR disk full on /dev/sda#
my @words = split /\s+/, $line;
print scalar(@words), " words\n"; # 6 words
my %h = ("a=1, b=2, c=3" =~ /(\w)=(\d)/g); # pairs into a hash
print join(",", map { "$_$h{$_}" } sort keys %h), "\n"; # a1,b2,c3qr/.../로 컴파일된 패턴을 변수에 저장할 수 있고, x 수식어를 쓰면 긴 패턴을 주석과 함께 여러 줄로 쓸 수 있습니다.
오류 처리
die는 예외를 발생시키고 warn은 표준 오류에 경고를 출력합니다. eval { ... }은 예외를 잡아 오류 메시지를 $@에 넣습니다. open 같은 시스템 호출은 실패하면 거짓을 반환하고 $!에 운영체제 오류를 설정하므로 or die로 확인하세요.
use strict;
use warnings;
sub divide {
my ($x, $y) = @_;
die "division by zero\n" if $y == 0;
return $x / $y;
}
my $result = eval { divide(1, 0) };
if ($@) {
print "Caught: $@"; # Caught: division by zero
}
open(my $fh, "<", "missing.txt")
or print "Cannot open: $!\n"; # Cannot open: No such file or directory\n으로 끝나는 die 메시지는 쓴 그대로 출력되고, 개행이 없으면 Perl이 파일 이름과 줄 번호를 덧붙입니다. Perl 5.34부터 실험적인 try/catch 기능도 있으며, Try::Tiny 같은 모듈도 널리 쓰입니다.
작은 완성 프로그램: 로그 레벨 집계
이 스크립트는 명령줄에 지정한 파일이나 표준 입력에서 로그를 읽어 레벨별로 줄 수를 세고 정렬된 요약을 출력합니다. 다이아몬드 연산자 <>, 정규 표현식, 해시, printf를 보여 줍니다.
#!/usr/bin/env perl
# logstat.pl: count log levels in a file or standard input
use strict;
use warnings;
my %count;
my $lines = 0;
while (my $line = <>) { # reads files named on the command line, or STDIN
chomp $line;
$lines++;
next unless $line =~ /\b(INFO|WARN|ERROR)\b/;
$count{$1}++;
}
printf "%d lines read\n", $lines;
for my $level (sort { $count{$b} <=> $count{$a} || $a cmp $b } keys %count) {
printf "%-5s %3d\n", $level, $count{$level};
}perl logstat.pl app.log
# 120 lines read
# INFO 97
# WARN 18
# ERROR 5다음 단계
- perldoc.perl.org의 perlintro와 다른 튜토리얼.
perldoc perlintro로 오프라인에서도 볼 수 있습니다. - Learning Perl과 Modern Perl, 초보자에게 잘 알려진 두 권의 책입니다.
- CPAN 모듈 검색 사이트인 MetaCPAN.
- 정규 표현식 전체 레퍼런스인 perlre와 perlretut.
자주 묻는 질문
Perl은 아직도 쓰이나요?
네. Perl은 대부분의 Unix 계열 시스템에 기본 설치되어 있고, 시스템 관리, 텍스트 처리, 생물정보학, 오래 운영되는 업무 시스템에서 여전히 흔합니다. 다만 Perl로 시작하는 새 웹 프로젝트는 줄었습니다.
Perl과 Raku의 차이는 무엇인가요?
Raku는 Perl 6으로 시작했지만 설계가 다른 별개의 언어가 되었습니다. Perl 5는 독립적으로 계속 개발되고 있으며, Perl이라는 이름은 Perl 5를 가리킵니다.
Perl 변수는 왜 $, @, %로 시작하나요?
시길은 어떤 종류의 값을 얻는지 보여 줍니다. $는 단일 스칼라, @는 리스트, %는 해시입니다. 그래서 @items의 요소 하나는 $items[0]으로 씁니다.
Perl의 chomp는 무엇을 하나요?
chomp는 문자열 끝의 개행을 제거합니다. 파일이나 키보드에서 한 줄을 읽은 뒤에 보통 필요합니다.
Perl은 정규 표현식에 강한가요?
네. 정규 표현식은 Perl 핵심 문법의 일부이며, 여러 도구와 언어가 쓰는 정규식 라이브러리 PCRE의 이름도 Perl의 정규식 스타일에서 따왔습니다.