Perl 5.18.0 변경 사항

Perl 5.18.0 변경 사항 (perl5180delta)

이 문서는 Perl v5.16.0 릴리스와 v5.18.0 릴리스 사이의 차이를 설명해요.

v5.14.0 같은 더 오래된 릴리스에서 업그레이드하는 경우, v5.14.0과 v5.16.0 사이의 차이를 설명하는 perl5160delta를 먼저 읽어 보세요.

출처: perldoc - perl5180delta

본문

핵심 개선 사항 (Core Enhancements)

실험적 기능의 새 메커니즘

새로 추가된 실험적 기능은 이제 이런 주문이 필요해요:

no warnings "experimental::feature_name";
use feature "feature_name";  # 윗줄이 없으면 경고가 날 거예요

feature 프래그마가 실험적 기능을 켤 때 내는 경고를 담는 "experimental"이라는 새 warnings 범주가 생겼어요.

새 실험적 기능에는 "experimental::" 뒤에 기능 이름이 붙는 특수 경고 ID도 주어져요. (no warnings "experimental::feature_name"이라고 하면 이 기능의 향후 변경·제거로 인한 깨짐에 대한 책임을 지는 겁니다.)

~~이나 my $_ 같은 일부 기능이 이제 실험 경고를 내므로, 이런 경고 범주를 인식하지 못하는 perl에서도 도는 코드에서는 이렇게 if 프래그마를 쓰는 걸 고려해 보세요:

no if $] >= 5.018, warnings => "experimental::feature_name";

기존 실험적 기능도 이 경고를 내기 시작할 수 있어요. 어떤 기능이 실험적 취급인지는 perlexperiment를 참고하세요.

해시 개편

perl v5.18.0의 해시 구현 변경은 기존 코드 동작에서 가장 눈에 띄는 변경 중 하나가 될 거예요.

기본 설정에서, 같은 키와 값을 가진 두 개의 서로 다른 해시 변수가 이제 이전에는 같았던 순서를 다른 순서로 내용을 제공할 수 있어요. 이런 변경을 만나면 정리하는 핵심은 해시는 순서 없는 집합이라는 걸 받아들이고 그에 맞게 행동하는 거예요.

해시 무작위화

Perl 해시 함수가 쓰는 seed가 이제 무작위예요. 즉 keys(), values(), each() 같은 함수가 키/값을 돌려주는 순서가 실행마다 달라져요.

이 변경은 Perl 해시를 알고리듬 복잡성 공격에 더 견고하게 하려고, 그리고 해시 순서 의존 버그를 드러내고 추적하기 쉽게 해 준다는 걸 발견했기 때문에 도입됐어요. 툴체인 유지자는 이런 것을 테스트하는 추가 인프라에 투자하고 싶을 거예요. 테스트를 연달아 여러 번 실행한 뒤 결과를 비교하면 코드의 해시 순서 의존을 발견하기 쉬워져요. Perl 해시의 키 순서를 안전하지 않은 청중에게 노출하지 않는 걸 강력히 권장해요.

또한 모든 해시는 고유한 반복 순서를 가져서, 현재 해시 seed를 알아내는 게 훨씬 어려워져요.

새 해시 함수

Perl v5.18은 여러 해시 함수를 지원하고 기본값을 ONE_AT_A_TIME_HARD로 바꿨어요. 컴파일 타임에 심볼을 정의해 다른 알고리듬을 고를 수 있어요. 현재 목록은 F 문서를 참고하세요. v5.18부터 기본값이나 SIPHASH만 사용을 권장할 수 있어요. 나머지는 모두 알려진 보안 문제가 있어 연구 목적으로만 써요.

PERL_HASH_SEED 환경 변수가 이제 16진수 값을 받음

PERL_HASH_SEED는 더 이상 정수를 매개변수로 받지 않아요. 대신 "0xf5867c55039dc724"처럼 16진수 문자열로 인코딩된 이진 값이 기대돼요. 이는 인프라가 정수 범위를 넘을 수 있는 임의 길이 해시 seed를 지원하도록 하려는 거예요. (SipHash는 16바이트 seed를 써요.)

PERL_PERTURB_KEYS 환경 변수 추가

PERL_PERTURB_KEYS 환경 변수는 keys 등에 적용되는 무작위화 수준을 제어하게 해 줘요.

PERL_PERTURB_KEYS가 0이면 perl이 키 순서를 전혀 무작위화하지 않아요. 삽입 때문에 keys가 바뀔 확률은 이전 perl과 같고, 기본적으로 버킷 크기가 바뀔 때만 그래요.

1이면 perl이 반복 불가능한 방식으로 키를 무작위화해요. 삽입 때문에 keys가 바뀔 확률이 매우 높아요. 가장 안전하고 기본 모드예요.

2면 perl이 반복 가능한 방식으로 키를 무작위화해요. 같은 프로그램을 반복 실행하면 매번 같은 출력을 내야 해요.

PERL_HASH_SEED는 기본이 아닌 PERL_PERTURB_KEYS 설정을 의미해요. PERL_HASH_SEED=0(정확히 0 하나)은 PERL_PERTURB_KEYS=0(해시 키 무작위화 비활성화)을 의미하고, 다른 값은 PERL_PERTURB_KEYS=2(결정적·반복 가능한 해시 키 무작위화)를 의미해요. PERL_PERTURB_KEYS를 다른 수준으로 명시하면 이 동작을 덮어써요.

Hash::Util::hash_seed()가 이제 문자열을 돌려줌

Hash::Util::hash_seed()가 정수 대신 문자열을 돌려줘요. 이는 인프라가 정수 범위를 넘을 수 있는 임의 길이 해시 seed를 지원하도록 하려는 거예요. (SipHash는 16바이트 seed를 써요.)

PERL_HASH_SEED_DEBUG 출력 변경

PERL_HASH_SEED_DEBUG 환경 변수가 이제 perl이 빌드된 해시 함수와 그 프로세스에 쓰이는 16진수 seed를 둘 다 보이게 해요. 새 형식 예시:

$ PERL_HASH_SEED_DEBUG=1 ./perl -e1
HASH_FUNCTION = MURMUR3 HASH_SEED = 0x1476bb9f

유니코드 6.2로 업그레이드

Perl이 이제 유니코드 6.2를 지원해요. 6.1에서의 변경 목록은 http://www.unicode.org/versions/Unicode6.2.0 에 있어요.

문자 이름 별칭이 이제 Latin-1 범위 밖 문자를 포함 가능

\N{...}, charnames::vianame() 등에 쓸 사용자 고유 문자 이름을 정의할 수 있어요. 이 이름은 이제 유니코드 전체 범위의 문자로 구성될 수 있어요. 영어뿐 아니라 모국어로 이름을 지을 수 있게 된 거죠. 쓸 수 있는 문자에 일부 제한이 있어요(예: 구두점이 있는 이름은 정의할 수 없어요). charnames의 "CUSTOM ALIASES" 참고.

새 DTrace 프로브

다음 새 DTrace 프로브가 추가됐어요:

  • op-entry
  • loading-file
  • loaded-file

${^LAST_FH}

이 새 변수는 마지막으로 읽은 파일핸들에 접근하게 해 줘요. $.과 인자 없는 tell·eof가 쓰는 핸들이에요.

정규식 집합 연산

이것은 코드 포인트 집합의 합집합·교집합 등에 대해 매치할 수 있게 하는 실험적 기능으로, Unicode::Regex::Set과 비슷해요. </x> 처리를 [bracketed] 문자 클래스로 확장하는 데도 쓸 수 있고, 사용자 정의 속성의 대체로 쓰면 더 복잡한 표현이 가능해져요. perlrecharclass의 "Extended Bracketed Character Classes" 참고.

어휘 서브루틴

이 새 기능은 여전히 실험적으로 간주돼요. 활성화하려면:

use 5.018;
no warnings "experimental::lexical_subs";
use feature "lexical_subs";

이제 state sub foo, my sub foo, our sub foo로 서브루틴을 선언할 수 있어요. (state sub는 "state" 기능이 활성화되어야 해요. CORE::state sub foo로 쓰지 않으면요.)

state sub는 선언된 어휘 스코프 안에서 보이는 서브루틴을 만들어요. 서브루틴은 바깥 서브루틴에 대한 호출 사이에 공유돼요.

my sub는 포함 블록에 들어갈 때마다 생성되는 어휘 서브루틴을 선언해요. state sub가 일반적으로 my sub보다 약간 빨라요.

our sub는 같은 이름의 패키지 서브루틴에 대한 어휘 별칭을 선언해요. 자세한 내용은 perlsub의 "Lexical Subroutines" 참고.

계산된 레이블

루프 제어 next, last, redo와 특수 dump 연산자가 이제 임의 표현식을 써서 런타임에 레이블을 계산하도록 허용해요. 이전에는 상수가 아닌 인자는 빈 문자열로 취급했어요.

더 많은 CORE:: 서브루틴

CORE:: 네임스페이스의 서브루틴으로 내장 함수 몇 개가 더 추가됐어요. 커스텀 파서 없이 구현할 수 있는, 오버라이드할 수 없는 키워드들이에요: defined, delete, exists, glob, pos, prototype, scalar, split, study, undef.

이 중 일부가 프로토타입을 가지므로, prototype('CORE::...')이 오버라이드 가능/불가능 키워드를 구분하지 않도록 바뀌었어요. 이는 prototype('CORE::pos')prototype(&CORE::pos)과 일관되게 하려는 거예요.

음수 시그널 이름의 kill

kill은 항상 음수 시그널 번호를 허용했어요. 이는 단일 프로세스 대신 프로세스 그룹을 죽이죠. 시그널 이름도 허용했지만, 음수 시그널 이름이 0으로 취급돼 일관되지 않았어요. 이제 -INT 같은 음수 시그널 이름이 지원되고 -2처럼 취급돼요 [perl #112990].

보안 (Security)

해시 개편도 보세요

해시 개편의 일부 변경은 보안 강화를 위한 것이었어요. 그 섹션을 읽어 보세요.

Storable 문서의 보안 경고

Storable 문서에 신뢰할 수 없는 출처의 Storable 문서를 받아들이는 위험을 경고하는 섹션이 추가됐어요. 요약하면 특정 유형 데이터의 역직렬화가 모듈 로딩·기타 코드 실행으로 이어질 수 있어요. 문서화되고 원하는 동작이지만 악의적 개체에게 공격 벡터를 열어 줘요.

Locale::Maketext가 악성 템플릿을 통한 코드 주입 허용

사용자가 Locale::Maketext에 번역 문자열을 제공할 수 있다면, 현재 프로세스에서 사용 가능한 임의의 Perl 서브루틴을 호출하는 데 쓰일 수 있었어요.

이게 수정됐지만, Locale::Maketext 자체나 사용 중인 서브클래스가 제공하는 메서드를 호출하는 것은 여전히 가능해요. 그 메서드 중 하나가 차례로 Perl 코어의 sprintf 서브루틴을 호출해요. 요약하면, 감사 없이 사용자가 번역 문자열을 제공하게 하는 건 나쁜 생각이에요. 이 취약점은 CVE-2012-6329로 문서화돼 있어요.

음수 카운트로 memset 호출 피하기

공격자가 perl의 x 문자열 반복 연산자에 카운트를 지정하도록 하는 형편없이 작성된 perl 코드가 이미 메모리 고갈 서비스 거부 공격을 일으킬 수 있어요. v5.15.5 이전 perl 버전의 결함은 그것을 힙 버퍼 오버런으로 확대할 수 있었고, 2.16 이전 glibc 버전과 결합하면 임의 코드 실행을 허용할 수 있었어요. 이 커밋에서 해결한 결함은 식별자 CVE-2012-5195로 지정됐고 Tim Brown이 연구했어요.

비호환 변경 (Incompatible Changes)

해시 개편도 보세요

해시 개편의 일부 변경은 이전 perl 버전과 완전히 호환되지 않아요. 그 섹션을 읽어 보세요.

\N{...}의 알 수 없는 문자 이름이 이제 문법 오류

이전에는 경고하고 유니코드 REPLACEMENT CHARACTER로 대체했어요. 유니코드는 이제 이 상황을 문법 오류로 만들 것을 권장해요. 또한 이전 동작이 혼란스러운 경고·동작을 일으켰고, REPLACEMENT CHARACTER는 알 수 없는 문자의 자리 표시자 외 용도가 없으므로 이 문제가 있는 코드는 모두 버그예요.

\N{} 문자 이름 별칭의 이전에 deprecated된 문자가 이제 오류

v5.12.0부터 사용자 정의 \N{...} 문자 이름에 특정 문자를 쓰는 게 deprecated였어요. 이것들이 이제 문법 오류를 일으켜요. 예를 들어:

my $undraftable = "\N{4F}";    # Syntax error!

처럼 이름이 숫자로 시작하는 것, 또는 이름 어디든 콤마가 있는 것이 이제 오류예요. charnames의 "CUSTOM ALIASES" 참고.

\N{BELL}이 이제 U+0007 대신 U+1F514를 가리킴

유니코드 6.0이 "BELL" 이름을 전통적으로 의미하던 것과 다른 코드 포인트에 재사용했어요. Perl v5.14부터 이 이름 사용은 여전히 U+0007을 가리켰지만 deprecation 경고를 냈어요. 이제 "BELL"은 U+1F514를 가리키고, U+0007의 이름은 "ALERT"예요. charnames의 모든 함수가 그에 맞게 갱신됐어요.

정규식 대괄호 문자 클래스의 다중 문자 대소문자 구분 없는 매칭의 새 제한

유니코드가 이제 단일 문자가 대소문자 구분 없이 여러 문자와 매치할 수 있는 경우(예: LATIN SMALL LETTER SHARP S와 시퀀스 ss)를 정규식이 자동으로 처리하라는 이전 권장을 철회했어요. 모든 상황에서 올바르게 하는 게 실행 불가능하다는 게 드러났기 때문이에요. Perl이 최선을 다해 해 온 만큼 계속하려고 해요 (끄는 옵션을 고려 중이에요). 하지만 [bracketed] 문자 클래스에서 그런 매치에 새 제한이 추가돼요. 사람들이 </[\\0-\\xff]/i> 같은 걸 지정하고 이 범위에 LATIN SMALL LETTER SHARP S가 있으므로 두 문자 시퀀스 ss와 매치된다는 게 놀라워했죠. 이 동작은 범위 대신 속성을 쓰는 것과도 일관되지 않아요: \p{Block=Latin1}도 LATIN SMALL LETTER SHARP S를 포함하지만 </[\p{Block=Latin1}]/i>ss와 매치하지 않아요. 새 규칙은 대괄호 문자 클래스 안에서 다중 문자 대소문자 구분 없는 매치가 있으려면 그 문자가 명시적으로 나열되어야 하고, 범위의 끝점으로는 안 된다는 거예요. 이는 최소 놀람의 원칙에 더 부합해요. perlrecharclass의 "Bracketed Character Classes" 참고. 이 변경의 일부로 수정된 [perl #89774] 버그가 이전 동작이 완전히 작동하는 걸 막고 있었어요.

변수 이름과 식별자에 대한 명시적 규칙

감독으로 v5.16의 단일 문자 변수 이름은 완전히 제한이 없었어요. 이는 몇 종류의 말도 안 되는 것에 문을 열어 줬어요. v5.18부터 이들은 \p{POSIX_Punct} 속성과 매치하는 문자를 받아들인 것 외에 다른 식별자의 규칙을 따라요.

중괄호를 쓴 식별자와 안 쓴 식별자의 파싱에 더 이상 차이가 없어요. 예를 들어 perl은 $foo:bar은 안 되면서 ${foo:bar}(콜론 하나)는 허용했어요. 이제 둘 다 단일 코드 경로로 처리되어 같은 방식: 둘 다 금지예요. 이 변경은 허용된 리터럴 식별자의 범위에 관한 것이지 다른 표현식이 아니에요.

세로 탭이 이제 공백

아무도 \s\cK(세로 탭)와 매치하지 않는 이유를 기억하지 못했어요. 이제 매치해요. 그 문자가 극히 드물어서 깨짐은 거의 없을 거예요. 의미는: 정규식의 \s가 이제 모든 상황에서 세로 탭과 매치해요. </x> 수정자가 쓰이면 정규식 리터럴의 리터럴 세로 탭이 무시돼요. 문자열을 숫자로 해석할 때 앞의 세로 탭(단독 또는 다른 공백과 섞여)이 이제 무시돼요. 예:

$dec = " \cK \t 123";
$hex = " \cK \t 0xF";

say 0 + $dec;   # 경고와 함께 0이었음, 이제 123
say int $dec;   # 0이었음, 이제 123
say oct $hex;   # 0이었음, 이제  15

/(?{})//(??{})/가 대폭 재작업

이 기능의 구현이 거의 완전히 다시 쓰였어요. 주된 의도는 버그 수정이지만, 특히 어휘 변수의 스코프와 관련된 일부 동작이 바뀔 거예요. 이는 "선택된 버그 수정" 섹션에서 더 자세히 설명돼요.

치환 치환 문자열의 더 엄격한 파싱

더 이상 이렇게 s///e를 파서가 파싱하는 방식을 남용할 수 없어요:

%_=(_, "Just another ");
$_="Perl hacker,\n";
s//_}->{_/e;print

given이 이제 전역 $_의 별칭을 만듦

암시적 어휘 $_에 할당하는 대신, given은 이제 foreach처럼 인자에 대해 전역 $_을 별칭으로 만들어요. 다만 스코프에 어휘 $_이 있으면 여전히 어휘 $_을 써요(역시 foreach처럼) [perl #114020].

smartmatch 계열 기능이 이제 실험적

v5.10.0에 추가되고 v5.10.1에서 크게 수정된 smart match는 꾸준한 불만 지점이었어요. 유용한 여러 방식이 있지만, Perl 사용자와 구현자 모두에게 문제가 있고 혼란스러운 것으로 드러났어요. 이를 해결하는 여러 제안이 있었어요. smartmatch는 향후 거의 확실히 바뀌거나 사라질 거예요. 현재 동작에 의존하는 건 권장되지 않아요.

파서가 ~~, given, when을 볼 때 경고가 이제 발행돼요. 이 경고를 끄려면 적절한 스코프에 이 줄을 추가할 수 있어요:

no if $] >= 5.018, warnings => "experimental::smartmatch";

다만 이 기능들이 안정되기 전에 다시 동작이 바뀔 수 있으니 사용을 대체하는 걸 고려해 보세요.

어휘 $_이 이제 실험적

Perl v5.10에서 도입된 이후 명확한 해결책 없이 많은 혼란을 일으켰어요:

  • 다양한 모듈(예: List::Util)이 콜백 루틴이 전역 $_을 쓰길 기대해요. use List::Util 'first'; my $_; first { $_ == 1 } @list가 기대대로 동작하지 않아요.
  • 같은 파일 앞쪽의 my $_ 선언이 혼란스러운 클로저 경고를 일으킬 수 있어요.
  • "_" 서브루틴 프로토타입 문자는 호출된 서브루틴이 여러분의 어휘 $_에 접근하게 해 줘서, 실제로는 그렇게 private이 아니에요.
  • 그럼에도 "(@)" 프로토타입을 가진 서브루틴과 메서드는 XS로 작성되지 않으면 호출자의 어휘 $_에 접근할 수 없어요.
  • 하지만 XS 루틴조차 호출 서브루틴이 아니라 바깥 스코프에 선언된 어휘 $_에, 그 서브루틴이 $_을 언급하지 않거나 $_을 기본으로 하는 연산자를 쓰지 않았다면 접근할 수 없어요.

어휘 $_이 재활될 수 있길 바라지만 이는 동작 변경을 일으킬 수 있어요. 안정될 때까지 주의해서 쓰세요.

$/ = \N일 때 readline()이 N 바이트가 아닌 N 문자를 읽음

이전에는 encoding 같은 I/O 레이어가 있는 스트림에서 읽을 때 readline() 함수(일명 <> 연산자)가 최상위 레이어에서 N 바이트를 읽었어요 [perl #79960]. 이제 N 문자를 읽어요. 추가 레이어가 없는 스트림에서 읽을 때는 바이트가 문자에 정확히 대응하므로 동작 변화가 없어요.

오버라이드된 glob에 이제 인자 한 개가 전달됨

glob 오버라이드에 호출자를 식별하는 마술의 비문서화 두 번째 인자가 전달되곤 했어요. CPAN의 어떤 것도 이것을 쓰지 않았고, 버그 수정을 방해해서 제거됐어요. 호출자를 식별해야 한다면 CPAN의 Devel::Callsite를 참고하세요.

Here doc 파싱

따옴표류 연산자 안의 here document 본문이 이제 항상 "<<foo" 표시 다음 줄에서 시작해요. 이전에는 포함하는 따옴표류 연산자 다음 줄에서 시작하도록 문서화됐지만 그건 때때로만 그랬어요 [perl #114040].

영숫자 연산자가 정규식의 닫는 구분자와 분리되어야 함

더 이상 이렇게 쓸 수 없어요:

m/a/and 1

대신 이렇게, 연산자를 정규식의 닫는 구분자와 분리하는 공백과 함께 써야 해요:

m/a/ and 1

공백이 없으면 Perl v5.14.0 이후 deprecation 경고가 났어요.

qw(...)를 더 이상 괄호로 쓸 수 없음

qw 목록이 파서가 항상 괄호로 둘러싸였다고 속이곤 했어요. 이는 foreach $x qw(a b c) {...} 같은 놀라운 구성을 허용했는데, 실제로는 foreach $x (qw(a b c)) {...}로 써야 해요. 이것들은 때때로 lexer를 잘못된 상태로 만드는 부작용 때문에 완전히 동작하지 않았고, 비슷한 foreach qw(a b c) {...}는 기대할 수 있음에도 전혀 동작하지 않았어요.

qw의 부작용이 이제 폐지됐어요. Perl v5.13.11부터 deprecated였어요. 이제 문법이 요구하는 모든 곳에서 실제 괄호를 쓰는 게 필요해요.

어휘 경고와 기본 경고의 상호작용

어휘 경고를 켜는 게 원래 어휘 경고가 아직 켜져 있지 않으면 모든 기본 경고를 먼저 비활성화했어요:

$*; # deprecation warning
use warnings "void";
$#; # void warning; no deprecation warning

이제 debugging, deprecated, glob, inplace, malloc 경고 범주는 어휘 경고를 켤 때 켜진 채로 남아요(물론 no warnings로 끄지 않는 한). 이는 예전에 경고가 없던 코드에서 deprecation 경고가 발생하게 할 수 있어요. 그것들은 오직 기본 경고로만 구성된 유일한 범주예요. 다른 범주의 기본 경고는 여전히 use warnings "category"로 비활성화돼요. 개별 경고 제어 인프라가 아직 없기 때문이에요.

state subour sub

역사적 사고로 state subour sub이 일반 sub과 동등해서, our sub { ... }로 익명 sub을 만들 수도 있었어요. 이것들은 이제 "lexical_subs" 기능 밖에서 금지돼요. "lexical_subs" 기능 아래에서는 perlsub의 "Lexical Subroutines"에 설명된 새 의미를 가져요.

환경에 저장된 정의된 값이 바이트 문자열로 강제됨

환경 변수에 저장된 값은 자식 프로세스에 상속될 때 항상 문자열화됐어요. 이 릴리스에서 %ENV에 할당하면 값이 즉시 문자열화되고 바이트 문자열로만 변환돼요. 먼저 문자열로만 강제되고, utf8이고 utf8::downgrade()의 등가가 동작하면 그 결과가 쓰이고, 그렇지 않으면 utf8::encode()의 등가가 쓰이고 와이드 문자에 대한 경고가 발행돼요.

require가 읽을 수 없는 파일에서 죽음

require가 읽을 수 없는 파일을 만나면 이제 죽어요. 이전에는 그 파일을 무시하고 @INC의 디렉터리를 계속 검색했어요 [perl #113422].

gv_fetchmeth_*와 SUPER

다양한 gv_fetchmeth_* XS 함수가 이름이 ::SUPER로 끝나는 패키지를 특별 취급하곤 했어요. Foo::SUPER 패키지에서 메서드 조회가 Foo 패키지의 SUPER 메서드 조회로 취급됐죠. 더 이상 그렇지 않아요. SUPER 조회를 하려면 Foo stash와 GV_SUPER 플래그를 전달하세요.

split의 첫 인자가 더 일관되게 해석됨

v5.17 초반의 일부 변경 후 split의 동작이 단순화됐어요: PATTERN 인자가 공백 하나를 포함한 문자열로 평가되면, 공백 하나를 포함한 literal 문자열이 예전에 그랬던 방식으로 취급돼요.

Deprecations

모듈 제거

다음 모듈이 향후 릴리스에서 코어 배포판에서 제거되고 그때 CPAN에서 설치해야 해요. 이를 요구하는 CPAN 배포판은 이를 전제 조건으로 나열해야 해요.

이 모듈들의 코어 버전은 이제 사실을 알리기 위해 "deprecated" 범주 경고를 내요. 이 deprecation 경고를 잠재우려면 해당 모듈을 CPAN에서 설치하세요.

이들은 (드문 예외를 제외하고) 계속 쓰길 권장하는 훌륭한 모듈이에요. 코어에서 제외되는 주된 이유는 완전히 기능하는, CPAN 가능한 Perl 설치를 부트스트래핑하는 필요성과 관련이 있지, 보통 설계 우려는 아니에요.

  • encoding — 이 프래그마 사용은 이제 강력히 권장되지 않아요. 소스 텍스트의 인코딩과 I/O 데이터의 인코딩을 혼동하고, 소스 텍스트의 이스케이프 시퀀스를 재해석하며(의심스러운 선택), 문자 문자열의 모든 런타임 처리에 UTF-8 버그를 도입해요. 설계대로 깨졌고 수리 불가예요. 소스 텍스트의 비ASCII 리터럴 문자는 utf8을, 텍스트 I/O 데이터는 Encodeopen을 참고하세요.
  • Archive::Extract
  • B::Lint
  • B::Lint::Debug
  • CPANPLUS와 포함된 모든 CPANPLUS::* 모듈
  • Devel::InnerPackage
  • Log::Message
  • Log::Message::Config
  • Log::Message::Handlers
  • Log::Message::Item
  • Log::Message::Simple
  • Module::Pluggable
  • Module::Pluggable::Object
  • Object::Accessor
  • Pod::LaTeX
  • Term::UI
  • Term::UI::History

Deprecated 유틸리티

다음 유틸리티가 관련 모듈이 deprecated됨에 따라 향후 릴리스에서 코어 배포판에서 제거될 거예요. 해당 CPAN 배포판과 함께 계속 사용할 수 있어요.

  • cpanp
  • cpanp-run-perl
  • cpan2dist — 이들은 CPANPLUS 배포판의 일부.
  • pod2latexPod::LaTeX 배포판의 일부.

PL_sv_objcount

인터프리터의 총 Perl 객체 수를 추적하던 이 인터프리터 전역 변수는 더 이상 유지되지 않고 Perl v5.20에서 완전히 제거될 거예요.

</x>가 있는 패턴에서 이스케이프해야 할 다섯 문자 추가

정규식 패턴이 </x>로 컴파일되면 Perl은 SPACE·TAB 같은 6개 문자를 무시할 공백으로 취급해요. 하지만 유니코드는 11개 문자를 그렇게 취급할 것을 권장해요. 향후 Perl 버전에서 이에 따를 거예요. 그동안 빠진 문자를 사용하면 (끄지 않는 한) deprecation 경고가 발생해요. 다섯 문자는:

U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR

놀라운 공백이 있는 사용자 정의 charnames

끝이나 연속 여러 개의 공백이 있는 사용자 정의 문자 이름은 아마 오타일 거예요. 정의될 때 이제 경고가 생성돼요. 그 사용이 과도한 공백을 포함할 가능성이 낮다는 가정이에요.

다양한 XS 호출 가능 함수가 이제 deprecated

문자를 분류하는 모든 함수가 향후 Perl 버전에서 제거될 거라 쓰면 안 돼요. 참여하는 C 컴파일러(예: gcc)로 이 중 하나를 쓰는 파일을 컴파일하면 경고가 생성돼요. 공개 사용을 의도한 게 아니었어요. 대부분에 같은 목적의 더 빠른 매크로가 있어요. perlapi의 "Character classes" 참고. 전체 목록:

is_uni_alnum, is_uni_alnumc, is_uni_alnumc_lc, is_uni_alnum_lc, is_uni_alpha, is_uni_alpha_lc, is_uni_ascii, is_uni_ascii_lc, is_uni_blank, is_uni_blank_lc, is_uni_cntrl, is_uni_cntrl_lc, is_uni_digit, is_uni_digit_lc, is_uni_graph, is_uni_graph_lc, is_uni_idfirst, is_uni_idfirst_lc, is_uni_lower, is_uni_lower_lc, is_uni_print, is_uni_print_lc, is_uni_punct, is_uni_punct_lc, is_uni_space, is_uni_space_lc, is_uni_upper, is_uni_upper_lc, is_uni_xdigit, is_uni_xdigit_lc, is_utf8_alnum, is_utf8_alnumc, is_utf8_alpha, is_utf8_ascii, is_utf8_blank, is_utf8_char, is_utf8_cntrl, is_utf8_digit, is_utf8_graph, is_utf8_idcont, is_utf8_idfirst, is_utf8_lower, is_utf8_mark, is_utf8_perl_space, is_utf8_perl_word, is_utf8_posix_digit, is_utf8_print, is_utf8_punct, is_utf8_space, is_utf8_upper, is_utf8_xdigit, is_utf8_xidcont, is_utf8_xidfirst.

추가로 제대로 동작한 적 없는 이 세 함수가 deprecated: to_uni_lower_lc, to_uni_title_lc, to_uni_upper_lc.

정규식 내 백슬래시의 특정 드문 사용이 이제 deprecated

Perl이 정규식 패턴의 메타문자로 인식하는 문자 쌍이 세 개 있어요: {}, [], (). 이들은 패턴을 구분하는 데도 쓸 수 있어요:

m{foo}
s(foo)(bar)

메타문자이므로 정규식 패턴에 특별한 의미가 있고, 이들로 구분된 패턴 안에서 쌍으로 쓰면 정상 수단(백슬래시 앞에 붙이기)으로 그 특별한 의미를 끌 수 없다는 게 드러났어요. 예를 들어,

m{foo\{1,3\}}

에서 백슬래시는 동작을 바꾸지 않고, 이것은 "f o" 다음에 "o"가 1~3번 더 온 것과 매치해요. 이렇게 메타문자로 해석되는 사용은 극히 드물어요. 예를 들어 CPAN 전체에 하나도 없다고 생각해요. 그래서 이 deprecation은 아주 적은 코드에 영향을 줘요. 다만 이런 코드는 바뀔 필요가 있다는 공지이고, 그러면 향후 Perl 버전에서 백슬래시가 효과를 갖도록 (기존 코드를 조용히 깨뜨릴 두려움 없이) 동작을 바꿀 수 있게 해 줘요.

정규식에서 토큰 (?>(* 분리

(?...) 정규식 구성에서 (?가 공백이나 주석으로 분리되면 이제 deprecation 경고가 발생해요. (*VERB...) 구성에서 (*가 분리돼도 마찬가지예요.

Pre-PerlIO IO 구현

이론상 현재 PerlIO 없이 perl을 빌드할 수 있어요. 대신 stdio나 sfio 주위의 래퍼를 쓸 거예요. 실제로는 그리 유용하지 않아요. 잘 테스트되지 않았고, IO 레이어(따라서 유니코드) 지원 없이는 perl답지 않아요. PerlIO 없이 빌드하는 것은 다음 perl 버전에서 제거될 가능성이 높아요. PerlIO는 stdio 사용을 원하면 stdio 레이어를 지원해요. 필요하면 미래에 sfio 레이어도 만들 수 있어요.

향후 Deprecations

  • 지원 인프라 없는 플랫폼 — Windows CE와 z/OS는 역사적으로 관리가 부족했고 현재 빌드도 성공하지 않고 스모크 테스트도 정기적으로 되지 않아요. 개선 작업이 진행 중이지만 이 플랫폼이 안전·지원된다고 당연히 여기면 안 돼요. 빌드 가능하고 정기적으로 스모크 테스트되지 않으면 향후 릴리스에서 지원이 능동적으로 제거될 수 있어요. 이 플랫폼에 관심이 있고 시간·전문성·하드웨어를 빌려줄 수 있다면 C[email protected]로 알려 주세요. 그 외에는 완전히 죽어 보이는 일부 플랫폼도 지금부터 v5.20.0 사이 제거 후보에 있어요: DG/UX, NeXT. 또한 현재 Perl 버전이 AmigaOS, DJGPP, NetWare(네이티브), OS/2, Plan 9에서 더 이상 빌드되지 않을 가능성이 높다고 생각해요. 그런 플랫폼에서 Perl을 쓰고 미래를 보장하는 데 관심이 있으면 연락 주세요. Perl이 오랫동안 혼합 엔디언 아키텍처(예: PDP-11)에서 빌드할 수 없었다고 믿으며, 남은 지원 코드를 제거하려 해요. 비슷하게, 오랫동안 유지되지 않은 GNU dld를 지원하는 코드는 적극적 사용자라고 밝히는 사람이 없으면 곧 제거될 거예요.
  • $<$> 교환 — Perl은 5.0 이후 권한을 일시적으로 내리려고 $<$>(그리고 $($)도)를 교환하는 관용구를 지원했어요:
($<, $>) = ($>, $<);

하지만 이 관용구는 실제·그룹 id를 수정해서 바람직하지 않은 부작용이 있을 수 있고, perl이 지원하는 어떤 플랫폼에서도 더 이상 유용하지 않으며, 이 변수들과 일반적으로 목록 할당의 구현을 복잡하게 해요. 대안으로 $>에만 할당하는 걸 권장해요:

local $> = $<;

또한 Setuid Demystified 참고.

  • microperl — 오랫동안 깨져 있고 현재 목적이 불명확한 microperl이 제거될 거예요.
  • 이중 따옴표 문자열에서 다른 이스케이프와 결합될 때 "\Q" 의미 개편\Q...\E 쌍 안에서 \Q\x·\L 등의 조합에 여러 버그와 비일관성이 있어요. 고쳐야 하고, 그러려면 현재 동작을 바꿔야 해요. 변경은 아직 확정되지 않았어요.
  • $x 사용(여기서 x는 실제(비출력) C0 제어 문자) — 향후 Perl 버전에서 금지될 거예요. ${x}(역시 x는 제어 문자)를 쓰거나, 더 좋게는 $^A(^는 캐럿, A는 perlebcdic의 "OPERATOR DIFFERENCES" 끝에 나열된 문자 중 하나)를 쓰세요.

성능 개선 (Performance Enhancements)

  • 어휘 변수 선언 목록(my($x, $y))이 이제 단일 op로 최적화되어 이전보다 빨라요.
  • Perl의 taint 지원을 완전히 비활성화하는 새 C 전처리기 define NO_TAINT_SUPPORT가 추가됐어요. 설정하면 -T 또는 -t 명령줄 플래그가 치명적 오류를 일으켜요. 코어 테스트와 많은 CPAN 배포판 테스트가 이 변경으로 실패할 거라 조심하세요. 장점은 줄어든 분기 덕분에 약간의 성능 이점이 있다는 거예요. 정확히 무엇을 하는지 알지 못하면 켜지 마세요.
  • 상수 인자를 가진 pack이 대부분의 경우 이제 상수 접혀요 [perl #113470].
  • 유니코드 속성에 대한 정규식 매칭 속도 향상. 가장 큰 이득은 \X, 유니코드 "extended grapheme cluster"로 약 35~40%. 255 위 코드 포인트를 포함한 [0-9\x{100}] 같은 대괄호 문자 클래스도 이제 더 빨라요.
  • 지원 플랫폼에서 이전의 몇몇 매크로가 이제 static 인라인 함수로 구현됨. 이는 비-GCC 플랫폼에서 약간 빨라질 거예요.
  • 불리언 문맥의 해시 최적화가 scalar(%hash), %hash ? ... : ..., sub { %hash || ... }에도 영향을 주도록 확장됨.
  • Filetest 연산자가 스택을 미세하게 더 효율적으로 관리해요.
  • 숫자 문맥에서 쓰인 Glob이 대부분의 경우 이제 문자열화를 통한 수치화 대신 직접 numify돼요.
  • x 반복 연산자가 스칼라 문맥에서 상수 피연산자와 왼쪽 피연산자 주위 괄호 없이 호출되면 컴파일 타임에 단일 상수로 접혀요.

모듈과 프래그마 (Modules and Pragmata)

새 모듈과 프래그마

  • Config::Perl::V 0.16이 dual-lifed 모듈로 추가됨. perl -V 출력의 구조화된 데이터 검색을 제공하며, perl 바이너리만 알고 Config로는 얻을 수 없는 정보를 포함해요.

업데이트된 모듈과 프래그마

전체 업데이트 목록을 보려면:

$ corelist --diff 5.16.0 5.18.0

5.16.0 대신 좋아하는 버전을 넣을 수 있어요. 개요로 주요 항목:

  • Archive::Extract → 0.68. Linux에서 Busybox unzip의 경계 경우 우회.
  • Archive::Tar → 1.90. ptar가 이제 -T 옵션과 대시 없는 옵션 지원 [rt.cpan.org #75473], [rt.cpan.org #75475]. UTF-8로 표시된 파일 이름 자동 인코딩 [rt.cpan.org #75474]. IO::Zlib 핸들에서 tell 사용 금지 [rt.cpan.org #64339]. 심링크에서 chown 시도하지 않음.
  • autodie → 2.13. 'open' 프래그마와 잘 어울림.
  • B → 1.42. COPs의 stashoff 메서드 추가. B::COP::stashpv가 UTF-8 패키지 이름과 내장 NUL 지원. 모든 CVf_*·GVf_*·기타 SV 관련 플래그 값이 B:: 네임스페이스 상수로 제공·내보내기 가능. 기본 export 목록은 바뀌지 않음. 새 pad API와 동작하게 함.
  • B::Concise → 0.95. -nobanner 옵션 수정, format 덤프 가능. 주어진 sub 이름이 format 이름인지도 확인. sub와 format이 같은 이름이면 둘 다 덤프. 새 OpMAYBE_TRUEBOOL·OPpTRUEBOOL 플래그 지원.
  • B::Debug → 1.18. Perl 5.17.4에 추가된 B::PADLIST 지원(실험적으로).
  • B::Deparse → 1.20. perl -w 아래 실행 시 경고 회피. 루프 제어를 올바른 우선순위로 deparse. format 줄의 여러 문 올바르게 deparse. format의 끝 세미콜론 억제. 어휘 서브루틴 스텁 deparse 추가. 인자 없는 sort deparse 시 더 이상 죽지 않음. system $prog @args·exec $prog @args의 콤마를 올바르게 생략.
  • bignum·bigint·bigrat → 0.33. hex·oct 오버라이드가 재작성되어 여러 문제 제거, 하나의 비호환 변경: 이전에는 use bigint·use bigrat 중 나중에 컴파일된 쪽이 다른 쪽보다 우선해 스코프 안에서 hex·oct이 다른 프래그마를 존중하지 못했어요. 세 프래그마 중 하나를 쓰면 프로그램의 다른 곳 hex·oct이 인자를 목록 문맥에서 평가하고 인자 없이 호출될 때 $_을 추론하지 못했어요. 세 프래그마 중 하나를 쓰면 oct("1234")이 프로그램 어디에서든 1234를 돌려줬어요(0으로 시작하지 않는 숫자). 이제 "1234"가 프래그마 스코프 안이든 밖이든 8진수에서 10진수로 변환돼요. hex·oct의 어휘 사용을 돕는 전역 오버라이드가 이제 새 오버라이드 설치 전에 있던 기존 오버라이드를 존중하고, use bignum 스코프 밖에서 그들에게 폴백해요. use bignum "hex"·use bignum "oct" 및 bigint·bigrat의 유사 호출이 이제 전역 오버라이드 대신 hex·oct 함수를 내보내요.
  • Carp → 1.29. caller가 삭제된 패키지에 대해 undef를 돌려주면 더 이상 혼동하지 않음. longmess()·shortmess() 문서화.
  • CGI → 3.63. 인식되지 않는 HTML 이스케이프 시퀀스 더 잘 처리. startform()·start_form()<form> 태그 뒤에 문제 있는 끝 줄바꿈을 더 이상 삽입하지 않음. 일부 perl 버전에서 나타나는 거짓 "Insecure Dependency" 경고에 대한 우회.
  • Class::Struct → 0.64. 생성자가 이제 오버라이드된 접근자 메서드를 존중 [perl #29230].
  • Compress::Raw::Bzip2 → 2.060. Perl "magic" API의 오용 수정.
  • Compress::Raw::Zlib → 2.060. 번들된 zlib 1.2.7로 업그레이드. Irix, Solaris, Win32와 C++ 빌드의 빌드 실패 수정. Perl "magic" API 오용 수정. 매개변수 검증을 더 효율적으로 해 compress(), uncompress(), memGzip(), memGunzip() 속도 향상.
  • CPAN::Meta::Requirements → 2.122. from_string_hash에 undef 요구사항을 (경고와 함께) 0으로 처리. requirements_for_module 메서드 추가.
  • CPANPLUS → 0.9135. F<blib/script>를 PATH에 추가 허용. 셸 호출 사이 기록 저장. 여러 makemakerargs·makeflags 인자 더 잘 처리. SQLite 소스 엔진 문제 해결.
  • Data::Dumper → 2.145. 필요할 때만 seen-scalar 해시를 만들어 직렬화 속도를 크게 높임. 문·분기·조건·서브루틴 커버리지를 위한 추가 테스트. 내부 일부 리팩터링. 거의 모든 메서드 문서화.
  • DB_File → 1.827. 주요 Perl 모듈이 "@_" 구성을 더 이상 쓰지 않음.
  • Devel::Peek → 1.11. C++ 컴파일러와의 컴파일 수정, 새 pad API와 동작.
  • Digest::MD5 → 2.52. Digest::Perl::MD5 OO 폴백 수정 [rt.cpan.org #66634].
  • Digest::SHA → 5.84. 이중 해제 버그 수정. 어떤 경우 취약점을 일으킬 수 있었어요.
  • DynaLoader → 1.18. VMS 구현의 XS의 사소한 코드 변경. OUTPUT 섹션 없이 CODE 섹션을 쓰는 것에 대한 경고 수정.
  • Encode → 2.49. Mac 별칭 x-mac-ce 추가, Encode::Unicode·Encode::UTF7·Encode::GSM0338의 다양한 버그 수정.
  • Env → 1.04. SPLICE 구현이 목록 문맥에서 더 이상 잘못 동작하지 않음.
  • ExtUtils::CBuilder → 0.280210. 매니페스트 파일이 이를 쓰는 VC++ 버전에 올바르게 임베드. Windows에서 다른 OS처럼 내보낼 심볼 목록을 link()에 전달 가능 [perl #115100].
  • ExtUtils::ParseXS → 3.18. 생성 C 코드가 자동으로 수행되는 Perl 버전(또는 변수가 더 이상 없는 현재 Perl)에서 PL_amagic_generation를 불필요하게 증가시키지 않음. 초기화된 XSUB 비매개변수에 대한 거짓 경고 회피 [perl #112776].
  • File::Copy → 2.26. copy()가 같은 디렉터리로 복사할 때 파일을 더 이상 0으로 만들지 않고, 파일 자체 위로 복사하려 하면 이제 (오랫동안 문서화된 대로) 실패해요.
  • File::DosGlob → 1.10. 각 호출자에 대해 유지하는 내부 파일 이름 캐시가 그 호출자가 해제될 때 이제 해제돼요. 즉 use File::DosGlob 'glob'; eval 'scalar <*>'이 더 이상 메모리를 누출하지 않아요.
  • File::Fetch → 0.38. 파일 구성 요소가 없는 URL에 'file_default' 옵션 추가. 가능하면 File::HomeDir 사용, 자동 탐지를 덮어쓰는 PERL5_CPANPLUS_HOME 제공. fetchdir가 설정되면 항상 F 재확인.
  • File::Find → 1.23. VMS에서 일관되지 않은 유닉스식 경로 처리 수정. 개별 파일이 검색할 디렉터리 목록에 나타날 수 있음 [perl #59750].
  • File::Glob → 1.20. File::DosGlob과 정확히 같은 수정. Perl 자신의 glob 연산자(VMS 제외)가 쓰므로 eval 'scalar <*>'이 더 이상 누출되지 않아요. 공백으로 구분된 여러 패턴이 긴 결과 목록을 돌려줄 때 더 이상 메모리 손상·크래시가 없어요. 이 버그는 Perl 5.16.0에 도입됨 [perl #114984].
  • File::Spec::Unix → 3.40. abs2rel이 두 상대 경로나 루트 디렉터리를 두 번 주면 잘못된 결과를 낼 수 있었어요 [perl #111510].
  • File::stat → 1.07. filetest 프래그마를 무시하고 결합 사용 시 경고하지만 -r에 대해선 경고하지 않았어요. 수정 [perl #111640]. -p가 이제 동작하고 파이프에 대해 false를 돌려주지 않아요 [perl #111638]. 이전에 File::stat의 오버로드된 -x·-X 연산자가 루트로 실행할 때 디렉터리·실행 파일에 올바른 결과를 주지 못했어요. 루트의 실행 권한을 다른 사용자처럼 취급하고 루트 소유가 아닌 파일에 그룹 멤버십 검사 등을 수행했죠. 이제 올바른 유닉스 동작을 따라요 — 디렉터리는 항상 true이고, 파일은 세 실행 권한 비트 중 하나라도 설정되면 루트가 실행할 수 있다고 보고해요. Perl의 내장 -x·-X 연산자는 항상 옳았어요.
  • File::Temp → 0.23. 디렉터리 제거 관련 다양한 버그 수정. 초기 unlink가 실패하면 tempfile unlink 연기로 NFS 문제 수정.
  • GDBM_File → 1.15. TIEHASH의 비문서화 선택 다섯 번째 매개변수 제거. 치명적 오류(파일시스템 문제 같은) 시 gdbm* 함수가 쓰는 콜백 제어를 의도했지만 동작하지 않았어요. CPAN의 어떤 코드도 사용을 시도하지 않았어요. 콜백은 이제 항상 이전 기본값인 croak. 일부 플랫폼에서 C croak 함수 호출 방식 문제도 해결.
  • Hash::Util → 0.15. hash_unlocked·hashref_unlocked가 항상 false 대신 해시가 잠금 해제면 true를 돌려줘요 [perl #112126]. hash_unlocked, hashref_unlocked, lock_hash_recurse, unlock_hash_recurse가 이제 내보내기 가능 [perl #112126]. hash_locked·hashref_locked 두 새 함수 추가. 이상하게도 이 두 함수는 존재하지도 않는데 이미 내보내기되고 있었어요.
  • HTTP::Tiny → 0.025. SSL 검증 기능 추가 [github #6], [github #9]. 응답 hashref에 최종 URL 포함. local_address 옵션 추가. SSL 지원 개선.
  • IO → 1.28. sync()가 읽기 전용 파일핸들에서 호출 가능 [perl #64772]. IO::Socket가 소켓 정보 캐시·검색을 더 열심히.
  • IPC::Cmd → 0.80. run_forked에서 exit 대신 POSIX::_exit 사용 [rt.cpan.org #76901].
  • IPC::Open3 → 1.13. open3()이 파일 디스크립터를 닫는 데 더 이상 POSIX::close()를 쓰지 않아요. 파일 디스크립터가 PerlIO 스트림과 공유될 때 PerlIO가 하는 참조 카운트를 깨서, 그런 PerlIO 스트림이 나중에 닫힐 때 디스크립터를 두 번째 닫으려 했거든요.
  • Locale::Codes → 3.25. 새 코드 일부 포함.
  • Memoize → 1.03. MERGE 캐시 옵션 수정.
  • Module::Build → 0.4003. $VERSION 없는 모듈이 'provides' 메타데이터에 '0' 버전을 나열해 PAUSE가 거부할 수 있던 버그 수정. PodParser의 모듈 이름 숫자 허용 버그 수정. 인자를 두 번 주면 배열이 되어 F<ARRAY(0xdeadbeef)/lib/Foo.pm> 같은 설치 경로가 되는 버그 수정. POD "abstract" 줄의 선행 "Name" 주위에 마크업 허용. 문서 개선.
  • Module::CoreList → 2.90. 버전 정보를 델타로 저장해 F<CoreList.pm> 크기 크게 축소. 옛 perl 버전과 호환성 복원, 다양한 모듈 corelist 데이터 정리.
  • Module::Load::Conditional → 0.54. 공백 있는 경로에 설치된 perl에서 requires 사용 수정. Module::Metadata 사용 등 여러 개선.
  • Module::Metadata → 1.000011. 일반 모듈 파일에 대한 객체 생성이 약 40% 빨라지고, $VERSION에 대한 일부 거짓 경고 억제.
  • Module::Pluggable → 4.7. 이벤트에 트리거 허용 등 — 동작 수정의 강력한 방법.
  • Net::Ping → 2.41. Windows 테스트 실패 일부 수정.
  • Opcode → 1.25. boolkeys opcode 제거와 clonecv·introcv·padcv opcode 추가 반영.
  • overload → 1.22. no overloaduse overload처럼 잘못된 인자에 대해 경고.
  • PerlIO::encoding → 0.16. ":encoding(...)" I/O 레이어를 구현하는 모듈. 인코딩 백엔드가 버퍼를 재할당하거나 typeglob·공유 해시 키 스칼라를 주면 더 이상 메모리를 손상시키거나 크래시하지 않음.
  • PerlIO::scalar → 0.16. 공급된 버퍼 스칼라가 이제 0xFF 이하 코드 포인트만 포함해야 해요 [perl #109828].
  • Perl::OSType → 1.003. VOS 운영체제 탐지 버그 수정.
  • Pod::Html → 1.18. --libpods 옵션 복원. deprecated이고 더 이상 지원되지 않는다는 경고만 내는 것 외엔 아무것도 안 해요. pod2html이 생성한 HTML 파일이 UTF-8 charset을 주장하므로 실제로 UTF-8로 파일을 씁니다 [perl #111446].
  • Pod::Simple → 3.28. 주로 Pod::Simple::XHTML의 많은 개선. 호환 변경: codes_in_verbatim 옵션이 이제 기본으로 비활성화. 전체 내용은 F<cpan/Pod-Simple/ChangeLog>.
  • re → 0.23. </[s]/>·</[s]/i> 같은 단일 문자 [class]가 대괄호가 없는 것처럼 즉 </s/>·</s/i>으로 최적화.
  • Safe → 2.35. Devel::Cover와의 상호작용 수정. no strict 아래에서 코드를 eval하지 않음.
  • Scalar::Util → 1.27. sum의 오버로딩 문제 수정. first·reduce가 콜백을 먼저 검사(&first(1) 금지). magic 값에서 tainted 수정 [rt.cpan.org #55763]. 이전에 magic였던 값에서 sum 수정 [rt.cpan.org #61118]. 고정 버퍼 끝을 넘어 읽는 것 수정 [rt.cpan.org #72700].
  • Search::Dict → 1.07. 파일핸들에서 더 이상 stat 요구하지 않음. 폴드에 fc 사용.
  • Socket → 2.009. IP 멀티캐스트 소스 그룹 멤버십에 필요한 상수·함수 추가. unpack_sockaddr_in()·unpack_sockaddr_in6()이 스칼라 문맥에서 IP 주소만 돌려줌. inet_ntop()이 잘못된 길이 스칼라 차단. 미초기화 메모리 읽기 수정.
  • Storable → 2.41. STORABLE_freeze 안에서 $_[0] 수정이 더 이상 크래시하지 않음 [perl #112358]. STORABLE_attach를 구현하는 클래스의 객체가 해동 구조에 여러 참조가 있어도 이제 한 번만 thaw됨 [perl #111918]. 제한된 해시가 항상 올바르게 thaw되지 않았음 [perl #73972]. STORABLE_freeze() 메서드가 있는 blessed REF 객체를 freeze할 때 croak하던 문제 [perl #113880]. 이제 vstring을 올바르게 freeze·thaw. 이는 저장 형식에 약간의 비호환 변경을 일으켜 형식 버전이 2.9로 올라감.
  • Sys::Syslog → 0.32. getservbyname(), setlogsock(), syslog()의 로그 수준 관련 여러 버그 수정, Windows·Haiku-OS·GNU/kFreeBSD 수정 포함.
  • Term::ANSIColor → 4.02. 이탤릭 지원 추가. 오류 처리 개선.
  • Term::ReadLine → 1.10. 현재 드라이브에 F<\dev\tty> 파일이 있으면 Windows에서 cpan·cpanp 셸 사용 문제 수정.
  • Test::Harness → 3.26. Win32 glob 의미 수정 [rt.cpan.org #49732]. perl 호출 시 Win32::GetShortPathName 사용 안 함 [rt.cpan.org #47890]. shebang 읽을 때 -T 무시 [rt.cpan.org #64404]. 테스트 대기 상태를 모를 때 더 우아하게 처리. 테스트 요약 'ok' 줄을 오버라이드 가능하게 해 prove의 출력을 멱등적으로 바꾸는 플러그인 허용. 세계 쓰기 가능 파일 실행 안 함.
  • Text::Tabs·Text::Wrap → 2012.0818. 둘 다 유니코드 결합 문자 지원 추가.
  • threads::shared → 1.31. 복제할 수 없는 구조의 복제 시도를 무조건 죽는 대신 경고하거나 무시하는 옵션 추가. Scalar::Util::dualvar가 만드는 이중 값 값 지원.
  • Tie::StdHandle → 4.3. READread의 offset 인자를 존중 [perl #112826].
  • Time::Local → 1.2300. 59보다 크고 60보다 작은 초 값이 더 이상 timegm()·timelocal()을 croak하게 하지 않음.
  • Unicode::UCD → 0.53. 모든 casefold를 돌려주는 all_casefolds() 함수 추가.
  • Win32 → 0.47. 현재 코드 페이지를 가져오고 설정하는 새 API 추가.

제거된 모듈과 프래그마

  • **Version::Requirements**이 코어 배포판에서 제거됨. CPAN::Meta::Requirements라는 다른 이름으로 사용 가능.

문서 (Documentation)

기존 문서 변경

  • perlcheat — 재구성, 새 섹션 몇 개 추가.
  • perldata — 중복 키를 포함한 해시 초기화 목록의 동작을 이제 명시적으로 문서화.
  • perldiag — "strict refs"가 심볼릭 참조를 막는다는 설명이 독자가 심볼릭 참조를 안다고 가정하지 않음.
  • perlfaq — CPAN의 5.0150040 버전과 동기화.
  • perlfuncpipe의 반환 값 문서화. our 문서 명확화.
  • perlop — 루프 제어 동사(dump, goto, next, last, redo)가 항상 할당 연산자와 같은 우선순위였지만 지금까지 문서화되지 않았어요.

진단 (Diagnostics)

진단 출력에 다음 추가·변경이 이뤄졌어요(경고·치명적 오류 포함). 전체 목록은 perldiag 참고.

새 진단

새 오류

  • "Unterminated delimiter for here document" — here document 레이블에 시작 따옴표가 있지만 끝 따옴표가 없을 때 발생. 레이블 자체를 못 찾는다는 거짓·오해의 소지 있는 오류 메시지를 대체 [perl #114104].
  • "panic: child pseudo-process was never scheduled" — Windows ithreads 구현의 자식 의사 프로세스가 허용된 시간 안에 스케줄되지 않아 제대로 초기화하지 못했을 때 발생 [perl #88840].
  • "Group name must start with a non-digit word character in regex; marked by <-- HERE in m/%s/" — 잘못된 (?&0)에 대해 추가. 이해할 수 없는 오류 메시지를 내곤 했어요 [perl #101666].
  • "Can't use an undefined value as a subroutine reference" — undefined 값을 서브루틴으로 호출하면 이제 이 오류. 예전에 있었지만 실수로 비활성화됐다가, 먼저 Perl 5.004에서 비magic 변수에 대해, 그다음 Perl v5.14에서 magic(예: tied) 변수에 대해. 복원됨. 그동안 undef는 빈 문자열로 취급됐어요 [perl #113576].
  • "Experimental "%s" subs not enabled" — 어휘 sub을 쓰려면 먼저 활성화해야 해요:
no warnings 'experimental::lexical_subs';
use feature 'lexical_subs';
my sub foo { ... }

새 경고

  • "'Strings with code points over 0xFF may not be mapped into in-memory file handles'"
  • "'%s' resolved to '\o{%s}%d'"
  • "'Trailing white-space in a charnames alias definition is deprecated'"
  • "'A sequence of multiple spaces in a charnames alias definition is deprecated'"
  • "'Passing malformed UTF-8 to "%s" is deprecated'"
  • "Subroutine "&%s" is not available" — (W closure) 컴파일 중 내부 이름 붙은 서브루틴이나 eval이 현재 사용 불가능한 바깥 어휘 서브루틴을 캡처하려 함. 두 이유 중 하나: 첫째, 어휘 서브루틴이 아직 생성되지 않은 바깥 익명 서브루틴에 선언될 수 있음. 이름 붙은 sub은 컴파일 시, 익명 sub은 런타임에 생성됨을 기억하세요. 예:
sub { my sub a {...} sub f { \&a } }

f가 생성될 때 익명 서브루틴이 아직 없으므로 현재 "a" sub을 캡처할 수 없어요. 반대로 다음은 익명 서브루틴이 이제 생성·활성 상태라 경고하지 않아요:

sub { my sub a {...} eval 'sub f { \&a }' }->();

둘째 상황은 eval이 스코프를 벗어난 변수에 접근할 때:

sub f {
    my sub a {...}
    sub { eval '\&a' }
}
f()->();

여기서 eval의 '&a'가 컴파일될 때 f()가 실행 중이 아니므로 &a를 캡처할 수 없어요.

  • ""%s" subroutine &%s masks earlier declaration in same %s" — (W misc) "my"·"state" 서브루틴이 현재 스코프·문에서 재선언되어 이전 인스턴스에 대한 모든 접근을 실질적으로 제거. 거의 항상 오타. 이전 서브루틴은 스코프 끝이나 모든 클로저 참조가 소멸될 때까지 존재해요.
  • "The %s feature is experimental" — (S experimental) use feature로 실험 기능을 켜면 발생. 기능을 쓰고 싶으면 경고를 억제하되, 그러면 향후 Perl 버전에서 바뀌거나 제거될 수 있는 실험 기능을 쓸 위험을 지는 것임을 알기:
no warnings "experimental::lexical_subs";
use feature "lexical_subs";
  • "sleep(%u) too large" — (W overflow) sleep을 신뢰성 있게 처리할 수 있는 것보다 큰 숫자로 호출했고 sleep이 요청보다 짧게 잤을 가능성이 높아요.
  • "Wide character in setenv"%ENV로 환경 변수에 와이드 문자를 넣으려 하면 이 경고.
  • "Invalid negative number (%s) in chr"chr()이 음수 값을 받으면 이제 경고 [perl #83048].
  • "Integer overflow in srand"srand()이 C에 맞지 않는 값을 받으면 (오버플로 대신 잘릴 것이므로) 이제 경고 [perl #40605].
  • "-i used with no filenames on the command line, reading from STDIN" — 명령줄에 입력 파일이 없는데 -i 플래그로 perl을 실행하면 경고 [perl #113410].

기존 진단 변경

  • "$ is no longer supported"* — $*·$# 사용이 더 이상 지원되지 않는다는 경고가 이제 이를 참조하는 모든 위치에 생성됨. 이전에는 같은 typeglob을 쓰는 다른 변수(예: $* 앞의 @*)가 먼저 보이면 생성에 실패하고 두 번째 이후 사용에서는 생성되지 않았어요.
  • \b{·\B{ 경고 추가. 해당 범주로 꺼야 하는 deprecation 경고예요. 일반 정규식 경고까지 꺼야 할 필요는 없어요.
  • "Constant(%s): Call to &{$^H{%s}} did not return a defined value"undef를 돌려주는 상수 오버로딩에서 이 오류 발생. 숫자 상수에 대해 예전엔 "Constant(undef)"라고 했어요. "undef"가 숫자 자체로 대체됨.
  • 모듈을 로드할 수 없을 때 오류에 설치 필요 힌트 포함: "Can't locate hopping.pm in @INC (you may need to install the hopping module) (@INC contains: ...)"
  • "vector argument not supported with alpha versions" — 이 경고가 이전에는 no warnings로도 억제 불가능. 이제 억제 가능하고 "internal" 범주에서 "printf" 범주로 이동.
  • "Can't do {n,m} with n > m in regex; marked by <-- HERE in m/%s/" — 이 치명적 오류가 "Quantifier {n,m} with n > m can't match in regex"라는 경고로 바뀜. (W regexp) 최소값은 최대값보다 작거나 같아야 해요. 정말 0번 매치하고 싶으면 {0}을 넣으세요.
  • 기묘한 경우 발생하던 "Runaway prototype" 경고가 부정확·비일관이라 제거.
  • 유일한 발생 경우가 버그였던 "Not a format reference" 오류 제거.
  • 같은 이유로 "Unable to create sub named %s" 오류 제거.
  • 'Can't use "my %s" in sort comparison' 오류가 '"my %s" used in sort comparison' 경고로 하향(상태 변수는 'my' 대신 'state'). 추가로 어휘 $a·$b의 오용 추측 휴리스틱이 개선되어 더 적은 오탐. sort 블록 밖의 어휘 $a·$b가 더 이상 금지되지 않음. sort 블록 안의 이름 붙은 단항·목록 연산자도 더 이상 $a·$b를 무시하지 않게 함 [perl #86136].

유틸리티 변경 (Utility Changes)

h2xs

F가 빈 define에 대한 잘못된 코드를 더 이상 생성하지 않음 [perl #20636].

설정과 컴파일 (Configuration and Compilation)

  • useversionedarchname 옵션 추가 — 설정하면 'api_versionstring'을 'archname'에 포함. 예: x86_64-linux-5.13.6-thread-multi. 기본 미설정. Tim Bunce가 요청했는데, INSTALL_BASE가 perl 버전으로 구분하지 않는 라이브러리 구조를 만들어 "$install_base/lib/perl5/$archname"에 아키텍처 특정 파일을 둔다고 관찰했기 때문. -Duseversionedarchname을 설정하면 $archname이 아키텍처와 API 버전 모두에 대해 구별되어 INSTALL_BASE의 혼합 사용이 가능해져요.
  • PERL_NO_INLINE_FUNCTIONS 옵션 추가 — 정의하면 "inline.h"를 포함하지 않음. 테스트 코드가 perl 라이브러리에 대한 링크 의존(아직 없을 수 있음)을 만들지 않고 perl 헤더 정의를 포함하게 해 줘요.
  • Configure가 외부 MAILDOMAIN 환경 변수를 설정하면 존중.
  • installman이 silent 옵션을 더 이상 무시하지 않음.
  • META.ymlMETA.json 파일이 모두 배포판에 포함.
  • F가 C++ 컴파일러로 컴파일할 때 isblank()을 올바르게 탐지.
  • F의 페이저 탐지가 개선되어 프로그램 이름 뒤에 옵션을 지정하는 응답(예: B</usr/bin/less -R>)을 사용자가 기본값을 받아들이면 허용. 이는 perldoc이 ANSI 이스케이프를 다룰 때 도움 [perl #72156].

테스트 (Testing)

테스트 스위트에 매우 큰 메모리를 요구하는 테스트용 섹션이 생김. 이 테스트들은 기본으로 실행되지 않아요. PERL_TEST_MEMORY 환경 변수를 안전하게 쓸 수 있는 메모리 기비바이트 수로 설정하면 활성화돼요.

플랫폼 지원 (Platform Support)

중단된 플랫폼

  • BeOS — Be Inc이 개인용 컴퓨터용으로, 처음에는 BeBox 하드웨어용으로 개발한 운영체제. Haiku OS가 BeOS의 오픈 소스 대체/연속으로 작성됐고, 그 perl 포트는 현재·적극 유지 중.
  • UTS Global — UTS global 관련 지원 코드 제거. UTS는 Amdahl이 만든 System V 메인프레임 버전으로 나중에 UTS Global에 판매됨. 포트는 Perl v5.8.0 이전 이후 건드리지 않았고 UTS Global은 이제 폐업.
  • VM/ESA — VM/ESA 지원 제거. 포트는 IBM이 2002년 3월 서비스 종료한 2.3.0에서 테스트. 2.4.0은 2003년 6월 종료, Z/VM이 대체. 현재 Z/VM V6.2.0이며 2015/04/30 종료 예정.
  • MPE/IX — MPE/IX 지원 제거.
  • EPOC — EPOC 관련 지원 코드 제거. EPOC은 Psion이 모바일 기기용으로 개발한 운영체제 계열. Symbian의 전신. 포트는 2002년 4월 마지막 갱신.
  • Rhapsody — Rhapsody 지원 제거.

플랫폼별 참고

AIX

Configure가 이제 xlC를 쓸 때 AIX에서 CC 플래그에 항상 -qlanglvl=extc99를 추가. C99를 가정하는 많은 XS 기반 모듈 컴파일을 쉽게 함 [perl #113778].

clang++

Perl v5.15.7 이후 clang++로 컴파일을 막던 컴파일러 버그에 대한 우회가 생김 [perl #112786].

C++

Perl 코어를 C++로(반만 지원) 컴파일할 때 mathom 함수가 이제 extern "C"로 컴파일되어 올바른 이진 호환성 보장.

Darwin

-Dusemorebits 빌드를 고치도록 8바이트 경계 정렬 하드코딩 중단.

Haiku

Perl이 이제 Haiku R1 Alpha 4에서 기본으로 동작.

MidnightBSD

libc_r이 최근 MidnightBSD 버전에서 제거되고 옛 버전이 pthread와 더 잘 동작. Threading이 이제 pthread로 활성화되어 0.4-CURRENT에서 threading 활성화 빌드 오류 수정.

Solaris

Configure에서 Solaris가 지원하지 않는 플래그의 sed 명령 실행 회피.

VMS

  • 가능하면 시작 시 CRTL 기능 DECC$EFS_CASE_PRESERVE·DECC$ARGV_PARSE_STYLE을 활성화해 파일 이름·명령줄 인자의 대소문자 보존. 후자는 Perl이 실행되는 프로세스에서 extended parse가 활성화된 경우에만 효과.
  • Extended Filename Syntax(EFS) 문자 집합이 VMS에서 기본으로 활성화. 디렉터리 이름의 점, 파일 이름의 여러 점, 파일 이름의 공백 처리 개선. 옛 동작을 얻으려면 논리 이름 DECC$EFS_CHARSET을 C로 설정.
  • -Dusemymalloc=y로 설정된 빌드의 링킹 수정.
  • -Dusecxx로 설정하면 HP C++ 컴파일러로 빌드하는 실험 지원.
  • 배포판 최상위 디렉터리의 모든 C 헤더 파일이 VMS에 설치되어 다른 플랫폼의 오랜 관례와 일관. 이전에는 일부만 설치되어 빠진 include 파일에 의존하는 확장의 비코어 확장 빌드를 깨뜨림.
  • system, backticks, 파이프 open으로 생성된 명령의 명령 동사(매개변수는 아님)에서 따옴표 제거. 이전에는 동사의 따옴표가 DCL에 전달되어 명령 인식 실패. 또한 동사가 ODS-5 볼륨의 이미지·명령 절차 경로면 따옴표하면 경로에 공백 허용.
  • OpenVMS에서 HP C++ 컴파일러용 a2p 빌드 수정.

Win32

  • F<win32/Makefile>에 CCTYPE=MSVC110(Windows Desktop용 무료 Express 버전이면 MSVC110FREE)로 Microsoft Visual C++ 2012 컴파일러로 빌드 가능.
  • USE_SOCKETS_AS_HANDLES 없이 빌드하는 옵션 제거.
  • Win32(및 아마 다른 플랫폼)의 threaded debugging 빌드에서 스레드(메인 포함) 정리 중 perl이 크래시할 수 있던 문제 수정 [perl #114496].
  • sleep이 요청보다 오래 걸리고 심지어 멈출 수 있는 드문 경쟁 조건 수정 [perl #33096].
  • Win32의 link가 Win32 API 오류 코드에 기반해 더 적절한 값으로 $! 설정 시도 [perl #112272].
  • 환경에 비ASCII가 있을 때 새 하위 프로세스 실행 시 Perl이 더 이상 환경 블록을 망가뜨리지 않음. 현재 ANSI 코드 페이지 밖 문자가 환경에 있으면 알려진 문제가 여전히 남아 있어요 [perl #113536].
  • 일부 Windows 컴파일러로 빌드할 때 miniperl의 glob 연산자(perlglob 프로그램 사용)가 PATH 환경 변수를 삭제해 실패하던 문제 [perl #113798].
  • Windows makefile에 새 옵션 USE_64_BIT_INT 추가. 32비트 perl을 빌드할 때 64비트 정수를 쓰게 하려면 "define"으로 설정.
  • Perl v5.17.2에서 XS 모듈 DLL에 적용한 머신 코드 크기 축소를 이제 perl DLL 자체로 확장.
  • Perl v5.17.2에서 실수로 깨진 VC++ 6.0 빌드가 다시 수정.

WinCE

WinCE 빌드가 다시 가능해졌지만 완전히 깨끗한 빌드를 복원하려면 더 많은 작업 필요.

내부 변경 (Internal Changes)

  • 잘못 이름 지어진 av_len()의 동의어가 생성됨: av_top_index()av_tindex. 세 가지 모두 배열의 요소 수가 아니라 최고 인덱스 번호를 돌려줘요.
  • SvUPGRADE()가 더 이상 표현식이 아님. 원래 이 매크로(및 기반 함수 sv_upgrade())는 불리언으로 문서화됐지만 실제로는 오류 시 항상 croak하고 false를 돌려준 적이 없어요. 2005년 void 반환 값을 명시하도록 문서가 갱신됐지만 역호환을 위해 SvUPGRADE()는 항상 1을 돌려주도록 남겨졌어요. 이제 제거되고, SvUPGRADE()는 반환 값이 없는 문이 됨. 그래서 이제 이건 문법 오류:
if (!SvUPGRADE(sv)) { croak(...); }

그런 코드가 있으면 그냥 SvUPGRADE(sv);로 바꾸거나, 옛 perl의 컴파일러 경고를 피하려면 (void)SvUPGRADE(sv);.

  • Perl이 새 copy-on-write 메커니즘을 가져 어떤 SvPOK 스칼라든 copy-on-write 스칼라로 업그레이드할 수 있어요. 문자열 버퍼의 참조 카운트가 문자열 버퍼 자체에 저장돼요. 이 기능은 기본으로 활성화되지 않아요. -Accflags=-DPERL_NEW_COPY_ON_WRITE로 F를 실행해 활성화할 수 있고, XS 작성자에게 그런 perl로 코드를 시험하고 피드백을 주길 권장해요. 아쉽게도 COW를 다루도록 XS 코드를 업데이트하는 좋은 가이드는 아직 없어요. copy-on-write 스칼라가 이전에 만난 적 없는 코드 경로를 지나게 해 몇몇 XS 모듈을 깨뜨려요.
  • Copy-on-write가 더 이상 SvFAKE·SvREADONLY 플래그를 쓰지 않아요. 따라서 SvREADONLY가 진짜 읽기 전용 SV를 나타내요. copy-on-write 스칼라 식별은 (이전처럼) SvIsCOW 매크로를 쓰세요.
  • PL_glob_index 제거.
  • private Perl_croak_no_modify의 컨텍스트 매개변수 제거. 이제 void 프로토타입. public API croak_no_modify 사용자는 영향 없음.
  • Copy-on-write(공유 해시 키) 스칼라가 더 이상 읽기 전용으로 표시되지 않아요. SvREADONLY는 그런 SV에서 false를, SvIsCOW는 여전히 true를 돌려줘요.
  • 새 op 타입 OP_PADRANGE 도입. perl peephole 최적화 프로그램이 가능하면 pushmark 뒤 하나 이상의 pad op를 단일 padrange op로 대체하고 list·nextstate op를 건너뛸 수 있어요. 또한 op가 my(...) = @_ 할당의 RHS와 연관된 작업을 수행해 그것들도 최적화할 수 있어요.
  • 다중 문자 fold가 있는 [bracketed] 문자 클래스 안의 대소문자 구분 없는 매칭이 이전에 그랬던 상황에서 가능성 중 하나를 더 이상 제외하지 않아요 [perl #89774].
  • PL_formfeed 제거.
  • 정규식 엔진이 대상 문자열 끝을 지나 1바이트를 더 이상 읽지 않아요. 내부적으로 잘 형성된 모든 스칼라에 대해 절대 문제가 되면 안 되지만, 이 변경은 CPAN 모듈의 문자열 버퍼 특수 처리를 용이하게 해요 [perl #73542].
  • BEGIN 블록 안에서 PL_compcv가 이제 BEGIN 블록 자체가 아닌 현재 컴파일 중인 서브루틴을 가리켜요.
  • mg_length가 deprecated.
  • sv_len이 이제 항상 바이트 수를, sv_len_utf8이 문자 수를 돌려줘요. 이전에는 둘 다 버그가 있어 때로 바이트, 때로 문자를 돌려줬어요. sv_len_utf8이 더 이상 인자가 UTF-8이라고 가정하지 않아요. 어느 쪽도 tied·overloaded 값이나 non-PV에 대해 더 이상 UTF-8 캐시를 만들지 않아요.
  • sv_mortalcopy가 XS 모듈에서 호출될 때 공유 해시 키 스칼라의 문자열 버퍼를 이제 복사 [perl #79824].
  • RXf_MODIFIES_VARS 플래그를 커스텀 정규식 엔진이 설정해 정규식 실행이 변수를 수정할 수 있음을 나타낼 수 있어요. 이는 s///이 특정 최적화를 건너뛰도록 해요. Perl 자신의 엔진은 $REGMARK·$REGERROR를 설정하는 특수 역추적 동사에 이 플래그를 설정해요.
  • 어휘 pad 접근 API가 상당히 바뀜. PADLIST이 더 이상 AV가 아니라 고유 타입. PADLIST이 이제 pad용 AV와 pad 이름 목록 대신 PADPADNAME들의 PADNAMELIST을 포함. PAD, PADNAMELIST, PADNAME은 일반 AV·SV API 대신 새로 추가된 pad API로 접근해야 해요.
  • 정규식 API에서 번호 매긴 캡처 콜백에 어떤 매치 변수가 접근되는지 나타내는 인덱스가 전달돼요. $``, $&, $&변수에 특수 인덱스 값이 있어요. 이전에는 같은 세 값을${^PREMATCH}, ${^MATCH}, ${^POSTMATCH}검색에도 썼지만 이제 세 별도 값이 할당됨.perlreapi`의 "Numbered capture callbacks" 참고.
  • PL_sawampersand가 이전에는 $``, $&, $&` 중 하나라도 봤는지 나타내는 불리언이었지만, 이제 각 변수의 존재를 개별적으로 나타내는 세 개의 1비트 플래그를 담아요.
  • CV * typemap 항목이 &{...}처럼 &{} 오버로딩과 typeglob을 지원 [perl #96872].
  • 오버로딩을 나타내는 SVf_AMAGIC 플래그가 이제 객체가 아닌 stash에 있음. 메서드나 @ISA가 바뀔 때마다 자동 설정되어 의미도 바뀜. 이제 "잠재적으로 오버로드됨"을 뜻해요. 오버로드 테이블 계산 시 오버로딩이 없으면 플래그가 자동 꺼져 눈에 띄는 둔화가 없어야 해요. 오버로드 테이블의 낡음은 bless 중이 아니라 오버로드 메서드가 호출될 때 검사됨. "A" magic이 사라짐. SVf_AMAGIC 플래그 처리 변경이 그 필요를 제거. PL_amagic_generation이 더 이상 필요 없어 제거되고 XS 모듈에 대해 이제 PL_na에 대한 매크로 별칭. 폴백 오버로드 설정이 이제 오버로드됨 자체와 분리된 stash 항목에 저장.
  • 문자 처리 코드의 일부가 정리됨. 변경은 운영상 보이지 않아야 해요.
  • study 함수가 v5.16에서 no-op이 됨. 단순히 return 문으로 비활성화되고 코드는 남아 있었지만, 이제 study가 예전에 하던 것을 지원하던 코드가 제거됨.
  • Threaded perl에서 각 COP에 패키지 이름을 저장할(cop->stashpv) 별도 PV가 더 이상 할당되지 않아요. 대신 stash 포인터를 담는 새 PL_stashpad 배열로의 오프셋(cop->stashoff)이 있어요.
  • 플러그 가능 정규식 API에서 regexp_engine 구조체가 새 필드 op_comp을 얻었는데 현재는 perl 내부용이고 다른 정규식 플러그인 모듈은 NULL로 초기화해야 해요.
  • 새 함수 alloccopstash가 API에 추가됐지만 실험적.
  • Perl이 magic 값에 mg_get()을 너무 많이 호출할 수 있는 코드의 버그를 가끔 숨기는 방식으로 get magic을 구현했어요. 이 오류 숨김이 더 이상 발생하지 않아 오랜 버그가 이제 드러날 수 있어요. XS 코드에서 magic 관련 오류가 보이면 그것과 쓰는 Perl API 함수가 SvGMAGICAL() 값에 mg_get()을 한 번만 호출하는지 확인하세요.
  • CV에 대한 OP 할당이 이제 슬래브 할당자를 사용. 이는 CV에 할당된 OP의 메모리 관리를 단순화해 컴파일 오류 후 정리를 더 간단·안전하게 해요 [perl #111462][perl #112312].
  • PERL_DEBUG_READONLY_OPS가 새 슬래브 할당자와 동작하도록 재작성되어 이전보다 더 많은 위반을 잡을 수 있어요.
  • PERL_IMPLICIT_SYS·PERL_DEBUG_READONLY_OPS에만 활성화되던 옛 op 슬래브 할당자가 은퇴.

선택된 버그 수정 (Selected Bug Fixes)

  • Here document 종결자가 파일 끝에서 발생하면 종료 줄바꿈을 더 이상 요구하지 않아요. 문자열 eval 끝에서는 이미 그랬어요 [perl #65838].
  • -DPERL_GLOBAL_STRUCT 빌드가 이제 사용을 끝낸 후에 전역 구조를 해제.
  • @INC 경로의 끝 '/'에 '/'(이)가 더 이상 추가되지 않아요.
  • :crlf 레이어가 읽지 않은 데이터가 자체 버퍼에 맞지 않을 때 이제 동작 [perl #112244].
  • ungetc()이 UTF-8 인코딩 데이터 처리 [perl #116322].
  • 코어 typemap의 버그로 T_BOOL 변수가 OUTPUT: 섹션(RETVAL 예외)에 쓰일 때 T_BOOL 코어 typemap 항목에 매핑되는 모든 C 타입이 설정·갱신·수정되지 않았어요. INPUT: 섹션의 T_BOOL은 영향 없음. XSUB(RETVAL)에 T_BOOL 반환 타입을 쓰는 건 영향 없음. 이 버그 수정의 부작용은, OUTPUT: 섹션에 T_BOOL을 지정하면(이전에는 SV에 아무것도 하지 않음) 읽기 전용 SV(literal)가 XSUB에 전달되면 "Modification of a read-only value attempted" 같은 croak이 발생한다는 거예요 [perl #115796].
  • 많은 플랫폼에서 스크립트 이름으로 디렉터리 이름을 주면 perl이 아무것도 하지 않고 성공했다고 보고했어요. 이제 보편적으로 오류를 보고하고 0이 아닌 것으로 종료해야 해요 [perl #61362].
  • 치명적 경고 아래의 sort {undef} ...이 더 이상 크래시하지 않아요. Perl v5.16에서 크래시하기 시작했어요.
  • 서로 bless된 stash(bless \%Foo::, 'Bar'; bless \%Bar::, 'Foo')가 더 이상 이중 해제를 일으키지 않아요. 이 버그는 Perl v5.16에서 시작됨.
  • 수많은 메모리 누수 수정, 주로 치명적 경고와 문법 오류 포함.
  • 'f' =~ /../g 같은 일부 실패한 정규식 매치가 pos를 리셋하지 않았어요. "match-once" 패턴(m?...?g)도 두 번째 호출 시 리셋 실패 [perl #23180].
  • local *ISA·local *Foo::이 stale MRO 캐시를 일으키던 여러 버그 수정.
  • typeglob이 별칭됐을 때 서브루틀 정의가 더 이상 stale 메서드 캐시를 일으키지 않아요. 이 버그는 Perl v5.10에 도입.
  • typeglob의 패키지가 부모 stash에서 삭제됐을 때 서브루틀을 포함한 typeglob을 localize하는 게 더 이상 오류를 만들지 않아요. 이 버그는 Perl v5.14에 도입.
  • 일부 상황에서 local *method=...이 스코프 종료 시 메서드 캐시를 리셋하지 못했어요.
  • </[.foo.]/>이 더 이상 오류가 아니고 (이전처럼) 경고를 내며 </[.fo]/>으로 취급 [perl #115818].
  • goto $tied_var이 이제 어떤 종류의 goto(서브루틴·레이블)인지 결정하기 전에 FETCH를 호출.
  • glob 할당으로 패키지 이름 변경(*Foo:: = *Bar::; *Bar:: = *Baz::)을 m?...?·reset과 결합해도 더 이상 threaded 빌드가 크래시하지 않아요.
  • 해시에 목록을 할당하는 것과 관련된 많은 버그 수정. 많이는 (1, 1, 1, 1) 같은 반복 키를 가진 목록 관련.
    • scalar(%h = (1, 1, 1, 1))이 이제 2가 아닌 4를 돌려줘요.
    • 목록 문맥에서 %h = (1, 1, 1)의 반환 값이 틀렸어요. 이전에는 (1, undef, 1)을 돌려줬지만 이제 (1, undef)을 돌려줘요.
    • Perl이 이제 ($s, %h) = (1, {})(%h) = ({})과 같은 "Reference found where even-sized list expected" 경고를 내요.
    • 해시에 대한 목록 할당의 추가 경계 경우 다수 수정. 자세한 내용은 커밋 23b7025ebc.
  • 어휘 변수에 적용된 속성이 더 이상 메모리를 누출하지 않아요 [perl #114764].
  • dump, goto, last, next, redo, require 뒤에 bareword(또는 버전)가 오고 그다음 중위 연산자가 오는 게 더 이상 문법 오류가 아니에요. 이전에는 항(term)이 기대되는 곳에서 다른 의미를 가진 중위 연산자(+ 같은)에 대해 그랬어요 [perl #105924].
  • require a::b . 1·require a::b + 1이 더 이상 잘못된 모호성 경고를 내지 않아요 [perl #107002].
  • 클래스 메서드 호출이 이제 영숫자 문자로 시작하는 문자열뿐 아니라 어떤 문자열에서도 허용돼요 [perl #105922].
  • qr//로 만든 빈 패턴을 m///에 쓰면 더 이상 "empty pattern reuses last pattern" 동작을 발화시키지 않아요 [perl #96230].
  • 반복 중 해시를 tie하는 게 더 이상 메모리 누수를 일으키지 않아요.
  • 반복 중 tied 해시를 해제하는 게 더 이상 메모리 누수를 일으키지 않아요.
  • STORE에서 죽는 tied 배열·해시에 목록 할당이 더 이상 메모리 누수를 일으키지 않아요.
  • 힌트 해시(%^H)가 tie되면 컴파일 타임 스코프 진입(힌트 해시 복사)이 FETCH가 죽으면 더 이상 메모리를 누출하지 않아요 [perl #107000].
  • 상수 폴딩이 더 이상 특수 split " " 동작을 부적절하게 발화시키지 않아요 [perl #94490].
  • defined scalar(@array), defined do { &foo } 등이 이제 defined의 인자를 단순 스칼라로 취급 [perl #97466].
  • *DB::DB glob을 정의하지 않거나 &DB::DB 스텁만 제공하는 커스텀 디버깅을 실행하는 게 더 이상 크래시가 아니라 오류를 냅니다 [perl #114990].
  • reset ""이 이제 문서와 일치. reset은 인자 없이 호출될 때만 m?...? 패턴을 리셋. 빈 문자열 인자는 이제 아무것도 하지 않아요(이전에는 인자 없음으로 취급) [perl #97958].
  • 빈 목록을 돌려주는 인자를 가진 printf가 더 이상 스택 끝을 넘어 읽어 불규칙 동작을 일으키지 않아요 [perl #77094].
  • --subname이 더 이상 잘못된 모호성 경고를 내지 않아요 [perl #77240].
  • v10이 이제 레이블이나 패키지 이름으로 허용. Perl v5.6에서 v-string이 추가될 때 실수로 깨졌어요 [perl #56880].
  • length, pos, substr, sprintf이 tie·오버로딩·참조·typeglob으로 혼동될 수 있었는데, 그런 것의 문자열화가 내부 표현을 UTF-8로/에서 바꾸면요 [perl #114410].
  • utf8::encode이 이제 tied 변수에서 FETCH·STORE 호출. utf8::decode가 이제 STORE 호출(이미 FETCH는 호출).
  • $tied =~ s/$non_utf8/$utf8/이 tied 변수가 Latin-1 문자열, 공유 해시 키 스칼라, ASCII·Latin-1로 문자열화하는 참조·typeglob을 돌려주면 더 이상 무한 루프하지 않아요. v5.12의 회귀였어요.
  • /e 없는 s///이 특정 최적화를 포기해야 할 때를 더 잘 감지해 일부 버그 경우 수정:
    • 치환부의 특정 구성(&&, ||, .. 등)의 매치 변수; 예: s/(.)/$l{$a||$1}/g [perl #26986].
    • 치환부의 매치 변수 별칭.
    • 치환부의 $REGERROR·$REGMARK [perl #49190].
    • 마지막 성공 패턴을 쓰게 하는 빈 패턴(s//$foo/)이 그 패턴이 치환부의 변수를 수정하는 코드 블록을 포함할 때.
  • 치환 문자열의 taintedness가 더 이상 s///e 반환 값의 taintedness에 영향주지 않아요.
  • $| autoflush 변수가 필요할 때 즉석에서 생성돼요. 현재 선택된 파일핸들이 빈 IO 슬롯의 typeglob일 때 이게 발생하면(예: 모듈·eval에서 언급) 크래시하곤 했어요 [perl #115206].
  • 문자열 eval 끝의 줄 번호가 더 이상 하나 어긋나지 않아요 [perl #114658].
  • $_을 copy-on-write 스칼라로 설정하는 @INC 필터(@INC의 서브루틴이 돌려주는 서브루틴)가 더 이상 파서가 그 문자열 버퍼를 제자리에서 수정하게 하지 않아요.
  • length($object)이 객체에 undef를 돌려주는 문자열 오버로딩이 있어도 더 이상 undefined 값을 돌려주지 않아요 [perl #115260].
  • 메서드 호출의 stash 이름 조회 캐시인 PL_stashcache 사용이 복원됨. 2011년 8월 커밋 da6b625f78f5f133이 PL_stashcache에서 값을 조회하는 코드를 실수로 깨뜨렸어요. 캐시일 뿐이어서 아주 정확히 그 없이도 모든 게 계속 동작했죠.
  • "Can't localize through a reference" 오류가 lvalue 서브루틴의 마지막 줄에 local %$ref이 있을 때 v5.16.0에서 사라졌었어요. \local %$ref에 대해 perl v5.8.1에서 사라졌어요. 복원됨.
  • here-doc 파싱이 크게 개선되어 여러 파싱 버그·크래시·메모리 누수 하나 수정, 특정 조건에서 잘못된 이후 줄 번호 수정.
  • eval 안에서 끝나지 않은 here-doc의 오류 메시지가 더 이상 중간에 줄바꿈이 없어요 [perl #70836].
  • 치환 패턴 안의 치환(s/${s|||}//)이 더 이상 파서를 혼동하지 않아요.
  • 주석을 허용하기에 이상한 곳이지만 s//"" # hello/e은 항상 동작했는데 첫 # 앞에 null 문자가 있으면 안 됐어요. 이제 null이 있어도 동작.
  • tr///·y///의 잘못된 범위가 더 이상 메모리 누수를 일으키지 않아요.
  • 문자열 eval이 맨 끝의 세미콜론으로 구분된 따옴표류 연산자(eval 'q;;')를 더 이상 문법 오류로 취급하지 않아요.
  • warn {$_ => 1} + 1이 더 이상 문법 오류가 아니에요. 파서가 특정 목록 연산자 뒤 익명 해시가 오고 그다음 단항 연산자와 형태를 공유하는 중위 연산자가 오면 혼동하곤 했어요.
  • (caller $n)[6](eval의 텍스트 제공)이 실제 파서 버퍼를 돌려주곤 했어요. 수정하면 크래시할 수 있었어요. 이제 항상 복사본을 돌려줘요. 반환 문자열 끝에 "\n;"이 더 이상 붙지 않아요. 반환 텍스트에 이전에 생략되던 here-doc 본문도 포함.
  • UTF-8 위치 캐시가 magic 변수 접근 시 리셋되어 문자열 버퍼와 UTF-8 위치 캐시가 어긋나지 않게 [perl #114410].
  • magic UTF-8 문자열에 대해 get magic이 두 번 호출되던 다양한 경우 수정.
  • 이 코드($& 등이 없을 때)
$_ = 'x' x 1_000_000;
1 while /(.)/;

성능을 위해 버퍼 복사를 건너뛰곤 했지만, 원본 문자열이 바뀌면 $1 등이 바뀌는 문제가 있었어요. 수정됨.

  • Perl이 아웃 오브 메모리 메시지 보고에 PerlIO를 더 이상 쓰지 않아요. PerlIO가 더 많은 메모리를 할당하려 할 수 있기 때문.
  • 정규식에서 {n,m}으로 수량화된 것이 S<n E m>>이면 매치 불능. 이전에는 치명적 오류였지만 이제 그냥 경고(그것은 매치되지 않을 것) [perl #82954].
  • 이후에 undef·재정의된 서브루틀에 정의된 format이 (새로 정의된 바깥 서브루틀의) 잘못된 pad의 변수를 폐쇄해 크래시·"Bizarre copy" 오류를 일으킬 수 있었어요.
  • 런타임 XSUB 재정의가 잘못된 줄 번호의 경고를 낼 수 있었어요.
  • %vd sprintf 형식이 알파 버전의 버전 객체를 지원하지 않아요. 알파 버전을 받으면 형식 자체(%vd)를 출력하고 "Invalid conversion in printf" 경고를 내곤 했어요. 더 이상 그러지 않고 출력에서 빈 문자열을 만들어요. 이 경우 메모리 누수도 더 이상 없어요.
  • 메인 패키지의 $obj->SUPER::method 호출이 SUPER 패키지가 다른 수단으로 이미 접근됐으면 실패할 수 있었어요.
  • Stash 별칭(*foo:: = *bar::)이 더 이상 SUPER 호출이 메서드·@ISA 변경을 무시하거나 잘못된 패키지를 쓰게 하지 않아요.
  • 이름이 ::SUPER로 끝나는 패키지의 메서드 호출이 더 이상 SUPER 메서드 호출로 취급되지 않아 메서드를 못 찾게 되지 않아요. 또한 그런 패키지에 서브루틀 정의가 포함 패키지의 SUPER 메서드 호출로 발견되지 않게 하지도 않아요 [perl #114924].
  • \w가 이제 U+200C(ZERO WIDTH NON-JOINER)·U+200D(ZERO WIDTH JOINER)와 매치. \W가 더 이상 이들과 매치하지 않아요. 유니코드가 \w가 매치해야 하는 정의를 수정했기 때문.
  • dump LABEL이 더 이상 레이블을 누출하지 않아요.
  • 상수 폴딩이 파일 이름·핸들 모두를 받을 수 있는 stat()·truncate() 같은 함수의 동작을 더 이상 바꾸지 않아요. stat 1 ? foo : bar이 이제 (임의 표현식이므로) "foo" 핸들이 아니라 인자를 파일 이름으로 취급.
  • truncate FOO, $len이 파일핸들이 삭제됐으면 "FOO"를 파일 이름으로 취급하는 폴백을 더 이상 하지 않아요. 이는 Perl v5.16.0에서 깨졌어요.
  • sub-to-glob·glob-to-glob 할당 후 서브루틀 재정의가 더 이상 이중 해제·panic 메시지를 일으키지 않아요.
  • s///이 이제 치환 수행 시 결과 문자열이 같아도(s/a/a/) vstring을 일반 문자열로 바꿔요.
  • 프로토타입 불일치 경고가 실제로 ""를 가진 상수 sub을 프로토타입이 없는 것으로 더 이상 잘못 취급하지 않아요.
  • 상수 서브루틀·정방향 선언이 더 이상 프로토타입 불일치 경고가 sub 이름을 생략하지 않게 하지 않아요.
  • 서브루틀에 undef하면 이제 call checker를 지워요.
  • ref 연산자가 Perl v5.16.0에서 bless된 객체에 메모리를 누출하기 시작했어요. 수정됨 [perl #114340].
  • use가 더 이상 인자를 문으로 파싱하려 하지 않아 use constant { () };이 문법 오류가 됨 [perl #114222].
  • 디버그 빌드에서 format 안의 "uninitialized" 경고가 더 이상 어서션 실패를 일으키지 않아요.
  • 디버그 빌드에서 format 안에 중첩된 서브루틀이 더 이상 어서션 실패를 일으키지 않아요 [perl #78550].
  • format 안에 format과 use 문이 이제 허용.
  • print $xsub { print $x }->()이 이제 항상 같은 출력을 내요. 후자가 변수가 활성 상태가 아니면(예: 현재 실행 중인 이름 붙은 서브루틀 밖에 정의됨) $x를 폐쇄하기를 거부할 수 있었어요.
  • 비슷하게 print $xprint eval '$x'이 이제 같은 출력을 내요. 이는 또한 "my $x if 0" 변수들이 디버거에서 보이게 해요 [perl #114018].
  • 재귀적으로 호출된 format이 더 이상 자신의 어휘 변수를 짓밟지 않고, 각 재귀 호출에 고유 어휘 집합이 있어요.
  • 활성 format이나 그와 연관된 핸들을 해제하려 하면 더 이상 크래시하지 않아요.
  • format 파싱이 더 이상 중괄호·세미콜론·낮은 우선순위 연산자에 혼동하지 않아요. 중괄호를 format 구분자(=·. 대신)로 쓰는 것이 이전에 가능했지만 때때로만요. format 인자 줄의 세미콜론·낮은 우선순위 연산자가 더 이상 파서를 혼동해 줄의 반환 값을 무시하지 않게 해요. format 인자 줄에서 중괄호를 항상 do 블록으로 취급하는 대신 익명 해시에 쓸 수 있어요.
  • format이 이제 정규식·다른 따옴표 구성(/(?{...})/·qq/${...}/)의 코드 블록 안에 중첩될 수 있어요 [perl #114040].
  • format이 더 이상 컴파일 오류 후 생성되지 않아요.
  • 디버그 빌드에서 -DA 명령줄 옵션이 Perl v5.16.0에서 크래시하기 시작했어요. 수정 [perl #114368].
  • ithreads 활성 Windows 빌드에서 의사 fork 자식의 조기 종료를 포함한 잠재적 교착 시나리오 수정. Windows에서 F<t/op/fork.t> 테스트가 멈추는 일반적 문제 해결 [perl #88840].
  • require()에서 오류를 생성하는 코드가 3바이트보다 짧고 /.p?\z/로 끝나는 파일 이름에 대해 파일 이름 시작 전 1~2바이트를 읽을 수 있었어요. 수정됨. 어쨌든 use()·require()에 주는 모듈 이름으로는 절대 일어나지 않았어요.
  • require()에 주는 모듈의 경로 이름 처리가 VMS에서 스레드 안전하게 됨.
  • VMS에서 비블로킹 소켓 수정.
  • Pod가 이제 문자열 eval 밖의 따옴표 구성 안 코드에 중첩될 수 있어요. 이전에는 문자열 eval 안에서만 동작했어요 [perl #114040].
  • goto ''이 이제 빈 레이블을 찾아 언어 프로그램을 종료하는 대신 "goto must have label" 오류를 냅니다 [perl #111794].
  • goto "\0"이 이제 "goto must have label" 대신 "Can't find label"로 죽어요.
  • C 함수 hv_store%^H에 쓰면 크래시하곤 했어요 [perl #111000].
  • cv_set_call_checker로 클로저 프로토타입에 붙은 call checker가 이제 그것에서 복제된 클로저로 복사돼요. 그래서 cv_set_call_checker이 클로저의 속성 핸들러 안에서 이제 동작.
  • $^N에 쓰는 게 이전에는 효과가 없었어요. 이제 기본으로 "Modification of a read-only value"로 croak하지만, $1처럼 커스텀 정규식 엔진이 덮어쓸 수 있어요 [perl #112184].
  • 제어 문자 glob에 undef(undef *^H)하는 게 더 이상 모호성에 대한 잘못된 경고를 내지 않아요 [perl #112456].
  • 효율을 위해 많은 연산자·내장 함수가 매번 같은 스칼라를 돌려줘요. Lvalue 서브루틀과 CORE:: 네임스페이스의 서브루틀이 이 구현 세부를 새게 했어요. print &CORE::uc("a"), &CORE::uc("b")이 "BB"를 출력하곤 했어요. uc의 반환 값을 돌려주는 lvalue 서브루틀에서도 같게 일어났어요. 이제 그런 경우 값이 복사돼요.
  • 빈 블록 또는 빈 목록을 돌려주는 블록의 method {} 문법이 크래시하거나 스택에 남은 임의 값을 invocant로 사용하곤 했어요. 이제 오류를 냅니다.
  • vec이 이제 극도로 큰 오프셋(>2GB)에서 동작 [perl #111730].
  • 오버로드 설정 변경과 오버로딩에 영향을 주는 상속 변경이 이제 즉시 효과. 이전에는 bless 후에만 효과. 클래스가 오버로딩을 갖기 전에 생성된 객체는 클래스가 use overload·@ISA 변경으로 오버로딩을 얻어도, bless 후에도 non-overloaded로 남곤 했어요. 수정 [perl #112708].
  • 오버로딩 있는 클래스가 이제 폴백 값을 상속할 수 있어요.
  • 오버로딩이 += 같은 할당 연산자 양쪽에 overloaded 객체가 있으면 폴백 값 0을 존중하지 않았어요 [perl #111856].
  • pos이 이제 해시·배열 인자로 잘못된 경고 대신 croak.
  • while(each %h)이 이제 readline·readdir처럼 while(defined($_ = each %h))을 의미.
  • CORE:: 네임스페이스의 sub이 인자 목록 없이(&CORE::time, 괄호 없음) 호출될 때 undef *_ 후 더 이상 크래시하지 않아요.
  • unpack이 데이터가 문제일 때 더 이상 "'/' must follow a numeric type in unpack" 오류를 내지 않아요 [perl #60204].
  • join"@array"이 tied $"에 FETCH를 한 번만 호출 [perl #8931].
  • CORE::GLOBAL 오버라이드의 영향을 받는 코어 op 컴파일로 생성된 일부 서브루틀 호출이 op 검사를 두 번 수행했어요. 순수 Perl 코드에선 항상 멱등이지만 커스텀 콜 체커가 관여하면 이중 검사가 문제될 수 있어요.
  • fork 주위에 경쟁 조건이 존재해 부모에 보낸 시그널이 부모·자식 둘 다가 처리할 수 있었어요. 이를 막기 위해 fork 주위에 시그널을 잠시 차단 [perl #82580].
  • (?{})·(??{}) 같은 정규식의 코드 블록 구현이 버그 무리를 제거하도록 크게 재작업. 주요 사용자 가시 변경:
    • 패턴 안 코드 블록이 이제 주변 코드와 같은 패스에서 파싱. 특히 균형 잡힌 중괄호가 더 이상 필요하지 않음. 이제 동작:
/(?{  $x='{'  })/

이제 이 오류 메시지는 더 이상 생성되지 않음: "Sequence (?{...}) not terminated or not {}-balanced in regex". 하지만 새 오류가 보일 수 있음: "Sequence (?{...}) not terminated with ')'". 추가로 런타임 패턴의 리터럴 코드 블록은 perl 컴파일 시에만 한 번 컴파일:

for my $p (...) {
    # 이 'FOO' 코드 블록은 주변 'for' 루프와 동시에 한 번 컴파일
    /$p{(?{FOO;})/;
}
  • 어휘 변수가 스코프·재귀·클로저 동작에 대해 이제 정상. 특히 </A(?{B})C/>이 (클로저 관점에서) </A/ && do { B } && /C/>과 정확히 같고, qr/A(?{B})C/sub {/A/ && do { B } && /C/}과 같아요. 그래서 이 코드가 기대대로 동작해 0·1·2와 매치하는 세 정규식을 만들어요:
for my $i (0..2) {
    push @r, qr/^(??{$i})$/;
}
"1" =~ $r[1]; # matches
  • use re 'eval' 프래그마가 이제 런타임에 정의된 코드 블록에만 필요. 특히 $r 패턴의 텍스트는 여전히 새 패턴에 보간·재컴파일되지만 $r 안의 개별 컴파일된 코드 블록은 재컴파일 대신 재사용되고 use re 'eval'이 더 이상 필요 없음:
my $r = qr/abc(?{....})def/;
/xyz$r/;
  • 흐름 제어 연산자가 더 이상 크래시하지 않음. 각 코드 블록이 새 동적 스코프에서 실행되어 next 등이 어떤 바깥 루프도 보지 못해요. return은 코드 블록에서 값을 돌려주고 어떤 바깥 서브루틀에서도 돌려주지 않아요.
  • Perl은 보통 런타임 패턴의 컴파일을 캐시하고 패턴이 바뀌지 않으면 재컴파일하지 않지만, 클로저의 올바른 동작에 필요하면 이제 비활성화돼요:
my $code = '(??{$x})';
for my $x (1..3) {
    # 매번 새 $x 값을 보려면 재컴파일
    $x =~ /$code/;
}
  • </msix>·(?msix) 등 플래그가 이제 (??{}) 반환 값으로 전파. 이제 동작:
"AB" =~ /a(??{'b'})/i;
  • 경고·오류가 C<re_eval>이 아니라 주변 코드(런타임 코드 블록이면 eval)에서 온 것처럼 보여요:
use re 'eval'; $c = '(?{ warn "foo" })'; /$c/;
/(?{ warn "foo" })/;

이전에는 "foo at (re_eval 1) line 1."·"foo at (re_eval 2) line 1."였고 이제 "foo at (eval 1) line 1."·"foo at /some/prog line 2."

  • Perl이 이제 어떤 유니코드 버전이든 재컴파일 가능. v5.16에서 유니코드 6.0·6.1에서 동작했지만 이전 릴리스는 버그가 있었어요. 오래될수록 문제가 더 많았죠.
  • vec이 더 이상 lvalue 문맥에서 "uninitialized" 경고를 내지 않아요 [perl #9423].
  • 정규식의 고정 문자열을 포함한 최적화가 경계 경우 심각한 성능 저하를 일으킬 수 있었어요. 수정 [perl #76546].
  • 특정 경우 정규식 안에 빈 하위 패턴((?:)·(?:|))을 포함하면 일부 최적화를 비활성화할 수 있었어요. 수정.
  • prototype이 "CORE::nonexistent_keyword" 같은 문자열을 받으면 내는 "Can't find an opnumber" 메시지가 이제 UTF-8·임베디드 NUL을 그대로 통과 [perl #97478].
  • prototype이 이제 magic 변수($1 같은)를 서브루틀 이름으로 취급하는 대신 CORE:: 접두사 확인에서 비magic 변수처럼 취급.
  • Threaded perl에서 정규식의 런타임 코드 블록이 op 트리에 저장된 패키지 이름을 손상시켜 caller의 잘못된 읽기·가능한 크래시를 일으킬 수 있었어요 [perl #113060].
  • 클로저 프로토타입 참조(클로저의 속성 핸들러에서 \&{$_[1]})가 더 이상 서브루틀 복사(또는 디버그 빌드에서 어서션 실패)를 일으키지 않아요.
  • eval '__PACKAGE__'이 현재 패키지가 덮어쓰기된 경우(*ThisPackage:: = *ThatPackage::) threaded 빌드에서 올바른 답을 돌려줘요 [perl #78742].
  • 패키지가 호출하는 코드에 의해 삭제되면 caller가 삭제된 패키지에 속한 스택 프레임을 볼 수 있어요. stash의 메모리 주소가 스칼라에 재사용되고 같은 스칼라에 치환이 수행되면 크래시할 수 있었어요 [perl #113486].
  • UNIVERSAL::can이 첫 인자를 내부적으로 문자열인지 숫자인지에 따라 더 이상 다르게 취급하지 않아요.
  • open<& 모드에서 세 번째 인자가 숫자인지 검사해 파일 디스크립터인지 핸들 이름인지 판단. $1 같은 magic 변수는 항상 숫자 검사에 실패해 핸들 이름으로 취급됐어요.
  • warn의 magic 변수($1, tie) 처리가 여러 수정. tied 인자·tied $@에서 FETCH가 이제 한 번만 호출 [perl #97480]. ""로 문자열화하는 객체를 돌려주는 tied 변수가 더 이상 무시되지 않아요. 이전에 사용될 때 참조를 돌려준 tied $@이 더 이상 무시되지 않아요.
  • warn ""$@=3이든 $@="3"이든 숫자를 담는 $@을 같은 방식으로 취급. 이전에는 전자를 무시했어요. 이제 $@="3"에서 항상 했던 것처럼 "\t...caught"를 덧붙여요.
  • magic 변수의 숫자 연산자(예: S<C<$1 + 1>>)가 정수 연산이 더 적절한 데도 부동소수점 연산을 써서 64비트 플랫폼에서 정확도 손실 [perl #109542].
  • 단항 부정이 문자열이 어떤 시점에 숫자로 쓰였더라도 더 이상 문자열을 숫자로 취급하지 않아요. 그래서 $x가 "dogs"를 담고 있으면 $y=0+$x가 일어났어도 -$x가 "-dogs"를 돌려줘요.
  • Perl v5.14에서 -'-10'이 "+10"이 아닌 "10"을 돌려주도록 수정됐지만, magic 변수($1, tie)는 지금까지 수정되지 않았어요 [perl #57706].
  • 단항 부정이 내부 C 플래그와 무관하게 문자열을 일관되게 취급.
  • tr/SEARCHLIST/REPLACEMENTLIST/과 관련된 Perl v5.16.0 도입 회귀 수정. 문자가 SEARCHLIST에 두 번 이상 나타나면 첫 인스턴스만 의미 있는 것. 일부 상황에서 마지막 인스턴스가 이전 것을 덮어썼어요 [perl #113584].
  • qr/\87/ 같은 정규식이 이전에 조용히 NUL 문자를 삽입해 qr/\00087/로 쓴 것처럼 매치했어요. 이제 "\8" 시퀀스가 인식되지 않는다는 메시지와 함께 qr/87/로 쓴 것처럼 매치.
  • __SUB__이 이제 특수 블록(BEGIN, END 등)에서 동작.
  • Windows에서 BEGIN 블록 안 스레드 생성이 이론적으로 크래시할 수 있었어요. 여전히 제대로 동작하지는 않지만 더 이상 크래시하지 않아요 [perl #111610].
  • \&{''}(빈 문자열)이 이제 다른 sub 이름처럼 스텁을 자동 활성화하고 더 이상 "Unable to create sub" 오류를 내지 않아요 [perl #94476].
  • v5.14.0 도입 회귀 수정 — 일부 re 모듈 호출이 $_을 망가뜨리던 것 [perl #113750].
  • do FILE이 이제 파일을 읽지 못해도 항상 $@을 설정하거나 지워요. 문서가 권장하는 대로 $@을 먼저 테스트하면 항상 올바른 결과를 돌려받도록 보장해요.
  • each @array 구성에 쓰는 배열 반복자가 @array가 지워질 때 이제 올바르게 리셋 [perl #75596]. 이는 예를 들어 @array = (...)로 배열이 전역 할당될 때 발생하지만 값이 할당될 때는 아님. XS API 용어로는 av_clear()이 이제 반복자를 리셋한다는 뜻. 이는 해시가 지워질 때 해시 반복자 동작을 반영.
  • $class->can, $class->isa, $class->DOES$class가 가리키는 패키지 존재와 무관하게 올바른 결과를 돌려줘요 [perl #47113].
  • 도착한 시그널이 더 이상 $@을 지우지 않아요 [perl #45173].
  • 빈 변수 목록의 my () 선언 허용 [perl #113554].
  • 파싱 중 오류 후 선언된 sub이 더 이상 스텁을 남기지 않아요 [perl #113712].
  • 문자열 eval이 없는 클로저가 더 이상 포함하는 서브루틀을 붙잡지 않아, 바깥 서브루틀이 폐쇄한 변수가 안쪽 sub이 여전히 존재해도 바깥 sub이 해제될 때 해제될 수 있어요 [perl #89544].
  • "<&="·">&=" 모드로 열어 메모리 내 파일핸들을 복제하는 게 v5.16.0에서 제대로 동작하지 않았어요. 새 핸들이 다른 스칼라 변수를 참조하게 했죠. 수정 [perl #113764].
  • qr// 표현식이 정규식 컴파일 시 offs를 설정하지 않는 커스텀 정규식 엔진에서 더 이상 크래시하지 않아요 [perl #112962].
  • delete local이 특정 magic 배열·해시에서 더 이상 크래시하지 않아요 [perl #112966].
  • 특정 magic 배열·해시 요소의 local이 요소가 local 전에 존재하지 않아도 스코프 종료 시 요소 삭제를 준비하지 않곤 했어요.
  • scalar(write)이 더 이상 여러 항목을 돌려주지 않아요 [perl #73690].
  • 문자열→부동소수점 변환이 use locale 아래에서 특정 문자열을 잘못 파싱하지 않아요 [perl #109318].
  • 죽는 @INC 필터가 더 이상 메모리를 누출하지 않아요 [perl #92252].
  • 오버로드된 연산의 구현이 이제 올바른 문맥에서 호출. 이를 통해 <>을 제대로 오버라이드할 수 있게 됨 [perl #47119].
  • use overload 호출 시 fallback 키만 지정하면 이제 제대로 동작 [perl #113010].
  • sub foo { my $a = 0; while ($a) { ... } }sub foo { while (0) { ... } }이 이제 같은 것을 돌려줘요 [perl #73618].
  • 문자열 부정이 use integer; 아래에서 없을 때와 동일하게 동작 [perl #113012].
  • chr이 내부 표현과 무관하게 -1에 대해 유니코드 대체 문자(U+FFFD)를 돌려줘요. -1은 인자가 tied거나 내부적으로 문자열이면 wrap되곤 했어요.
  • 바깥 sub이 해제된 후 format을 쓰면 v5.12.0부터, format이 바깥 sub의 어휘 변수를 참조하면 크래시할 수 있었어요.
  • 바깥 sub이 undef된 후 format을 쓰면 v5.10.0부터 크래시할 수 있었어요.
  • 바깥에서 어휘 변수를 참조하는 format을 클로저 안에 정의해 쓰는 건 write 호출이 클로저 안에 직접 있지 않으면 사실상 동작한 적이 없어요. v5.10.0에서 크래시까지 시작. 이제 호출 스택 위쪽에 가장 가까운 그 클로저의 복사본으로 그 변수들을 찾아요.
  • 특수 블록의 변수를 폐쇄하는 format이 특수 블록 컴파일 전에 특수 블록과 같은 이름의 스텁이 있으면 더 이상 크래시하지 않아요.
  • 파서가 print; 앞에 오는 eval foo ()을 문법 오류로 취급해 더 이상 혼동하지 않아요 [perl #16249].
  • syscall의 반환 값이 64비트 플랫폼에서 더 이상 잘리지 않아요 [perl #113980].
  • 상수 폴딩이 더 이상 print 1 ? FOO : BAR이 FOO 핸들에 출력하게 하지 않아요 [perl #78064].
  • do subname이 이제 "subname"이라는 파일을 여는 대신 이름 붙은 서브루틀을 호출하고 그 파일 이름을 사용.
  • rv2cv 체크 훅(XS 모듈 등록)으로 찾은 서브루틀이 이제 foo bar이 sub 호출 foo(bar)인지 메서드 호출 "bar"->foo인지 결정할 때 고려돼요.
  • CORE::foo::bar이 더 이상 특별 취급되지 않아 전역 오버라이드를 CORE::GLOBAL::uc(...)로 직접 호출할 수 있어요 [perl #113016].
  • typeglob이 undef된 undefined sub을 호출하면 "Not a CODE reference" 대신 관례적인 "Undefined subroutine called" 오류.
  • @ISA 관련 두 버그 수정. *ISA = *glob_without_array·undef *ISA; @{*ISA}이 @ISA의 향후 수정이 메서드 조회에 쓰는 내부 캐시를 갱신하지 못하게 했어요. *glob_without_array 경우는 Perl v5.12의 회귀.
  • 정규식 최적화가 때때로 </m>과 함께 $을 실패·부정확 매치하게 했어요 [perl #114068].
  • __SUB__이 바깥 서브루틀이 sub foo; 문법으로 미리 선언됐을 때 sort 블록에서 동작 [perl #113710].
  • 유니코드 속성은 유니코드 코드 포인트에만 적용돼, 정규식을 위-유니코드 코드 포인트와 매치할 때 미묘함이 있어요. 이를 알리기 위한 경고가 생성돼요. 하지만 이 경고가 어떤 경우(예: 프로그램 파싱 중) 부적절하게 생성됐어요. \w·[:word:] 같은 비유니코드 매치는 정의가 유니코드 코드 포인트에만 적용되도록 제한하지 않으므로 경고를 내지 않아야 해요. 이제 메시지는 \p{}·\P{}에 매치할 때만 생성. 유니코드에서 단일 코드 포인트만 매치하는 극소수 속성에 대해 [perl #114148] 버그가 남아 있어요. 그것들이 위-유니코드 코드 포인트에 매치되면 경고가 생성되지 않아요.
  • 해시 요소를 언급하는 uninitialized 경고가 off-by-one 오류로 요소 이름을 (해시의 첫 버킷이 아닌 경우에만) 언급하곤 했어요.
  • 정규식 최적화 버그가 줄바꿈 존재 시 다중 줄 "^"이 잘못 동작하게 해 "/\n\n" =~ m#\A(?:^/$)#im이 매치하지 않을 수 있었어요 [perl #115242].
  • 목록 문맥의 실패한 fork이 더 이상 스택을 손상시키지 않아요. @a = (1, 2, fork, 3)이 fork 호출이 실패하면 2를 삼키고 (1, undef, 3)을 할당하곤 했어요.
  • 수많은 메모리 누수 수정, 주로 죽는 tied 변수, 정규식 문자 클래스·코드 블록, 문법 오류 포함.
  • 부동소수점 숫자를 담는 변수에 정규식(${qr//})을 할당하는 게 디버그 빌드에서 더 이상 어서션 실패를 일으키지 않아요.
  • 숫자를 담는 스칼라에 정규식을 할당하는 게 더 이상 이후의 numify가 임의 숫자를 만들게 하지 않아요.
  • magic 변수에 정규식을 할당하는 게 더 이상 magic을 지우지 않아요. v5.10의 회귀.
  • bless된 스칼라에 정규식을 할당하는 게 더 이상 크래시하지 않아요. 역시 v5.10의 회귀.
  • 정규식을 이제 tied 해시·배열 요소에 문자열로 평탄화하지 않고 할당할 수 있어요.
  • 정규식 numify가 더 이상 uninitialized 경고를 내지 않아요.
  • 음수 배열 인덱스가 더 이상 tied 변수의 EXISTS 메서드가 무시되게 하지 않아요. v5.12의 회귀.
  • 음수 배열 인덱스가 non-객체에 tie된 배열에서 더 이상 크래시하지 않아요.
  • $byte_overload .= $utf8이 왼쪽 스칼라가 마지막으로 오버로딩이 호출될 때 UTF-8 문자열을 만들었어도 더 이상 이중 인코딩 UTF-8을 만들지 않아요.
  • goto &sub이 이제 서브루틀이 원래 호출될 때의 배열 대신 현재 @_ 값을 사용. 즉 local @_ = (...); goto &sub이 이제 동작 [perl #43077].
  • 디버거가 재귀적으로 호출되면 더 이상 자신의 어휘 변수를 짓밟지 않아요. 이전에는 재귀에서 모든 호출이 같은 어휘 변수 집합을 공유했어요 [perl #115742].
  • 서브루틀에서 돌려받은 *_{ARRAY}이 더 이상 자발적으로 비어지지 않아요.
  • tied 파일핸들에 say로 출력할 때 $\ 값이 이전에 undef였어도 올바르게 localize돼요 [perl #119927].

알려진 문제 (Known Problems)

  • HP-UX 11.00 %ENV의 UTF8-flagged 문자열이 버그 있음 — HP-UX 11.00에서 UTF8-flagged 문자열과 %ENV의 상호작용이 현재 아직 완전히 진단되지 않은 방식으로 불안정해요. F<t/op/magic.t>의 테스트 실패, 이어서 환경에 와이드 문자를 저장할 때 알 수 없는 동작을 기대하세요.

부고 (Obituary)

Hojung Yoon (AMORETTE), 24세, 대한민국 서울 — 그는 2013년 5월 8일, 라마 피규어와 사인이 있는 TIMTOADY 카드와 함께 오랜 휴식에 들어갔어요. 그는 뛰어난 젊은 Perl 5 & 6 해커였고 Seoul.pm의 헌신적인 멤버였어요. 그는 Perl을 프로그래밍하고, 말하고, 먹고, 사랑했어요. 우리는 그가 어딘가에서 고장 난 IBM 노트북으로 여전히 Perl을 프로그래밍하고 있다고 믿어요. 그가 그리울 거예요.

감사의 말 (Acknowledgements)

Perl v5.18.0은 Perl v5.16.0 이후 약 12개월의 개발을 나타내며, 113명의 저자가 2,100개 파일에 걸쳐 약 400,000줄의 변경을 담고 있어요.

이 릴리스에 기여한 것으로 알려진 사람들: Aaron Crane, Aaron Trevena, Abhijit Menon-Sen, Adrian M. Enache, Alan Haggai Alavi, Alexandr Ciornii, Andrew Tam, Andy Dougherty, Anton Nikishaev, Aristotle Pagaltzis, Augustina Blair, Bob Ernst, Brad Gilbert, Breno G. de Oliveira, Brian Carlson, Brian Fraser, Charlie Gonzalez, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Colin Kuskie, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Daniel Perrett, Darin McBride, Dave Rolsky, David Golden, David Leadbeater, David Mitchell, David Nicol, Dominic Hargreaves, E. Choroba, Eric Brine, Evan Miller, Father Chrysostomos, Florian Ragwitz, François Perrad, George Greer, Goro Fuji, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, Igor Zaytsev, James E Keenan, Jan Dubois, Jasmine Ahuja, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Joaquin Ferrero, Joel Berger, John Goodyear, John Peacock, Karen Etheridge, Karl Williamson, Karthik Rajagopalan, Kent Fredric, Leon Timmermans, Lucas Holt, Lukas Mai, Marcus Holland-Moritz, Markus Jansen, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Schroeder, Moritz Lenz, Nicholas Clark, Niko Tyni, Oleg Nesterov, Patrik Hägglund, Paul Green, Paul Johnson, Paul Marquess, Peter Martini, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Rhesa Rozendaal, Ricardo Signes, Robin Barker, Ronald J. Kimball, Ruslan Zakirov, Salvador Fandiño, Sawyer X, Scott Lanning, Sergey Alekseev, Shawn M Moore, Shirakata Kentaro, Shlomi Fish, Sisyphus, Smylers, Steffen Müller, Steve Hay, Steve Peters, Steven Schubiger, Sullivan Beck, Sven Strickroth, Sébastien Aperghis-Tramoni, Thomas Sibley, Tobias Leich, Tom Wyant, Tony Cook, Vadim Konovalov, Vincent Pit, Volker Schatz, Walt Mankowski, Yves Orton, Zefram.

이 목록은 버전 관리 기록에서 자동 생성되므로 거의 확실히 불완전해요. 특히 Perl 버그 트래커에 이슈를 보고한 기여자 이름은 포함되지 않아요. 이 버전에 포함된 많은 변경은 Perl 코어에 포함된 CPAN 모듈에서 유래했어요. 전체 역사적 기여자 목록은 Perl 소스 배포판의 F 파일 참고.

버그 보고 (Reporting Bugs)

버그라고 생각하는 걸 발견하면 comp.lang.perl.misc 뉴스그룹과 http://rt.perl.org/perlbug/ 의 perl 버그 데이터베이스의 최근 게시물을 확인해 보세요. http://www.perl.org/ 에도 정보가 있을 수 있어요.

보고되지 않은 버그라고 믿으면 릴리스에 포함된 perlbug 프로그램을 실행하세요. 버그를 작지만 충분한 테스트 케이스로 줄이는 걸 잊지 마세요. 버그 보고는 perl -V 출력과 함께 [email protected] 보내져 Perl 포팅 팀이 분석해요.

보고하는 버그가 공개 보관 메일링 리스트에 보내기에 부적절한 보안 영향이 있으면 [email protected] 보내세요. 이는 모든 코어 커미터가 포함된 폐쇄 구독 비보관 메일링 리스트로, 이슈 영향 평가, 해결책 파악, 문제를 완화·수정하는 패치 릴리스 조정을 도와줘요. 이 주소는 Perl 코어의 보안 이슈에만 쓰고, CPAN에 독립 배포된 모듈에는 쓰지 마세요.

같이 보기 (SEE ALSO)

  • F 파일 — 무엇이 바뀌었는지 상세를 보는 방법 설명.
  • F 파일 — Perl 빌드 방법.
  • F 파일 — 일반 사항.
  • F·F 파일 — 저작권 정보.