막상 읽다보니 예제로 든 펄 코드들이 상당히 구식 스타일이라서... 내용 전체가 전반적으로 현대의 펄과 맞지 않는 듯 하여서 마저 번역할까 말까 고민 중. 일단 쓴 게 아까워서 페이지는 놔둠
Perl과 자바는 많은 부분이 비슷하고, 많은 부분이 다르다. 둘 다 절차적이고, 비슷한 키워드와 구조를 가지고 있고, 기능은 서브루틴(메쏘드,함수)으로 분리되고, 객체지향과 예외처리, 패키지를 지원한다. 반면 펄은 문법이 매우 유동적이고, 기본 언어의 기능이 자바보다 훨씬 많다.
유동적인 문법이란 말은 펄은 같은 일을 하는 데 여러 가지 다른 방법을 지원한다는 뜻이다. 다음과 같은 자바 코드가 있다면,
if (!test)
{
throw new Exception ("aargh");
}
펄에서는 똑같이 다음과 같이 쓸 수 있다:
if (!test)
{
die ("aargh");
}
이것은 자바 버전과 매우 유사하다. 하지만 이것은 다음과 같이 쓸 수도 있다:
unless (test)
{
die ("aargh");
}
unless
는 '~가 아니라면'의 뜻이다. 그러나 더 보편적으로, 숙련된 펄 해커들은 다음과 같은 식으로 쓸 것이다:
test or die ("aargh");
왜 자바로는 똑같이 압축된 형태로 쓸 수 없는가? 자바는 문법 구조가 매우 경직되어 있다. 첫째로 논리 연산자 AND(&&)나 OR(||)는 불리언 타입을 갖는 피연산자에만 쑬 수 있다. test는 여기 해당된다고 가정해도 throw에서는 값을 얻을 수 없어서 논리값 비교에 쓸 수 없다. 두번째로 논리 연산자들로 구성된 구문은 그 자체가 불리언 타입을 반환해야 한다. 셋째로 논리 비교식은 독립적인 구문으로 존재할 수 없다. if (x || y) {};
는 괜찮지만 x || y;
는 불가능하다.
펄의 이러한 문법의 유연함이 더 좋은지 나쁜지는 스스로 판단할 문제이다. 펄의 문법은 매우 빈번한 연산을 짧은 형태로 표현할 수 있게 해 주는 반면 종종 펄 프로그래머가 아닌 사람들이 읽을 수 없게 된다.
기본 언어의 기능을 비교하면 펄이 자바보다 훨씬 풍부하다. 이것은 펄이 더 많은 일을 할 수 있다는 뜻이 아니라, 단지 기본 언어가 더 많은 일을 할 수 있다는 뜻이다. 자바의 철학은 언어 중추는 매우 간단하게 유지하고 다른 모든 기능을 표준 클래스 라이브러리에 넣는 것이었다. 따라서, 예를 들어, 펄은 연관 배열을 언어의 일부로서 지원한다. 자바는 java.util 패키지에 있는 클래스들을 통하여 지원한다. 펄은 정규표현식을 프로그램 구문에 직접 적을 수 있는 반면 자바는 정규식이 클래스에 캡슐화되어 있을 것을 기대한다. 어느 쪽이 더 좋고 나쁜 건 아니며 그저 다를 뿐이다.
2. 기본 요소
2.1. 프로그램 구조와 철학
- 둘 다 절차적이다. 프로그램은 구문(statement)들로 구성되고, 이 구문들은 컴퓨터가 어떤 순서대로 어떤 동작을 수행하도록 지시한다. 구문은 {...}을 사용하여 그룹지어지고, 세미콜론(;)으로 끝난다.
- 펄의 문법은 자바와 매우 유사하다. 자바의 키워드들 중 많은 것이 펄에도 있다. 그러나 펄은 문법적으로 매우 유연하다.
- 펄에도 객체 지향적인 특징이 있지만 옵션이다. 자바와 달리 전혀 객체 지향을 쓰지 않고도 프로그램을 작성할 수 있다.
- 펄은 가비지 컬렉션이 있으며, 개발자가 메모리 관리에 관여하지 않도록 한다. 자바와 달리 스코프를 벗어나도 가비지 컬렉터에 의해 회수되지 않는 오브젝트를 정의할 수 있다.
- C++처럼, 그리고 자바와 달리, 펄은 변수의 레퍼런스를 특정하게 조작할 수 있다.
- 대체적으로 펄은 자바에 비해 타입 체킹이 느슨하다(weakly typed).
- 자바처럼 펄은 인터프리터 언어이다. 플랫폼에 네이티브하게 실행되는 머신 코드를 생성하지 않는다.
- 자바는 바이트코드를 생성하여 .class 파일에 저장하고 런타임 환경에 제공하여 실행한다:
javac Test.java
java Test
- 펄은 인터프리터가 소스 코드를 파스 트리로 번역하고 동일한 프로세스 내에서 펄 런타임을 이용하여 해석한다.
perl Test.pl
- 유닉스 환경에서 더 보편적인 방법은 소스 코드 처음에 펄 인터프리터를 실행하라고 적어두고,
#!/usr/bin/perl
- 그 다음 커맨드 라인에서 직접 실행하는 것이다.
Test.pl
자바 프로그램의 실행은 특정 클래스의 main()
메쏘드에서 시작한다. 모든 코드와 데이타는 이런 저런 클래스의 이런 저런 메쏘드 안에 있어야 한다. 펄에서는 실행 순서는 (대부분) 특정 파일의 위에서 아래 방향으로 이뤄진다. 함수 정의를 제외한 나머지 구문들은 나타나면 바로 실행된다. 파일의 끝에 다다르면 실행이 끝난다.
따라서 다음은 올바르게 동작하는 완전한 펄 프로그램이다.
print "Hello, world!\n"
위에서 아래로 규칙에 몇가지 예외가 있다. 첫째로 완전한 펄 프로그램을 다른 펄 프로그램 내에서 실행할 수 있다. 이렇게 해서 펄 프로그램이 별개의 '모듈'들로부터 만들어질 수 있다(자바와 같다). 둘째로 모듈들은 생성자와 소멸자가 있을 수 있고(어느정도 자바와 비슷), 'autoload' 기능이 있다(자바와 전혀 비슷하지 않음). 펄에서 AUTOLOAD
라는 함수는 존재하지 않는 함수에 대해 참조가 발생하면 불리게 되며 함수를 동적으로 만들어내는 데 사용된다.
실행은 파일의 끝에 다다르기 전에 die
함수를 쓰거나(이 때는 예외가 발생한다) exit()
함수를 쓰거나(자바의 System.exit()
와 유사) 몇 가지 다른 구조를 써서 종료할 수 있다. 이런 구조들 중에는 __DATA__
지시자가 있는데, 이것은 이 뒤에 오는 모든 것이 실행 코드가 아니라 데이타라는 것을 의미한다. 프로그램은 이 데이타를 미리 정의된 파일핸들을 써서 읽을 수 있다. 이런 것은 자바에는 존재하지 않는다.
3. 리터럴, 변수, 식별자
3.1. 렉시컬 심볼과 토큰들
3.3. 데이타 타입과 타입 체크
4. 연산자들
4.5. 연산자 오버로딩
5. 조건문과 루프
8. 파일 입출력
9. 객체 지향 펄
9.1. 클래스와 패키지
9.4. 인스턴스 상태 관리
10. 정규 표현식
기타분류