**펄**은 래리 월이 만든 인터프리터 방식의 프로그래밍 언어 혹은 그 인터프리터 소프트웨어를 가리킨다. 펄은 고급 언어, 범용 언어, 인터프리터 언어, 동적 언어 범주에 속한다. 펄은 일반적으로 펄 5로 부르지만 2000년부터 2019년까지 자매 언어 펄 6으로 불리다가 2019년 10월 들어 펄 6라는 이름은 라쿠라는 이름으로 공식적으로 변경되었다.

래리 월이 1987년 펄을 처음 만든 후, 펄은 많은 변화를 겪었다. 펄 6은 2000년부터 펄을 다시 설계하면서 개발되기 시작했고, 펄 5와는 독립적으로 개발되었고 서로 영향을 미쳤다.

펄 언어는 실용성을 모토로 하고 있어 C나 sed, AWK, 셸 스크립트 (sh) 등 다른 프로그래밍 언어에서 뛰어난 기능을 많이 도입하여 사용하고 있다. 이를 통해 텍스트 파일의 조작을 용이하게 만들어 준다. 펄 5는 부분적인 이유로는 타의 추종을 불허하는

CGI뿐 아니라 펄 5는 그래픽스 프로그래밍, 시스템 관리, 네트워크 프로그래밍, 금융, 생물정보학 등에도 사용된다. 언어의 유연성과 강력함으로 인해 "스크립트 언어들 중의 스위스 군용 사슬톱"(the Swiss Army chainsaw of scripting languages)이라는 별명을 얻었다. 인터프리터 펄은 자유 소프트웨어이며, 아티스틱 라이선스 또는 GPL으로 배포되고 있어 사용자는 둘 가운데 하나의 라이선스를 골라 쓸 수 있다. 유닉스를 비롯해 다양한 플랫폼에서 동작한다.

펄은 매우 표현 능력이 좋은 프로그래밍 언어이기 때문에 주어진 알고리즘의 소스 코드는 짧으면서도 매우 압축적으로 작성할 수 있다.

## 역사

### 초기 버전
래리 월은 유니시스에서 프로그래머로 일하던 1987년 펄에 대한 작업을 시작하였으며

이 언어를 가리킬 때 이름은 고유 명사로서 일반적으로 앞 글자가 대문자인 "Perl"로 표기한다. 인터프리터 프로그램 그 자체를 가리킬 때에는 모두 소문자인 ''perl''로 부르기도 하는데 이는 대부분의 유닉스 계열 운영 체제들이 대소문자를 구분하기 때문이다. 서적 프로그래밍 펄의 첫 판이 출시되기 전에 이 언어를 ''perl''로 부르는 것이 일반적이었다. 그러나 랜들 L. 슈왈츠는 이 책에서 언어의 이름을 대문자화하여 조판 시에 더 잘 눈에 띄게 하였다. 최종적으로 이러한 대소문자 구별은 정규화된 채로 문서화되었다.

이 언어의 이름은 "실용적인 데이터 취득 및 보고서 작성 언어"(Practical Extraction and Report Language)로 기술되기도 하는데 이는 이미 존재하는 단어에 맞추기 위해 만들어진 약어이다.

### 낙타 상징
오라일리 미디어가 출판한 프로그래밍 펄은 책 겉표지에 단봉(單峰) 낙타의 사진을 특징으로 내세우고 있으며, 이를 흔히 낙타책(Camel Book)으로 부른다. 이 낙타 그림은 펄의 비공식적인 상징이자 해커의 상징으로 되고 있으며, 티셔츠와 다른 의상들에서 볼 수 있다.

오라일리는 이 그림을 상표로 소유하고 있으나 비상업적인 용도로 라이선스하고 있는데, 이에 대해 고지와 더불어 www.perl.com로의 링크만을 요구한다. 상용 라이선스는 그때그때의 상황에 따라 결정된다.

### 양파 상징
펄 재단은 이를 대체하는 상징인 양파 그림을 소유하고 있으며 Perl Mongers, PerlMonks, Perl.org 등의 하위 단체들에 라이선스한다.

### 랩터 상징
모졸리셔스의 개발자 Sebastian Riedel는 랩터(육식조)를 그려놓은 로고를 개발하였으며, CC-SA 라이선스 버전 4.0으로 배포되었다. 이 로고는 펄 5를 상징으로 두고 있다.

## 개요
래리 월에 따르면 펄은 두 개의 슬로건이 있다. 첫 번째 슬로건은 "어떤 일을 하는 데에는 하나 이상의 길이 있다"이며, 두 번째 슬로건은 "쉬운 일은 쉬워야 하고 어려운 일은 할 수 있어야 한다"(Easy things should be easy and hard things should be possible)이다.

### 특징
펄의 전반적인 구조는 대체적으로 C에서 가져왔다. 펄은 변수, 식, 대입문, 괄호로 구분되는 블록, 제어 구조, 서브루틴을 갖추고 있는 절차적 프로그래밍 언어이다.

펄은 셸 프로그래밍에서도 기능들을 가져왔다. 모든 변수는 시길()을 사용하지는 않는다. 또, 펄은 정렬 기능과 같이 셸 프로그래밍에서 자주 쓰이는 도구들을 제공하는, 운영 체제 기능에 직접 호출하는 내장 함수들을 많이 포함하고 있는데, 이러한 도구들은 셸의 경우 기본 내장이 아닌 외부 명령어로 구현되어 있다는 점에서 펄과 구별된다.

펄은 리스프로부터 리스트 개념을, AWK로부터 해시(연관 배열) 개념을, sed로부터 정규 표현식 개념을 가져왔다. 이를 통해 수많은 구문 분석, 문자열 처리, 데이터 관리 작업을 단순하게 만들어준다.

모든 버전의 펄은 자동 데이터 타이핑 및 자동 메모리 관리 기능을 수행한다. 인터프리터는 프로그램 안의 모든 데이터마다 지니고 있는 자료형과 필요한 기억 공간을 알고 있다. 참조 횟수 계산 방식을 이용하여 필요한 만큼 기억 공간을 할당하고 해제한다.  숫자에서 문자열로의 변환과 같은 유효한 형 변환은 런타임 도중에 자동으로 수행되며 잘못된 형 변환은 치명적인 오류로 간주한다.

### 디자인
펄의 디자인은 컴퓨터 산업의 세 개의 커다란 트렌드에 응하는 것으로 이해할 수 있다: 하드웨어 비용의 감소, 인건비 증가, 컴파일러 기술의 개선. 포트란, C와 같은 초기의 수많은 컴퓨터 언어들은 값비싼 컴퓨터 하드웨어의 효율적인 이용을 목표로 하였다. 반면 펄은 컴퓨터 프로그래머들이 프로그램을 더 빠르고 쉽게 작성할 수 있도록 설계되었다.

펄에는 상당한 CPU와 메모리를 사용하여 프로그래머의 작업을 용이하게 하는 수많은 기능들을 제공한다. 여기에는 자동 메모리 관리, 동적 타이핑, 문자열, 리스트, 해시, 정규 표현식, 자기 검사, 

래리 월은 언어학자로서 훈련을 받았으며 펄의 설계는 언어학적인 원칙으로부터 많은 정보를 얻었다. 그 예로 허프만 부호화(공통이 되는 구조의 길이는 짧아야 한다는 이론), 양호한 문미 중점(end-weighting)의 원리(중요한 정보는 처음에 와야 함), 수많은 언어 프리미티브(language primitive) 요소들의 모임을 포함한다. 펄은 펄 인터프리터를 복잡하게 만든다고 할지라도, 간결하고 사람이 쓰기에 자연스러운 언어 구조체를 선호한다.

펄의 구문은 "어려운 일들은 어렵게 보여야 한다"라는 개념을 반영한다. 이를테면 스칼라, 배열, 해시는 각기 다른 시길을 지니고 있다. 배열의 인덱스들과 해시의 키들은 서로 다른 종류의 괄호를 사용한다. 문자열과 정규 표현식은 다르게 표준화된 구분 문자를 가지고 있다. 이러한 접근은 동일한 S-표현식 구조체와 기본 구문이 여러 목적으로 사용되는 리스프 등의 언어들과는 대조된다.

펄은 특정한 프로그래밍 패러다임을 강요하지 않으며 심지어는 프로그래머가 이들 중 선택하도록 요구하지도 않는다.

### 응용 프로그램
펄은 수많은 표준 및 타사 모듈의 이용과 더불어 수많은 다양한 응용 프로그램들이 있다.

펄은 CGI 스크립트를 작성하는데 주로 사용된다: 펄로 작성된 대형 프로젝트로는 시패널(cPanel), 슬래시, 버그질라, RT, 트위키, 무버블 타입 등이 있다. 펄을 광범위하게 사용하면서도 트래픽이 많은 웹사이트로는 Priceline.com, 크레이그리스트, 슬래시닷, 티켓마스터 등이 있다. PHP나 파이썬 대신 웹 개발을 위한 LAMP 기술 스택 구성요소를 선택적으로 사용할 수 있다.

펄을 이용하여 그래픽 사용자 인터페이스(GUI)의 개발이 가능하다. 이를테면 펄/Tk와 wxPerl이 펄 스크립트로 사용자 상호 작용을 가능케 하는데 흔히 사용된다. 이러한 상호 작용은 GUI를 업데이트하는 콜백을 이용하여 동기식이나 비동기식으로 처리가 가능하다.

### 구현
코어 인터프리터로서 펄은 C 언어로 작성되어 있으며 많은 수의 모듈은 펄과 C로 작성되어 있다. 인터프리터는 150,000 줄의 C 코드로 되어 있고 일반적인 머신 아키텍처를 대상으로 1 MB 정도의 실행 파일로 컴파일된다.

인터프리터는 객제 지향 구조이다. 펄 언어의 요소들인 스칼라, 배열, 해시, 코드 참조(coderef), 파일 핸들은 모두 C 구조체에 의해 인터프리터 안에서 표현된다. 이러한 구조체들의 동작은 많은 수의 매크로, typedef, 함수의 모임에 의해 정의된다. 이들은 펄 C API를 이룬다.

### 이용 가능
펄은 GNU GPL과 아티스틱 라이선스라는 이중 라이선스 하에 배포된다. 배포판들은 대부분의 운영 체제에서 이용이 가능하다. 특히 유닉스와 유닉스 계열 운영 체제에서 널리 쓰이지만 현대의 대부분의 플랫폼에 포팅되고 있다.

#### 윈도우
마이크로소프트 윈도우의 사용자들은 Win32 버전의 펄 이진 배포판인 스트로베리 펄과 액티브펄 가운데 하나를 설치하여 사용하는 것이 일반적이다.

## 데이터베이스 인터페이스
펄의 문자열 핸들링 기능은 SQL 쿼리를 생성하는데 사용될 수 있다. 배열, 해시, 자동 메모리 관리 기능을 통해 반환된 데이터를 수집하고 처리하기 매우 쉽다. 이를테면 Tim Bunce의 펄 DBI API 내에서 API에 대한 인수들은 SQL 쿼리의 텍스트로 지정할 수 있다. 그러므로 여러 언어로 구성된 프로그램을 동시에 이용할 수 있다.  프로그래밍적으로 사용자가 SQL 쿼리 각각을 만들 수 있는 펄의 변수 보간의 이용, 그리고
각 SQL 쿼리로부터 결과 데이터셋을 프로그래밍적으로 보관하기 위한 구조로서의 펄 배열 또는 해시의 사양은 펄의 하위 프로그램에 의해 후처리할 목적으로 많은 양의 데이터를 관리하기 위한 높은 수준의 매커니즘을 허용한다. 초기 버전의 펄에서 데이터베이스 인터페이스들은 클라이언트 사이드 데이터베이스 라이브러리로 인터프리터를 다시 연결함으로써 작성되었다. 이것은 매우 어려운 작업이었는데, 가장 중요하고 가장 널리 사용되는 데이터베이스들 중 일부에 한해서만 할 수 있었고, 결과물이 되는  실행파일이 한 번에 하나의 데이터베이스 인터페이스만 사용할 수 있도록 제한되었기 때문이다.

펄 5에서 데이터베이스 인터페이스들은 펄 DBI 모듈을 통해 구현된다. DBI (데이터베이스 인터페이스) 모듈은 하나의 데이터베이스 독립 인터페이스를 펄 응용 프로그램들에 제공하는 반면, DBD (데이터베이스 드라이버) 모듈들은 일부 50개의 다른 데이터베이스의 세세한 부분을 관리한다. 대부분의 ANSI SQL 데이터베이스에 맞는 DBD 드라이버들이 존재한다.

DBI는 데이터베이스 핸들과 쿼리를 위한 캐시를 제공하며 mod perl과 같이 장기간 생존한 실행 환경들의 성능을 상당히 개선시켜 줄 수 있어, 슬래시닷 효과에서처럼, 볼륨이 큰 시스템들이 부하가 급증하는 현상을 예방할 수 있다.

현대의 펄 응용 프로그램들에서, 특히 카탈리스트와 같은 웹 프레임워크를 이용하여 작성된 프로그램의 경우, DBI 모듈은 종종 SQL 쿼리를 만들어서 응용 프로그램 제작자에게 투명하게 데이터를 관리하게 하는 DBIx::Class, Class::DBI Rose::DB::Object 등의 객체 관계 매퍼를 통해 간접적으로 사용된다.

## 라쿠 (펄 6)
2000년에 펄 콘퍼런스에서 존 오원트(Jon Orwant)는 새로운 주된 언어의 발의를 위한 케이스를 만들었다.

펄 6는 하위 호환성을 고려하지는 않지만 호환성 모드는 존재한다. 공통 계통을 지니면서도 펄 6와 펄 5는 구별된 언어이다.

## 펄 7
펄 7은 2020년 6월 24일 펄 5의 연장자로서 "클라우드 펄 콘퍼런스"(The Perl Conference in the Cloud)에서 발표되었다. 펄 5.32에 기반을 둔 펄 7은 펄 5와 하위 호환되도록 설계되어 있다.

## 펄 커뮤니티

### IRC 상의 펄
언어 및 일부 모듈 지원을 제공하는 수많은 IRC 채널이 있다.

## CPAN
펄은 모듈을 이용하여 특정 기능을 쉽게 사용할 수 있다. 예를 들어, 다른 프로그램이나 네트워크와의 통신, 각종 파일 형식의 처리, 수치 계산 등을 위한 수많은 모듈이 존재한다. [http://www.cpan.org CPAN] 은 이러한 모듈을 체계적으로 관리하는 조직이며, 인터넷에서 서비스되고 있다. 펄이 동작하고 있는 컴퓨터가 인터넷에 접속되어 있으면, 반자동으로 CPAN과 접촉해 모듈을 가져와서 설치할 수 있다.

## 예제 코드
이전 버전의 펄의 Hello World 프로그램은 다음과 같다:

나중에 나온 버전에서는 다음과 같이 쓸 수 있다:

더 복잡한 프로그램을 위해서 를 쓰는 것이 좋다:

최대 주어진 임계값까지 초 단위로 카운트 다운을 하는 더 복잡한 펄 프로그램의 예는 다음과 같다:

	use strict;
	use warnings;

	my ;

	$remaining = $total = shift(@ARGV);

	STDOUT->autoflush(1);

	while ( $remaining ) {
		printf ;
		sleep 1;

	print "\n";