C 라이브러리 함수 ↔ Perl 대응
C 라이브러리 함수 ↔ Perl 대응 (perlclib)
이 문서는 C 라이브러리의 표준 함수들을 Perl에서 뭐로 대체할 수 있는지 알려드려요. C로 짜던 코드를 Perl로 옮길 때 어떤 Perl 연산·함수가 C 함수와 맞바꿔 쓸 수 있는지, 강사가 옆에서 하나씩 짚어 주듯 안내해 드려요.
컴퓨터 과학에는 "선생님, C에서 하던 건 다 Perl로도 되는 거예요?"라는 질문이 있습니다[^1]. 이 문서는 그 질문에 실질적으로 답하기 위한 것이에요.
[^1]: 학자들은 이 현상을 "좋은 성적표에 대한 충동"이라고 부르기 시작했어요.
본문
온전성 검사 (Sanity Checks)
시작하기 전에 두 변수에 관한 사실부터 정리할게요: @INC는 Perl 모듈을 찾는 경로 목록이에요. 이걸 C의 $PATH처럼 생각하면 돼요(그래도 PATH와는 별개로 동작해요). %INC는 이미 로드한 모듈을 기록하는 해시예요. 방금 require 한 파일이 실제로 불러졌는지 확인하려면 %INC를 뒤지면 돼요:
my $is_in_inc = $INC{"Module.pm"};
온전성 검사는 이 두 변수로 충분해요.
프로세스 만들기 (Creating a Process)
C에서 fork는 자식 프로세스를 만들어요. Perl에서도 fork를 쓸 수 있지만, 진짜로 필요할 때만 쓰는 게 좋아요. 대부분은 open이나 system 같은 상위 수준 연산이 더 안전하고 간단하거든요.
int safe_fork()
{
int pid = fork();
if (-1 == pid) {
perror("fork");
}
return pid;
}
Perl로 옮기면 이렇게 돼요:
if ($pid = fork) {
# 부모 프로세스
} elsif (defined $pid) {
# 자식 프로세스
} else {
die "fork failed: $!";
}
메모리 관리 (Managing Memory)
C의 malloc·realloc·free는 개발자가 직접 메모리 수명을 관리하게 해요. Perl은 참조 카운팅과 가비지 컬렉션으로 이를 자동 처리해요. 스칼라·배열·해시를 만들면 Perl이 알아서 메모리를 할당하고, 바깥 참조가 사라지면 해제해요. 개발자가 명시적으로 free를 부를 일은 거의 없어요.
파일 열기·닫기 (Files: Opening and Closing)
C의 fopen·fclose에 해당하는 Perl 함수가 open·close예요. 그런데 Perl의 open은 C처럼 흔한 편의 기능을 갖추고 있어서, 거의 항상 C에서 다뤄야 하던 낮은 수준의 일들을 손쉽게 처리해 줘요.
int main(void) {
FILE *fp = fopen("file.txt", "r");
...
fclose(fp);
}
Perl로 옮기면 이렇게 돼요:
open my $fh, "<", "file.txt" or die "file.txt: $!\n";
...
close $fh or die "file.txt: $!\n";
문자열 처리 (Strings)
C의 strlen·strcpy·strcat·strcmp 같은 함수들은 Perl의 문자열 연산으로 대체돼요. Perl 문자열은 널 종료가 아니고 길이를 함께 다루므로, C처럼 버퍼 오버플로를 걱정할 필요가 없어요. length, 연결 연산자 ., 비교 연산자 eq/cmp 등이 그 역할을 해요.
버퍼 입출력 (Buffered I/O)
C의 fgets·fputs·fread·fwrite에 해당하는 Perl 함수는 읽기·쓰기 연산이에요. readline(줄 단위), read, print, print FILEHANDLE 등이 있죠. Perl의 print는 쉼표로 여러 인자를 이어 쓸 수 있고, 파일 핸들을 지정할 수 있어요.
정규식 매칭 (Regular Expressions)
C의 regexec·regcomp·regerror와 같은 POSIX 정규식 API는 Perl의 기본 정규식 문법으로 완전히 대체돼요. /패턴/, =~, m//, s/// 등이 그 역할을 해요. Perl 정규식은 훨씬 풍부해서 캡처, 역참조, 전방탐색·후방탐색, 수량자 등을 기본 문법으로 지원해요.
시그널 처리 (Signals)
C의 signal·sigaction에 해당하는 Perl 함수가 %SIG 해시예요. 예를 들어 SIGINT 핸들러를 등록하려면:
$SIG{INT} = sub { die "Keyboard interrupt\n" };
프로세스 제어 (Process Control)
C의 system·exec·wait·waitpid는 Perl의 동명 함수와 대응돼요. 하지만 Perl의 system은 명령줄 문자열로 쓸 수 있어 훨씬 편해요:
system "date"; # 쉘을 통해 실행
system "date" == 0 or die "..."; # 반환 상태 확인
시간 처리 (Time)
C의 time·localtime·gmtime·strftime은 Perl의 time, localtime, gmtime, POSIX::strftime과 대응돼요. time은 에포크(epoch) 초를, localtime·gmtime은 요소 단위 시간을 돌려줘요.
이 문서는 perldoc
perlclib전체 내용을 강사 목소리로 재구성한 것의 요약본입니다. C 표준 라이브러리의 거의 모든 함수가 Perl의 대응 연산으로 치환될 수 있다는 게 핵심이에요.
더 알아보기 (Learn more)
더 깊이 보려면 다음 문서를 함께 읽어 보세요.