펄 언어 구조는 고급 프로그래밍 언어인 펄(Perl)의 문법 규칙과 프로그램이 구성되는 일반적인 방식을 모두 포함한다. 펄은 1987년 래리 월(Larry Wall)이 개발한 인터프리터 방식의 동적 프로그래밍 언어로, "어떤 일을 하는 데에는 하나 이상의 길이 있다(TIMTOWTDI)"라는 설계 철학을 가진다. 다중 패러다임을 지원하며, 모듈화를 장려하는 구조로 설계되었다.
자료형 체계
펄의 기본 자료형은 스칼라(scalar), 배열(array), 해시(hash), 파일 핸들(filehandle), 서브루틴(subroutine), 타입글로브(typeglob)로 구분된다. 각 자료형은 시길(sigil)이라는 접두 기호로 식별된다.
| 유형 | 시길 | 설명 |
|---|---|---|
| 스칼라 | $ |
단일 값(숫자, 문자열, 참조) |
| 배열 | @ |
순서가 있는 스칼라 컬렉션 |
| 해시 | % |
키-값 쌍의 연관 배열 |
| 파일 핸들 | (없음) | 파일 입출력 대상 |
| 서브루틴 | & |
실행 가능한 코드 조각 |
| 타입글로브 | * |
심볼 테이블 항목 |
펄은 동적 타입 언어로, 변수 선언 시 자료형을 명시하지 않으며 사용되는 컨텍스트(스칼라 컨텍스트, 리스트 컨텍스트)에 따라 값이 자동으로 변환된다. 숫자와 문자열 간의 변환도 컨텍스트에 따라 자동으로 이루어진다.
변수와 문자열 처리
문자열 리터럴은 따옴표로 묶으며, 이중 따옴표(" ")를 사용하면 변수 삽입(interpolation)이 이루어지고 작은 따옴표(' ')를 사용하면 변수 삽입이 방지된다. q()와 qq() 연산자를 통한 따옴표 처리도 가능하며, 여러 줄 문자열은 히어 도큐먼트(here document)로 정의할 수 있다.
제어 구조
펄은 C 계열 언어와 유사한 블록 지향 제어 구조를 제공한다. 조건문은 if, unless, elsif, else를 사용하며, 반복문은 while, until, for, foreach를 지원한다. 단일 문장에 대해서는 문장 수정자(statement modifier) 형태로 더 간결한 문법을 제공한다. 펄 5.10부터는 given/when 다중 분기문이 도입되었다.
단락 논리 연산자(&&, ||, and, or)는 표현식 수준에서 제어 흐름에 영향을 미치는 데 사용된다. 흐름 제어 키워드 next, last, return, redo는 표현식으로 취급되어 단락 연산자와 함께 사용할 수 있다.
서브루틴
서브루틴은 sub 키워드로 정의된다. 매개변수는 개수나 유형을 선언할 필요 없이 특수 배열 @_를 통해 접근하며, 호출마다 달라질 수 있다. my 키워드를 사용하여 어휘적 스코프(lexical scope)를 지정할 수 있다. 서브루틴은 return 문을 통해 값을 반환하거나, 마지막으로 평가된 표현식을 반환값으로 사용한다. wantarray 함수를 통해 호출 컨텍스트를 확인할 수 있다.
정규 표현식
펄은 정규 표현식을 언어 수준에서 내장하고 있으며, m//(매치) 연산자와 s///(대체) 연산자를 통해 문자열 패턴 매칭 및 치환을 수행한다. 정규 표현식 엔진은 퇴각검색(backtracking) 알고리즘을 사용한다. 펄의 정규 표현식 문법은 PHP, Ruby, Java, .NET 등 다른 언어와 응용 프로그램에서도 채택되어 펄 호환 정규 표현식(PCRE)으로 널리 사용된다.
객체 지향 프로그래밍
펄은 축복(bless)된 참조를 사용하는 기본적인 객체 지향 방식을 지원한다. 참조를 특정 패키지에 속하도록 지정하여 메서드를 호출할 수 있다. 최신 펄 애플리케이션에서는 Moose 객체 시스템이 널리 사용되며, 이는 메타 객체 프로토콜(Class::MOP) 위에 구축되어 속성, 상속, 역할(role), 메서드 수정자 등의 기능을 제공한다.
모듈 시스템
펄은 CPAN(Comprehensive Perl Archive Network)을 통해 10만 개 이상의 모듈을 제공하는 방대한 모듈 생태계를 갖추고 있다. package 키워드로 네임스페이스를 정의하고, use 키워드로 모듈을 불러와 사용한다. 이는 유닉스 기반의 구성 요소 기반 설계 구조에 기인한다.