Perl 5.16.0 변경 사항
Perl 5.16.0 변경 사항 (perl5160delta)
이 문서는 Perl 5.14.0 릴리스와 5.16.0 릴리스 사이의 차이를 설명해요.
5.12.0 같은 더 오래된 릴리스에서 업그레이드하는 경우, 5.12.0과 5.14.0 사이의 차이를 설명하는 perl5140delta를 먼저 읽어 보세요.
이 릴리스의 일부 버그 수정은 5.14.x의 이후 릴리스로 백포트되었어요. 그런 것들은 괄호 안에 5.14.x 버전이 표시되어 있어요.
본문
공지 (Notice)
Perl 5.16.0 릴리스와 함께, 5.12.x 시리즈는 지원 기간이 끝났어요. 중요한 보안 이슈가 있는 경우에만 향후 5.12.x 릴리스가 나올 수 있고요. Perl 5.12 이하를 쓰는 분은 더 최신 릴리스로 업그레이드하는 걸 고려해 보세요. 이 정책의 자세한 내용은 perlpolicy의 "MAINTENANCE AND SUPPORT"에 있어요.
핵심 개선 사항 (Core Enhancements)
use 버전
이 릴리스부터, use v5.16 같은 버전 선언은 새 기능 묶음(feature bundle)을 활성화하기 전에 모든 기능을 먼저 끄게 돼요. 다시 말해 다음이 성립해요:
use 5.016;
# 여기서는 5.16 기능만 활성화
use 5.014;
# 여기서는 5.14 기능만 활성화 (5.16은 아님)
use v5.12 이상은 계속해서 strict를 켜지만, 명시적인 use strict와 no strict는 버전 선언보다 앞에 오더라도 이제 버전 선언을 덮어써요:
no strict;
use 5.012;
# 여기서는 strict 없음
어떤 버전 선언이나 use feature가 보이기 전에 활성화되는 기능 집합을 나타내는 새 ":default" 기능 묶음이 생겼어요. 5.10 미만 버전 선언은 이제 ":default" 기능 집합을 켜요. ":default" 집합에 추가된 기능들은 전통적으로 기본으로 켜져 있던 것들이라서, 실제로 use v5.8의 동작이 바뀌지는 않아요.
no feature는 이제 기본 기능 집합으로 리셋해요. 모든 기능을 끄고 싶다면(이름 붙은 의미 집합과 맞지 않을 테니 꽤 특수한 목적의 요청이겠지만) no feature ':all'이라고 쓸 수 있어요.
$[는 이제 use v5.16 아래에서 비활성화돼요. 기본 기능 집합의 일부이며 use feature 'array_base'로 명시적으로 켜고 끌 수 있어요.
__SUB__
새 토큰 __SUB__는 current_sub 기능(feature 참고)이나 use v5.16 아래에서 사용할 수 있으며, 현재 서브루틴에 대한 참조를 돌려줘서 재귀 클로저를 쉽게 작성하게 해 줘요.
새롭고 개선된 내장 함수
더 일관된 eval
eval 연산자는 내부 인코딩에 따라 문자열 인자를 어떤 때는 문자 시퀀스로, 어떤 때는 바이트 시퀀스로 취급해요. 내부 인코딩은 아무 차이를 만들지 않아야 하지만, 이 비일관성에 의존하는 코드가 있어요.
새 unicode_eval과 evalbytes 기능(use 5.16.0 아래에서 활성화)이 이를 해결해요. unicode_eval 기능은 eval $string이 문자열을 항상 유니코드로 취급하게 하고요. evalbytes 기능은 같은 이름의 evalbytes 함수를 제공하는데, 인자를 항상 바이트 문자열로 평가해요.
이 기능들은 소스 필터가 바깥의 동적 스코프로 새는 문제도 고쳐요. 자세한 내용은 feature 문서를 참고하세요.
substr lvalue 재정비
substr가 두 개나 세 개의 인자와 함께 lvalue 또는 잠재적 lvalue 문맥에서 호출되면, 할당될 때 원래 문자열(첫 번째 인자)을 수정하는 특수 lvalue 스칼라를 돌려줘요.
이전에는 substr에 전달된 오프셋(두 번째·세 번째 인자)이 문자열에 맞게 즉시 변환됐어요. 음수 오프셋은 양수로 변환되고, 문자열 끝을 넘는 오프셋은 잘렸죠.
이제 오프셋은 수정 없이 돌려주는 특수 lvalue 스칼라에 기록되고, substr 자신은 원래 문자열을 보지 않아요. 반환된 lvalue를 읽거나 수정할 때만 봐요.
이 변경은 비호환 변경을 낳아요. substr 호출 이후 할당 이전에 원래 문자열의 길이가 바뀌면, 음수 오프셋은 문자열 끝에서의 위치를 기억해서 이런 코드에 영향을 줘요:
my $string = "string";
my $lvalue = \substr $string, -4, 2;
print $$lvalue, "\n"; # "ri" 출력
$string = "bailing twine";
print $$lvalue, "\n"; # "wi" 출력; 이전에는 "il" 출력
세 번째 인자를 생략해도 같은 일이 일어나요. 반환된 lvalue는 문자열이 길어져도 항상 문자열 끝까지 확장돼요.
이 변경으로 많은 버그가 고쳐졌고, 음수 오프셋의 동작은 명세된 적이 없었으므로 수용 가능한 것으로 판단됐어요.
tied의 반환 값
tied 변수에서 tied가 돌려주는 값은 이제 그 변수가 tie된 객체를 담고 있는 실제 스칼라예요. 이 덕분에 Scalar::Util::weaken(tied $tied_variable)로 tie를 약화시킬 수 있어요.
유니코드 지원
(거의) 유니코드 6.1 지원
새 스크립트 전체와 기존 스크립트의 새 문자가 추가된 것 외에도, 이 새 유니코드 버전은 늘 그렇듯 기존 문자를 일부 바꿔요. 몇몇 애플리케이션을 걸려 넘어지게 할 수 있는 변경 하나는, Latin-1 범위의 두 문자 PILCROW SIGN과 SECTION SIGN의 일반 범주(General Category)가 Other_Symbol에서 Other_Punctuation으로 바뀐 거예요. 티베트어, 에티오피아어, 에게 해 문자에도 각각 한 문자씩 같은 변경이 적용됐어요. 코드 포인트 U+3248..U+324F(CIRCLED NUMBER TEN ON BLACK SQUARE부터 CIRCLED NUMBER EIGHTY ON BLACK SQUARE)의 일반 범주도 Other_Symbol에서 Other_Numeric으로 바뀌었고요. Line Break 속성은 히브리어와 일본어에 변경이 있고, 6.1의 다른 변경 때문에 Perl 정규식 구성 \X는 태국어와 라오스어의 일부 문자에서 다르게 동작해요.
많은 속성 값에 새 별칭(동의어)이 정의됐고, 기존 것들과 함께 모두 perluniprops에 교차 색인되어 있어요.
charnames::viacode()의 반환 값도 다른 변경에 영향받아요:
| 코드 포인트 | 옛 이름 | 새 이름 |
|---|---|---|
| U+000A | LINE FEED (LF) | LINE FEED |
| U+000C | FORM FEED (FF) | FORM FEED |
| U+000D | CARRIAGE RETURN (CR) | CARRIAGE RETURN |
| U+0085 | NEXT LINE (NEL) | NEXT LINE |
| U+008E | SINGLE-SHIFT 2 | SINGLE-SHIFT-2 |
| U+008F | SINGLE-SHIFT 3 | SINGLE-SHIFT-3 |
| U+0091 | PRIVATE USE 1 | PRIVATE USE-1 |
| U+0092 | PRIVATE USE 2 | PRIVATE USE-2 |
| U+2118 | SCRIPT CAPITAL P | WEIERSTRASS ELLIPTIC FUNCTION |
Perl은 입력으로 이 이름들 중 아무 것이나 받아들이지만, charnames::viacode()는 이제 각 쌍의 새 이름을 돌려줘요. U+2118의 변경은 유니코드가 교정으로 간주해요(원래 이름이 실수였다는 뜻이죠. 다만 그 이름으로 U+2118을 가리키는 건 영원히 유효해요). 하지만 대부분의 변경은 유니코드 6.0이 일본 휴대폰에 쓰는 문자 이름을 "BELL"로 지은 실수의 여파예요. "BELL"은 오랫동안 업계에서(그리고 유니코드의 권장으로도) U+0007의 ASCII 제어 문자를 뜻하는 데 쓰였거든요. 그래서 그 이름은 v5.14부터 Perl에서 deprecated였고, 어떤 사용이든 (끄지 않는 한) 경고를 일으켜요. "ALERT"가 이제 이 코드 포인트의 선호 이름이고, "BEL"이 받아들일 만한 짧은 형태예요. 코드 포인트 U+1F514의 새 휴대폰 문자의 이름은 이 Perl 버전에서는 여전히 정의되지 않아요(그래서 유니코드 6.1을 완전히 구현하진 않죠). 하지만 v5.18부터 BELL은 U+0007이 아니라 이 문자를 뜻하게 돼요.
유니코드는 이런 실수가 다시 일어나지 않도록 조치를 취했어요. 이제 표준은 제어 문자의 널리 받아들여지는 이름과 약어를 모두 포함해요(이전에는 그러지 않았죠. 대부분에는 Perl이 쓰던 권장 이름이 있었고요). 그래서 권장 이름 대부분이 이제 공식적으로 표준에 들어가요. 유니코드는 위 U+008E와 U+008F 사이 나열된 네 코드 포인트에 대해 이름을 권장하지 않았고, 표준화하면서 Perl이 이전에 준 이름의 마지막 공백을 하이픈으로 바꿔 미묘하게 바꿨어요. 유니코드는 또한 Perl이 deprecated했던 FILE SEPARATOR 같은 이름을 공식적으로 받아들여요. 이제 유일한 deprecated 이름은 BELL이에요. 마지막으로, Perl은 이제 위 목록의 첫 네 코드 포인트(괄호가 있는 것들)에 옛(이제는 구식으로 여겨지는) 이름 대신 새 공식 이름을 써요.
이름이 유니코드 표준에 들어갔으니 이런 변경은 다시 일어나지 않아야 해요. 다만 U+2118 같은 교정은 여전히 가능해요.
유니코드는 또한 이름 약어를 추가했고 Perl이 이제 받아들여요: SPACE는 SP, CHARACTER TABULATION은 TAB, LINE FEED는 NEW LINE·END OF LINE·NL·EOL, SHIFT OUT은 LOCKING-SHIFT ONE, SHIFT IN은 LOCKING-SHIFT ZERO, ZERO WIDTH NO-BREAK SPACE는 ZWNBSP.
이 유니코드 버전의 더 자세한 내용은 http://www.unicode.org/versions/Unicode6.1.0/ 에 있어요.
\N{이름}에 더 이상 use charnames가 필요 없음
\N{이름}을 만나면 :full과 :short 옵션이 지정된 것처럼 charnames 모듈이 필요할 때 자동으로 로드돼요. 자세한 내용은 charnames 문서를 참고하세요.
\N{...}이 이제 유니코드 loose 이름 매칭 지원
이 내용은 아래의 "업데이트된 모듈과 프래그마"의 charnames 항목에 설명돼 있어요.
유니코드 심볼 이름
Perl은 이제 심볼 이름에서 유니코드를 제대로 지원해요. 예전에는 *{$foo}가 내부 UTF8 플래그를 무시하고 밑바탕 표현의 바이트로 심볼을 찾았어요. 그래서 *{"\x{100}"}과 *{"\xc4\x80"}이 같은 걸 돌려줬죠. Perl의 다음 부분들이 유니코드를 고려해 수정됐어요:
- 메서드 이름(
use overload에 전달되는 것 포함) - typeglob 이름(변수·서브루틴·파일핸들 이름 포함)
- 패키지 이름
goto- 심볼릭 역참조
bless()와tie()의 두 번째 인자ref()의 반환 값- 서브루틴 프로토타입
- 속성(attribute)
- 변수 이름·값·메서드 등을 언급하는 각종 경고와 오류 메시지
추가로, *{é}가 이름을 암시적으로 따옴표 처리하지 못하고 *{+é}로 해석돼 strict 위반을 일으키던 파싱 버그가 고쳐졌어요.
*{"*a::b"}는 * 뒤에 ASCII 문자가 오면 자동으로 *를 떼내요. 이게 모든 유니코드 식별자 문자로 확장됐어요.
한 글자짜리 비ASCII 비구두점 변수(예: $é)는 이제 "Used only once" 경고의 대상이 돼요. 예전에는 구두점 변수로 취급되어 면제됐거든요.
또한 한 글자짜리 유니코드 구두점 변수(예: $‰)가 이제 지원돼요 [perl #69032].
로케일과 유니코드(UTF-8 로케일 포함)를 섞는 능력 개선
use locale에 선택 매개변수가 추가됐어요:
use locale ':not_characters';
이건 Perl에게 현재 로케일의 LC_CTYPE과 LC_COLLATE 부분을 제외한 나머지를 쓰라고 말해요. 대신 문자 집합은 유니코드로 간주돼요. 이 덕분에 점점 흔해지는 UTF-8 로케일을 포함해 로케일과 유니코드를 매끄럽게 섞을 수 있어요. 이 혼합 형태의 로케일을 쓸 때는 open 프래그마의 :locale 레이어로 파일시스템과 인터페이스할 수 있고, ARGV와 환경 변수 변환용 CPAN 모듈도 있어요. 전체 세부 사항은 perllocale에 있어요.
유니코드 foldcase용 새 함수 fc와 대응 이스케이프 시퀀스 \F
유니코드 foldcase는 소문자 변환을 확장한 것으로, 두 문자열을 대소문자 구분 없이 비교할 때 더 나은 결과를 줘요. 정규식 </i> 매칭에서 오랫동안 내부적으로 쓰였죠. 이제 새 fc 함수 호출(use feature 'fc' 또는 use v5.16으로 활성화하거나 CORE::fc로 명시 호출)이나 이중 따옴표 문자열의 새 \F 시퀀스로 명시적으로 사용할 수 있어요. 전체 내용은 perlfunc의 fc 항목에 있어요.
유니코드 Script_Extensions 속성 지원
유니코드 6.0에 새로 나온 개선된 Script 속성이에요. 내용은 perlunicode의 Scripts 항목에 있어요.
XS 변경
일부 내장 타입의 typemap 개선
대부분의 XS 작성자는 T_AVREF(AV*), T_HVREF(HV*), T_CVREF(CV*), T_SVREF(SVREF 또는 \$foo)의 OUTPUT typemap에 오래된 버그가 있다는 걸 알 거예요. typemap이 알아서 처리하는 대신 반환 값의 참조 카운트를 수동으로 감소시켜야 하죠. 역호환을 위해 기본 typemap에서 이를 바꿀 수 없어요. 하지만 이 버그가 없는 추가 typemap T_AVREF_REFCOUNT_FIXED 등을 제공해요. 확장에서 쓰는 건 TYPEMAP 섹션에 한 줄만 넣으면 돼요:
HV* T_HVREF_REFCOUNT_FIXED
is_utf8_char()
XS 호출 가능 함수 is_utf8_char()는 잘못된 UTF-8 입력을 받으면 문자열 끝을 넘어 최대 12바이트까지 읽을 수 있어요. API를 바꾸지 않고는 고칠 수 없어서, 이제 사용이 deprecated예요. 대신 (바로 아래 설명하는) is_utf8_char_buf()를 쓰세요.
is_utf8_char_buf() 추가
이 함수는 deprecated된 is_utf8_char()를 대체하도록 설계됐어요. 입력 버퍼 끝을 넘어 읽지 않도록 보장하는 추가 매개변수가 있어요.
기타 is_utf8_foo() 함수, 그리고 utf8_to_foo() 등
UTF-8로 인코딩된 입력을 받는 대부분의 다른 XS 호출 가능 함수들은 버퍼 길이에 관해 UTF-8이 유효하다고(잘못되지 않았다고) 암묵적으로 가정해요. 문자 대소문자를 바꾸거나 알파벳·숫자인지 확인하기 전에 유효한 UTF-8인지 먼저 확인하지 마세요. 전체 문자열에 대해 안전하게 하는 건 is_utf8_string(), is_utf8_string_loc(), is_utf8_string_loclen() 중 하나를 쓰는 거예요.
새 Pad API
어휘 pad를 조작하는 많은 새 함수가 API에 추가됐어요. 자세한 내용은 perlapi의 "Pad Data Structures"를 참고하세요.
특수 변수 변경
$$에 할당 가능
$$는 Perl 5.8.0에서 읽기 전용이 됐어요. 하지만 항상 그런 건 아니었죠: local $$는 다시 쓸 수 있게 만들었어요. 일부 CPAN 모듈은 local $$나 XS 코드로 읽기 전용 검사를 우회하고 있었으므로, $$를 읽기 전용으로 유지할 이유가 없어요. (이 변경은 역호환을 유지하면서 버그 수정도 가능하게 했어요.)
$^X가 FreeBSD·OS X·Solaris에서 절대 경로로 변환
$^X는 이제 OS X, FreeBSD(F 마운트 불필요), Solaris 10·11에서 절대 경로로 변환돼요. 이건 Linux·FreeBSD·NetBSD에서 F을 쓰던 이전 방식을 보강해요(마운트된 경우 전부).
이 덕분에 이 플랫폼들에서 재배치 가능한(relocatable) perl 설치가 더 유용해져요. (INSTALL의 "Relocatable @INC" 참고)
디버거 변경
디버거 안의 기능
대화형 디버거에 입력한 명령에 대해 현재 Perl의 feature 묶음이 활성화돼요.
디버거 t 명령의 새 옵션
추적 모드를 토글하는 디버거의 t 명령은 이제 추적할 서브루틴 호출 깊이를 정하는 숫자 인자를 받아요.
enable과 disable
디버거는 이제 기존 중단점을 비활성화하고 다시 활성화하는 disable과 enable 명령이 있어요. perldebug 참고.
파일 이름 있는 중단점
중단점을 설정하는 디버거의 b 명령은 이제 줄 번호 앞에 파일 이름을 붙일 수 있어요. perldebug의 "b [file]:[line] [condition]" 참고.
CORE 네임스페이스
CORE:: 접두사
CORE:: 접두사는 이제 use feature 범위 밖에서도 feature.pm이 활성화하는 키워드에 쓸 수 있어요.
CORE 네임스페이스의 서브루틴
많은 Perl 키워드가 이제 CORE 네임스페이스의 서브루틴으로 사용 가능해요. 이 덕분에 별칭을 붙일 수 있어요:
BEGIN { *entangle = \&CORE::tie }
entangle $variable, $package, @args;
그리고 프로토타입을 우회할 수도 있어요:
sub mytie(\[%$*@]$@) {
my ($ref, $pack, @args) = @_;
... do something ...
goto &CORE::tie;
}
이 중 일부는 참조나 &foo 문법으로 호출할 수 없고 bareword로 호출해야 해요. 자세한 내용은 CORE 문서 참고.
기타 변경
익명 핸들
자동 생성된 파일 핸들은 이제 변수 이름을 정할 수 없을 때 $__ANONIO__ 대신 __ANONIO__로 이름 지어져요.
자동 로드된 sort 서브루틴
커스텀 sort 서브루틴이 이제 자동 로드될 수 있어요 [perl #30661]:
sub AUTOLOAD { ... }
@sorted = sort foo @list; # AUTOLOAD 사용
continue가 더 이상 "switch" 기능을 요구하지 않음
continue 키워드는 두 의미가 있어요. 루프 뒤에 continue 블록을 도입하거나, 현재 when 블록을 빠져나갈 수 있죠. 지금까지 두 번째 의미는 "switch" 기능이 활성화된 경우에만 유효했고, 그 외에는 문법 오류였어요. feature.pm의 주요 목적이 사용자 정의 서브루틴과의 충돌을 피하는 것이므로, continue가 여기에 의존할 이유가 없어요.
인터프리터 단계 변경용 DTrace 프로브
인터프리터의 단계가 바뀌면 phase-change 프로브가 발화하며, 이는 ${^GLOBAL_PHASE} 변수를 추적해요. arg0은 새 단계 이름, arg1은 옛 단계 이름이에요. 이는 계측을 컴파일 시간·실행 시간·소멸 시간 중 하나 이상으로 제한하는 데 유용해요.
__FILE__() 문법
__FILE__, __LINE__, __PACKAGE__ 토큰 뒤에 이제 빈 괄호 쌍을 붙일 수 있어요. 이렇게 하면 time, fork 등의 내장 함수처럼 파싱돼요.
\$ 프로토타입이 어떤 스칼라 lvalue든 받아들임
\$과 \[$] 서브루틴 프로토타입은 이제 어떤 스칼라 lvalue 인자든 받아들여요. 이전에는 $로 시작하는 스칼라와 해시·배열 요소만 받았어요. 이 변경은 내장 read·recv 함수(등)가 인자를 파싱하는 방식과 일관되게 해요. 즉 내장 함수를 같은 방식으로 인자를 파싱하는 커스텀 서브루틴으로 덮어쓸 수 있다는 뜻이에요.
서브루틴 프로토타입의 _
서브루틴 프로토타입의 _ 문자가 이제 @ or % 앞에 허용돼요.
보안 (Security)
is_utf8_char_buf()를 쓰고 is_utf8_char()은 쓰지 마세요
후자는 API가 입력 문자열 끝을 넘어 (최악의 경우 최대 12바이트) 읽지 않도록 보장하기에 부족해서 이제 deprecated예요.
잘못된 UTF-8 입력이 버퍼 끝을 넘어 읽게 할 수 있었음
이를 막기 위해 두 개의 새 XS 접근 가능 함수 utf8_to_uvchr_buf()와 utf8_to_uvuni_buf()가 제공되고, Perl 코어가 이를 쓰도록 변환됐어요.
File::Glob::bsd_glob()의 GLOB_ALTDIRFUNC 관련 메모리 오류 (CVE-2011-2728)
지원되지 않는 플래그 GLOB_ALTDIRFUNC로 File::Glob::bsd_glob을 호출하면 접근 위반/세그폴트가 발생했어요. 외부 소스의 플래그 값을 받아들이는 Perl 프로그램은 서비스 거부나 임의 코드 실행 공격에 노출될 수 있었죠. 알려진 실제 익스플로잇은 없어요. 지원되지 않는 모든 플래그를 명시적으로 비활성화하고 미사용 함수 포인터를 null로 설정해 문제를 고쳤어요. Clément Lecigne가 버그를 보고했어요. (5.14.2)
$(에 할당할 때 권한이 이제 올바르게 설정됨
$(를 설정할 때 유효 그룹 ID를 잘못 설정하던 가상의 버그(실제로는 아마 익스플로잇 불가)가 고쳐졌어요. 그 버그는 setresgid()는 있지만 setregid()는 없는 시스템에만 영향줬을 텐데, 그런 시스템은 알려져 있지 않아요.
Deprecations
F<lib/unicore>의 유니코드 데이터베이스 파일을 읽지 마세요
유니코드 데이터베이스 파일을 직접 읽는 건 이제 deprecated예요. 이 파일들은 F<lib/unicore> 디렉터리에 저장돼요. 대신 Unicode::UCD의 새 함수들을 쓰세요. 이 함수들은 안정적인 API를 제공하고 완전한 정보를 줘요.
Perl은 언젠가 이 파일들을 바꾸거나 제거할 수 있어요. 애플리케이션이 가장 썼을 법한 파일은 F<lib/unicore/ToDigit.pl>이에요. 그 데이터는 Unicode::UCD의 prop_invmap()으로 얻을 수 있어요.
XS 함수 is_utf8_char(), utf8_to_uvchr(), utf8_to_uvuni()
이 함수들은 입력 문자열 끝을 넘어 읽을 수 있어 deprecated예요. 대신 새 is_utf8_char_buf(), utf8_to_uvchr_buf(), utf8_to_uvuni_buf()를 쓰세요.
향후 Deprecations (Future Deprecations)
이 섹션은 다음 perl 릴리스(5.18.0)에서 제거되거나 deprecated될 가능성이 있는 기능을 알리는 공지예요. 이 기능들에 의존하는 코드가 있다면 Perl 5 Porters 메일링 리스트나 perlbug로 사용 사례를 설명하고 deprecation 절차에 알려 줘야 해요.
핵심 모듈
이 모듈들은 코어에서 deprecated로 표시될 수 있어요. 이는 더 이상 코어 배포판과 함께 기본으로 설치되지 않는다는 뜻일 뿐이며, CPAN에서는 계속 사용할 수 있어요.
- CPANPLUS
- Filter::Simple
- PerlIO::mmap
- Pod::LaTeX
- Pod::Parser
- SelfLoader
- Text::Soundex
- Thread.pm
지원 프로그래머가 없는 플랫폼
이 플랫폼들은 5.17.0 개발 시리즈 동안 특수 빌드 지원이 제거될 가능성이 높아요.
- BeOS
- djgpp
- dgux
- EPOC
- MPE/iX
- Rhapsody
- UTS
- VM/ESA
기타 향후 Deprecations
$<와$>교환 — 자세한 내용은 관련 RT 티켓 참고.- sfio, stdio — Perl은 PerlIO를 제대로 없이 stdio나 sfio 래퍼를 써서 빌드되는 걸 지원해요. 이런 빌드는 IO 레이어와 유니코드 IO를 지원하지 않아 상당히 불리해요. PerlIO는 stdio 사용을 원하면
stdio레이어를 지원하고, 비슷하게 sfio 레이어도 만들 수 있어요. - 정규식의 이스케이프되지 않은 리터럴
"{"— v5.20부터 리터럴"{"를 이스케이프(예: 백슬래시 앞에 붙이기)해야 할 계획이에요. v5.18에서는 이런 모든 사용에 deprecated 경고가 발생해요. 이는 리터럴"{"와 매치하려는 패턴에만 영향을 줘요. 아래처럼 수량자나 시퀀스의 일부로 쓰이는 다른 용도는 전혀 영향받지 않아요:
/foo{3,5}/
/\p{Alphabetic}/
/\N{DIGIT ZERO}
이를 제거하면 Perl 패턴 문법의 확장과 기존 문법의 더 나은 오류 검사가 가능해져요.
- 이중 따옴표 문자열에서 다른 이스케이프와 결합될 때
"\Q"의미 개편 —\Q...\E쌍 안에서\Q와\x,\L등의 조합에 여러 버그와 비일관성이 있어요. 이들을 고쳐야 하고, 그러려면 현재 동작을 바꿔야 해요. 변경은 아직 확정되지 않았어요.
비호환 변경 (Incompatible Changes)
void 문맥에서 호출되는 특수 블록
특수 블록(BEGIN, CHECK, INIT, UNITCHECK, END)은 이제 void 문맥에서 호출돼요. 이는 마지막 문의 결과를 낭비적으로 복사하는 걸 피해요 [perl #108794].
overloading 프래그마와 regexp 객체
no overloading에서 qr//가 돌려주는 정규식 객체는 이제 정규식 자체 대신 "Regexp=REGEXP(0xbe600d)"처럼 문자열화돼요 [perl #108780].
두 XS typemap 항목 제거
아마 사용되지 않는 두 XS typemap 항목이 코어 typemap에서 제거됐어요: T_DATAUNIT과 T_CALLBACK. 만에 하나 이들을 쓰는 사용자라면 perlxstypemap에서 복원 방법을 참고하세요.
유니코드 6.1이 유니코드 6.0과 비호환
이 내용은 위 "유니코드 6.1 지원"에서 자세히 설명돼 있어요. 이 Perl 버전을 컴파일해서 유니코드 6.0을 쓰게 할 수 있어요.
Borland 컴파일러
Borland 컴파일러에 대한 모든 지원이 중단됐어요. 코드는 어차피 오랫동안 동작하지 않았어요.
일부 deprecated 유니코드 속성이 더 이상 기본 지원 안 됨
Perl은 유니코드가 내부적으로 쓰고 공개용이 아닌 일부 유니코드 속성을 노출해서는 안 됐어요. 이 사용은 Perl 5.12부터 deprecated 경고를 발생시켰어요. 제거된 속성은 Other_Alphabetic, Other_Default_Ignorable_Code_Point, Other_Grapheme_Extend, Other_ID_Continue, Other_ID_Start, Other_Lowercase, Other_Math, Other_Uppercase예요.
Perl을 재컴파일해서 그중 일부나 전부를 포함하게 할 수 있어요. 지침은 perluniprops의 "Unicode character properties that are NOT accepted by Perl"에 있어요.
IO thingies를 typeglob으로 역참조
*{...} 연산자는 IO 객체에 대한 참조(예: *{*STDIN{IO}})를 받으면 그 IO 객체만 담은 새 typeglob을 만들어요. 이전에는 빈 문자열로 문자열화됐지만, 일부 연산자는 undefined로 취급해 "uninitialized" 경고를 냈어요. 이제 __ANONIO__로 문자열화돼요 [perl #96326].
사용자 정의 대소문자 변경 연산
이 기능은 Perl 5.14에서 deprecated됐고 이제 제거됐어요. CPAN 모듈 Unicode::Casing이 이 기능이 가졌던 단점 없이 더 나은 기능을 제공해요.
XSUB이 이제 'static'
XSUB C 함수는 이제 'static', 즉 컴파일 단위 밖에서 보이지 않아요. 사용자는 새 XS_EXTERNAL(name)과 XS_INTERNAL(name) 매크로로 원하는 링킹 동작을 고를 수 있어요. XSUB의 일반 XS(name) 선언은 역호환을 위해 non-'static' XSUB을 계속 선언하지만, XS 컴파일러 ExtUtils::ParseXS(xsubpp)는 기본으로 'static' XSUB을 생성할 거예요. ExtUtils::ParseXS의 동작은 XS에서 EXPORT_XSUB_SYMBOLS 키워드로 재구성할 수 있어요. 자세한 내용은 perlxs 참고.
읽기 전용 참조 약화
읽기 전용 참조를 약화(weaken)하는 건 더 이상 허용되지 않아요. 어차피 동작하지 않아야 했고, 때로는 크래시를 일으킬 수 있었어요.
typeglob을 담는 스칼라 tie하기
typeglob이 할당된 후 스칼라를 tie하려고 하면 그 대신 typeglob의 IO 슬롯에 있는 핸들이 tie됐어요. 즉 스칼라 자체를 tie하는 게 불가능했죠. 비슷한 문제가 tied와 untie에도 영향줬어요.
이 문제는 Perl 5.14.0 전에 고쳤지만 일부 CPAN 모듈에 문제를 일으켜 deprecation 주기를 넣었어요.
이제 deprecation이 제거되고 버그가 고쳐졌어요. 그래서 tie $scalar는 이제 담고 있는 핸들이 아니라 항상 스칼라를 tie해요. 핸들을 tie하려면 명시적 별표와 함께 tie *$scalar를 쓰세요. tied *$scalar와 untie *$scalar에도 같게 적용돼요.
IPC::Open3이 더 이상 xfork(), xclose_on_exec(), xpipe_anon()을 제공하지 않음
세 함수 모두 private·비문서화·비엑스포트였어요. CPAN의 어떤 코드에도 쓰이지 않는 것 같아요. 두 개는 인라인되었고 하나는 완전히 삭제됐어요.
$$가 더 이상 PID를 캐시하지 않음
이전에는 C에서 fork(3)을 호출하면 Perl의 $$ 관념이 getpid()가 돌려주는 값과 어긋날 수 있었어요. 항상 getpid()로 $$ 값을 가져옴으로써 이 잠재적 버그가 제거됐어요. 캐시 동작에 의존하던 코드는 깨질 거예요. $$는 이제 쓸 수 있지만 fork 중에는 리셋돼요.
$$와 getppid()가 더 이상 LinuxThreads 아래에서 POSIX 의미를 흉내내지 않음
구식 LinuxThreads 구현 아래의 $$와 getppid() POSIX 에뮬레이션이 제거됐어요. 이는 Linux 2.4 사용자와 6.0까지의 Debian GNU/kFreeBSD 사용자에게만 영향주고, NPTL 스레드를 쓰는 대부분의 Linux 설치는 영향받지 않아요.
즉 getppid()는 $$처럼 이제 항상 OS가 보는 현재 프로세스 상태를 돌려주도록 보장되고, perl의 캐시 버전을 돌려주지 않아요.
$<, $>, $(, $)가 더 이상 캐시되지 않음
$$와 getppid()의 변경처럼, $<, $>, $(, $)의 내부 캐싱이 제거됐어요.
이전에는 이 값들을 캐시할 때, 누군가(예: perl을 임베드하는 사람) PL_e?[ug]id를 갱신하지 않고 sete?[ug]id()를 호출하면 우리의 관념이 현실과 어긋났어요. gete?[ug]id() 시스템 콜이 저렴한데 이 복잡성을 다룰 가치가 없었어요.
이 변경은 XS 수준 PL_uid, PL_gid, PL_euid, PL_egid 변수를 쓰는 소수의 CPAN 모듈을 깨뜨려요.
깨진 모듈의 해결책은 PerlProc_gete?[ug]id()(예: PerlProc_getuid())로 값을 검색하고, UID/GID/EUID/EGID를 바꾸면 PL_e?[ug]id에 할당하지 않는 거예요. perl이 항상 OS에서 최신 값을 검색하므로 더 이상 그럴 필요가 없어요.
quotemeta와 \Q가 따옴표 처리하는 비ASCII 문자가 바뀜
Perl이 어떤 비ASCII 문자에도 특별한 의미를 붙이지 않으므로 실제 문제가 될 가능성이 낮아요. 현재는 어떤 게 따옴표 처리되든 말든 무관하거든요. 이 변경은 버그 [perl #77654]를 고치고 Perl의 동작을 유니코드 권장사항에 더 부합하게 해요. perlfunc의 quotemeta 참고.
성능 개선 (Performance Enhancements)
- 정규식의 유니코드 속성 성능 개선 — 코드 포인트를 유니코드 속성과 매치하는 게 이제 선형 대신 이진 탐색으로 이뤄져요. 1000개 항목 속성의 최악의 경우 1000번 대신 10번 프로브를 하게 되는 셈이죠. 이전에는 프로브 결과와 인접 64개 코드 포인트의 결과를 해시에 영구 저장해 비효율을 보완했고, 각 정규식에서 유니코드 속성이 언급될 때마다 별도 해시를 썼어요. 그래서
qr/\p{foo}abc\p{foo}/는 두 해시를 만들었죠. 이제 주어진 속성의 모든 인스턴스가 공유하는 해시가 하나만 있어요. use키워드의 버전 선언(예:use 5.012)이 이제 더 빠름 — F<feature.pm>을 로드하지 않고 기능을 켜기 때문이에요.local $_가 이제 더 빠름 — 어차피 복사하지 않을 magic을 더 이상 순회하지 않기 때문이에요.- 빈
DESTROY메서드 최적화 확장 — Perl 5.12.0은 빈DESTROY메서드를 호출하지 않음으로써 속도를 올렸어요. 이 릴리스는return문으로 시작하는 어떤DESTROY메서드도 호출하지 않음으로써 한 발 더 나아가요:
use constant DEBUG => 1;
sub DESTROY { return unless DEBUG; ... }
상수 폴딩이 DEBUG가 0이면 첫 문장을 return;으로 줄여 이 최적화를 발화시켜요.
- typeglob이나 copy-on-write 스칼라를 담는 변수에 할당하는 게 훨씬 빨라짐 — 이전에는 덮어쓰기 전에 typeglob을 문자열화하거나 copy-on-write 스칼라를 복사했거든요.
- void 문맥에서
substr에 할당하는 게 이전보다 두 배 이상 빠름 — 특수 lvalue 스칼라를 만들어 반환하는 대신,substr이 원래 문자열 자체를 수정해요. substr이 void 문맥에서 호출될 때 돌려줄 값을 더 이상 계산하지 않음.File::Glob변경 덕분에 Perl의glob함수와<>등가가 훨씬 빨라짐. 패턴을 단어로 나누는 작업이 C로 다시 쓰여 일부 경우 20% 빨라짐. VMS는 File::Glob을 쓰지 않으므로glob에 영향 없어요.&&,||,//단락 연산자가 체인(예:$a || $b || $c)에서 줄어든 optree 순회 덕분에 단락이 상당히 빨라짐.s///r구현이 스칼라 값을 한 번 더 적게 복사함.- lvalue 스칼라 문맥에서 lvalue 서브루틴에 대한 재귀 호출이 메모리를 덜 씀.
모듈과 프래그마 (Modules and Pragmata)
Deprecated 모듈
Version::Requirements— 이제 DEPRECATED이며, 대체로CPAN::Meta::Requirements를 쓰세요. v5.17.0에서 perl.git blead에서 삭제될 거예요.
새 모듈과 프래그마
arybase—$[변수를 구현하는 새 모듈.PerlIO::mmap0.010이 Perl 코어에 추가 —mmapPerlIO 레이어를 더 이상 perl 자체가 구현하지 않고 새PerlIO::mmap모듈로 옮겼어요.
업데이트된 모듈과 프래그마
전체 업데이트 목록이 아니라 선택된 모듈 업데이트의 개요예요. 전체 목록은:
$ corelist --diff 5.14.0 5.16.0
5.14.0 대신 좋아하는 버전을 넣을 수 있어요. 개요로 주요 모듈을 정리하면:
Archive::Extract0.48 → 0.58. FreeBSD 9.0이 F</usr/bin>에 제한된unzip을 동봉하므로, FreeBSD에서unzip이 F</usr/local/bin>에 있을 때만 쓰도록 고치는 수정 포함.Archive::Tar1.76 → 1.82. 8GB(>0777777777777 8진수)보다 큰 파일 처리를 위한 조정과, 아카이브 파일의 MD5SUM을 돌려주는 기능.base2.16 → 2.18. 로드한 모듈이$VERSION을 정의하지 않을 때base가 더 이상 모듈의$VERSION을 "-1"로 설정하지 않음. "-1"은UNIVERSAL::VERSION이 내부적으로 쓰는 새 "lax" 기준 아래에서 유효한 버전 번호가 아니기 때문이에요.base는 더 이상 이미 로드한 모듈을 건너뛰지 않고require가%INC를 검사하도록 맡겨요. 이건%INC를 비워 모듈을 재로드하게 하는 코드와base를 함께 쓸 때 버그를 고쳐요.Carp1.20 → 1.26. 마지막으로 읽은 파일핸들 정보를 포함하고,die의 오류처럼 파일과 줄 번호 뒤에 점을 찍어요 [perl #106538].charnames1.18 → 1.30. 새 옵션:loose로 호출할 수 있는데, 기존:full옵션과 같지만 유니코드 loose 이름 매칭을 켜요. 내용은charnames의 "LOOSE MATCHES"에 있어요.B::Deparse1.03 → 1.14. 수많은 deparsing 버그 수정.CGI3.52 → 3.59. CGI::Fast에서 공개되고 문서화된 FCGI.pm API를 사용해요. CGI::Fast는 10년 넘게 deprecated되고 문서에서 제거된 FCGI API를 쓰고 있었어요. FCGI >= 0.70 또는 FCGI <= 0.73과 함께 이 deprecated API를 쓰면 보안 이슈가 생겨요 (CVE-2011-2766). 코드를 깨뜨릴 수 있는 것:url()이path=>1또는path_info=>1플래그로 명시 요청하면PATH_INFO를 돌려주도록 고쳐짐. mod_rewrite 아래에서self_url()을 호출하거나url()을 호출하며path_info=>1을 넘기면 이제 실제로PATH_INFO를 돌려줌. 이 버그는 2005년 12월 3.12 릴리스에서 생겨서 애플리케이션이 이에 의존하거나 우회하게 됐을 수 있어요. 업그레이드 전에 확인하세요. Content-Length가 설정되지 않으면 더 이상 STDIN을 읽지 않아, Content-Length 없는 요청이 때때로 멈추는 걸 방지해요. 이는 CGI RFC 3875 및 CGI::Simple과 일관돼요. 추가로 DELETE HTTP 동사가 이제 지원돼요.Compress::Zlib2.035 → 2.048. IO::Compress::Zip과 IO::Uncompress::Unzip이 LZMA(메서드 14)를 지원하고, IO::Compress::Unzip의 CRC 이슈 수정, Streamed Stored 문맥 지원, 콘텐츠 크기가 정확히 0xFFFFFFFF일 때 IO::Compress::Zip의 Zip64 이슈 수정.Digest::SHA5.61 → 5.71. addfile 메서드와 shasum에 BITS 모드 추가. 파일/STDIN을 통한 부분 바이트 입력이 가능해지고, 이전에는 특수 프로그래밍이 필요했던 8074개 NIST Msg 벡터 전부를 shasum으로 검사할 수 있어요.Encode2.42 → 2.44. 빠진 별칭 추가, 깊은 재귀 오류 수정, 다양한 문서 업데이트. Unicode.xs의 'decode_xs n-byte heap-overflow' 보안 버그(CVE-2011-2939) 해결. (5.14.2)ExtUtils::CBuilder0.280203 → 0.280206. CFLAGS와 LDFLAGS를 Config.pm 대응에 덧붙여요.ExtUtils::ParseXS2.2210 → 3.16. XS 컴파일러xsubpp뒤의 모듈 대부분이 재작성·정리됨. 더 확장 가능해졌고 이제 마침내 strictures를 써요. typemap 로직은 별도 모듈ExtUtils::Typemaps로 옮겨졌어요.File::Glob1.12 → 1.17. Windows에서 물결표(~) 확장이 이제HOME다음으로USERPROFILE환경 변수를 검사해요. 새:bsd_globexport 태그가:glob을 대체하려고 생겼어요.:glob처럼 glob 패턴을 단어로 나누지 않는 함수로glob을 덮어쓰지만,:glob과 달리 스칼라 문맥에서 마지막 파일을 돌려주는 대신 제대로 반복해요.FindBin1.50 → 1.51. 경로에 현재 스크립트와 같은 이름의 실행 가능한 스크립트가 있어도 더 이상 잘못된 결과를 돌려주지 않음.HTTP::Tiny0.012 → 0.017.$ENV{http_proxy}로 기본 프록시 호스트를 설정하는 지원 추가. 모든 일반 HTTP 동사의 추가 단축 메서드, x-www-form-urlencoded 데이터를 POST하는post_form()메서드,www_form_urlencode()유틸리티 메서드 추가.IO1.25_04 → 1.25_06,IO::Handle1.31 → 1.33. IO::Handle의getline·getlines메서드 문제 수정. 특수 ARGV 핸들에서 이 메서드들을 호출하면 내장<>·readline처럼 다음 파일이 자동으로 열리지만, 내장과 달리 호출자의open프래그마 사용을 존중하지 않고 새로 연 파일에 적절한 I/O 레이어를 적용하지 않았어요 [rt.cpan.org #66474].IPC::Cmd0.70 → 0.76. MSWin32에서IPC::Run없이IPC::Open3을 사용한 명령 출력(STDOUT·STDERR) 캡처 지원.IPC::Open31.09 → 1.12.*STDIN,*STDOUT,*STDERR가 localize되었을 때 Windows에서open3사용을 막던 버그 수정. Windows에서 숫자 파일 디스크립터를 복제하지 못하게 하던 버그 수정. 프로그램 이름에 "-"를 쓴open3이 다시 동작. (1.06에서 깨졌고, 그래서 Perl 5.14.0에서도) [perl #95748]Locale::Codes3.16 → 3.21. IANA 언어 레지스트리에 정의된 Language Extension 코드(langext)와 Language Variation 코드(langvar) 추가. ISO 639-5 언어 코드 추가. IANA 언어 서브태그 레지스트리의 언어/스크립트 코드 추가. 미초기화 값 경고 수정 [rt.cpan.org #67438]. all_XXX_codes·all_XXX_names 함수의 반환 값 수정 [rt.cpan.org #69100]. 더 명확한 향후 추가를 위해 모듈을 Locale::MODULE에서 Locale::Codes::MODULE로 재구성. 원래 네 모듈(Locale::Language, Locale::Currency, Locale::Country, Locale::Script)은 계속 동작하지만, 모든 새 코드 집합은 Locale::Codes 네임스페이스에 추가됨. code2XXX, XXX2code, all_XXX_codes, all_XXX_names 함수가 이제 retired 코드를 지원. 모든 코드셋을 상수나 이름으로 지정 가능. 이전에는 상수로만 지정했어요. alias_code 함수는 역호환용. rename_country_code로 대체됐고 2013년 9월 이후 제거될 예정. 모든 작업이 이제 중앙 모듈(Locale::Codes)에서 수행. ISO 639-5에 정의된 Language Family 코드(langfam) 추가.Math::BigFloat1.993 → 1.997.numify메서드가 문자열 대신 정규화된 Perl 숫자(0 + $thing의 결과)를 돌려주도록 고쳐짐 [rt.cpan.org #66732].Math::BigInt1.994 → 1.998.babs메서드를 보완하는 새bsgn메서드 제공. 내부objectify함수의 "foreign objects" 처리를 적절한 클래스(Math::BigInt 또는 Math::BigFloat)로 변환하도록 수정.Math::BigRat0.2602 → 0.2603. -1/2를 담는 Math::BigRat 객체에int()를 쓰면 -0이 아니라 0을 담는 Math::BigInt를 만듦. Math::BigInt는 음의 영조차 지원하지 않아서 결과 객체가 실제로 잘못됐었어요 [perl #95530].Math::Complex1.56 → 1.59,Math::Trig1.2 → 1.22. 올바른 복사 생성자 사용, 숫자 형식 지정자로 polarwise 포맷 수정, 더 안정적인great_circle_direction알고리듬.Module::CoreList2.51 → 2.66.corelist유틸리티가 Perl 릴리스 날짜를 표시하는-r옵션과 두 perl 배포판 사이 modlib 변경 집합을 출력하는--diff옵션 이해.Module::Metadata1.000004 → 1.000009.provides메서드가 CPAN META provides 데이터 구조를 올바르게 생성하도록 추가.package_versions_from_directory사용은 권장되지 않아요.ODBM_File1.10 → 1.12. XS 코드가PERL_NO_GET_CONTEXT로 컴파일되어 ithreads에서 성능에 도움.open1.08 → 1.10.:std지시문 없이 호출될 때 표준 핸들의 레이어를 더 이상 끄지 않음. 반대로:std지시문과 함께 호출되면 STDIN·STDOUT뿐 아니라 STDERR에서도 새 레이어를 적용하기 전에 레이어를 지워요 [perl #92728].overload1.13 → 1.18.overload::Overloaded가 더 이상 클래스에서can을 호출하지 않고, 객체가 오버로딩을 가졌는지 다른 수단으로 판단해요. 오버로딩은 AUTOLOAD를 존중하지 않으므로can호출은 절대 옳지 않았어요. 그래서 메서드를 자동 로드하고can을 구현하는 클래스가 더 이상 오버로딩을 고려할 필요 없음 [perl #40333]. 잘못된 인자에 경고가 생성돼요.PerlIO::scalar0.11 → 0.14. (open $fh, '>', \$scalar을 구현하는 모듈.)$scalar가 copy-on-write 스칼라일 때open my $fh, ">", \$scalar가 동작하지 않는 문제 수정. (5.14.2)$scalar에 typeglob이 할당됐을 때readline이나<$fh>에서 발생하는 hang 수정 [perl #92258].seek중$scalar가 내부적으로 문자열이라고 더 이상 가정하지 않음. 내부 print 루틴이seek이 설정한 위치가 유효하다고 더 이상 가정하지 않고, 문자열을 그 위치로 확장하며 (옛 길이와 seek 위치 사이) 중간 바이트를 null로 채워요 [perl #78980]. 메모리 내 핸들에 출력하는 게$scalar가 참조를 담고 있으면 동작하고, 수정 전에 참조를 문자열화해요.$scalar가 내부적으로 숫자를 담고 있지만 문자열 버퍼는 없으면 더 이상 크래시하지 않음. 정규식 엔진을 혼란시키는 스칼라를 더 이상 만들지 않음 [perl #108398].Pod::Functions1.04 → 1.05. F<Functions.pm>이 이제 perl 빌드 시 F<perlfunc.pod>의 주석에서 생성돼Pod::Functions와perlfunc의 동기화를 보장해요.Pod::Html1.11 → 1.1502. 내부에서Pod::Simple을 쓰도록 광범위하게 재작성됨. 출력이 크게 바뀜.Pod::Perldoc3.15_03 → 3.17. VMS에서 검색 경로 수정 [perl #90640]. (5.14.1)-v옵션이 이제$0의 올바른 섹션을 가져옴. 수많은 주요 수정 포함.POSIX1.24 → 1.30. 더 이상AutoLoader를 쓰지 않음. 모듈의 Perl 코드가 상당히 단순화되어 기능 변화 없이 줄 수가 약 절반으로 줄었어요. XS 코드가 리팩터링되어 공유 객체 크기가 기능 변화 없이 약 12% 줄었어요. 더 많은 POSIX 함수에 테스트가 생김.sigsuspend와pause가 이제 반환하기 전에 시그널 핸들러를 실행해요 — 이 두 함수의 요점이 시그널이 도착할 때까지 기다린 다음 발화된 후에 반환하는 것이기 때문이죠. 지연("safe") 시그널이 이를 막고 있어 경쟁 조건이 생길 수 있었어요 [perl #107216].POSIX::sleep는 이제CORE::sleep의 Perl 래퍼 대신 기반 OSsleep함수를 직접 호출.POSIX::dup2는 이제 Win32에서 올바른 값(파일 디스크립터)을 돌려줌.POSIX::SigSet의sigsuspend·sigpending과POSIX::pause가 호출자에게 반환하기 직전에 safe 시그널을 즉시 디스패치.POSIX::Termios::setattr이 이제 세 번째 인자 기본을 0 대신TCSANOW로 설정. 대부분 플랫폼에서TCSANOW는 0으로 정의되지만 일부에서 0은 유효한 매개변수가 아니라 기본값 호출이 실패했어요.Socket1.94 → 2.001. IPv6 소켓 처리를 위한 새 함수·상수:
pack_ipv6_mreq
unpack_ipv6_mreq
IPV6_ADD_MEMBERSHIP
IPV6_DROP_MEMBERSHIP
IPV6_MTU
IPV6_MTU_DISCOVER
IPV6_MULTICAST_HOPS
IPV6_MULTICAST_IF
IPV6_MULTICAST_LOOP
IPV6_UNICAST_HOPS
IPV6_V6ONLY
Storable2.27 → 2.34. freezing·thawing 시 copy-on-write 스칼라를 더 이상 읽기 전용 스칼라로 바꾸지 않음.Sys::Syslog0.27 → 0.29. 많은 미해결 버그 해결.Term::ANSIColor3.00 → 3.01. 어떤 초기 참조든 색 목록으로 해석하지 않고 초기 배열 참조만 색 목록으로 해석해, 문자열화가 정의된 객체에서 colored 함수가 제대로 동작하게 함.Term::ReadLine1.07 → 1.09. 미공개 이벤트 루프와 단순IO::Select를 포함해 어떤 이벤트 루프든 기존 코드를 특정 프레임워크용으로 재작성할 필요 없이 지원 [perl #108470].threads::shared1.37 → 1.40. 공유 데이터 구조로만 참조되는 객체의 소멸자가 때때로 무시되던 문제가 대부분 수정. 다만 전역 소멸 시점에 객체가 여전히 존재하면 소멸자가 계속 무시될 수 있어요 [perl #98204].Unicode::Collate0.73 → 0.89. CLDR 1.9.1로 업데이트. 로케일이 CLDR 2.0으로 업데이트: mk, mt, nb, nn, ro, ru, sk, sr, sv, uk, zh__pinyin, zh__stroke. 새로 지원되는 로케일: bn, fa, ml, mr, or, pa, sa, si, si__dictionary, sr_Latn, sv__reformed, ta, te, th, ur, wae. ja, ko, zh__big5han, zh__gb2312han, zh__pinyin, zh__stroke 로케일용으로 조정된 호환 ideograph와 통합 ideograph. F<Locale/*.pl> 파일을 이제 @INC에서 검색.Unicode::Normalize1.10 → 1.14. F<unicore/CompositionExclusions.txt> 코어 제거 관련 수정.Unicode::UCD0.32 → 0.43. 네 새 함수 추가: 속성 이름의 유니코드 승인 동의어를 모두 찾거나 이름을 변환하는prop_aliases()·prop_value_aliases(), 주어진 유니코드 이진 속성과 매치하는 모든 코드 포인트를 돌려주는prop_invlist, 주어진 유니코드 속성의 완전한 명세를 돌려주는prop_invmap.Win32API::File0.1101 → 0.1200. SetStdHandle과 GetStdHandle 함수 추가.
제거된 모듈과 프래그마
Perl 5.14.0 릴리스 노트가 약속한 대로, 다음 모듈이 코어 배포판에서 제거됐고 필요하면 CPAN에서 설치해야 해요.
Devel::DProf— Perl 코어에서 제거. 이전 버전 20110228.00.Shell— Perl 코어에서 제거. 이전 버전 0.72_01.- 5.14에서 deprecated된 여러 옛 perl4 스타일 라이브러리가 이제 제거:
abbrev.pl assert.pl bigfloat.pl bigint.pl bigrat.pl cacheout.pl
complete.pl ctime.pl dotsh.pl exceptions.pl fastcwd.pl flush.pl
getcwd.pl getopt.pl getopts.pl hostname.pl importenv.pl
lib/find{,depth}.pl look.pl newgetopt.pl open2.pl open3.pl
pwd.pl shellwords.pl stat.pl tainted.pl termcap.pl timelocal.pl
CPAN에서 Perl4::CoreLibs로 찾을 수 있어요.
문서 (Documentation)
새 문서
perldtrace— Perl의 DTrace 지원을 설명하고 제공 프로브를 나열하며 사용 예를 들어요.perlexperiment— Perl의 실험적 기능 목록을 제공하려는 문서. 아직 진행 중.perlootut— 새 OO 튜토리얼. 기본 OO 개념에 집중한 뒤 CPAN에서 OO 프레임워크를 고르도록 권장해요.perlxstypemap— XS typemapping 메커니즘을 전례 없이 상세히 설명하고,perlxs와 이전의 비공식 목록에서 추출한 정보를 결합한 새 매뉴얼.
기존 문서 변경
perlapi— HV API가 키가 UTF8임을 보이기 위해 음수 길이를 오랫동안 받아들였는데 이제 문서화됨.boolSV()매크로가 이제 문서화됨.perlfunc—dbmopen이 0 모드를 특수 경우로 취급해 존재하지 않는 파일이 생성되지 않게 함. Perl 5.000부터 그랬지만 어디에도 문서화되지 않았어요. 이제 perlfunc 항목이 언급 [perl #90064]. 역사적 우연으로open $fh, '<:', ...은open.pm이 선언한 것을 무시하고 플랫폼 기본 레이어(Unix에서:raw, Windows에서:crlf)를 적용해요. 유용해 보이는 기능이라perlfunc와open에 문서화됨.split항목이 재작성되어 훨씬 명확해짐.perlguts— 새 섹션 "Autoloading with XSUBs"가 추가되어 autoload된 sub의 이름에 접근하는 두 API를 설명해요. 일부 함수 설명이 위·아래 어느 함수를 가리키는지 불명확했는데 명확해짐 [perl #91790].perlobj— 처음부터 재작성되고 다양한 OO 개념의 다룸이 확장됨.perlop— smartmatch 연산자 문서가 다듬어지고 perlsyn에서 perlop으로 옮겨짐. 왼쪽에undef가 오는 경우도 수정. 생략 부호 문(...) 문서가 다듬어지고 perlop에서 perlsyn으로 옮겨짐. 비트 연산자 설명이 유니코드 문자열에서 어떻게 동작하는지 설명하도록 확장 (5.14.1).m//g예시 추가 (5.14.1).<<\FOOhere-doc 문법 문서화 (5.14.1).perlpragma—%^H의 키 이름 짓는 표준 관례가 "Key naming" 아래 문서화됨.perlsec— taintedness 검사 예제 함수에 미묘한 오류가 있었어요.$@는 함수 밖에서 이 전역 값이 바뀌는 걸 막기 위해 localize해야 해요. 검사 선호 방법은Scalar::Util의 tainted.perllol— Perl 5.14.0에 도입된 새push $scalar문법 예시로 확장 (5.14.1).perlmod— 이제 일부 유형의 명시적 심볼 테이블 조작은 지원되지 않는다고 명시적으로 밝혀요 [perl #78074].perlpodstyle— 쓸 포맷 코드 팁이 수정·대폭 확장. 편집 후 POD 파일 미리보기용 원라이너 예시가 몇 개 생김.perlre—(*COMMIT)지시문이 올바른 섹션("Verbs without an argument")에 목록됨.perlrun— 상당한 정리 수행. 특히-0플래그의-0x...형태가 명확해지고, 환경 변수 섹션이 수정·확장됨 (5.14.1).perlsub— 꽤 오랫동안 존재해 온($;)프로토타입 문법이 문서화됨. 단항 함수가 목록 연산자와 같은 우선순위를 갖게 해 줘요.perltie— 핸들을 tie하는 필수 문법이 문서화됨.perlvar—$!문서가 수정·명확화.$!이undef일 수 있다고 했는데 그렇지 않아요. 시스템 콜이 C의errno를 설정하는지 Perl의$!을 설정하는지도 불명확했어요 [perl #91614].$$문서에 프로세스 ID 변경에 관한 추가 주의가 덧붙음.- 기타 —
perlxs가 인라인 typemap 문서로 확장.perlref에 순환이 해제되지 않을 수 있는 방법과 약한 참조로 해결하는 법을 설명하는 새 "Circular References" 섹션.perlapi일부가 명확해지고 일부 C 함수의 Perl 등가가 추가 표현 방식으로 덧붙여짐.perlre·perlrecharclass일부가 명확해짐.
제거된 문서
- 옛 OO 문서 — 옛 OO 튜토리얼 perltoot, perltooc, perlboot이 제거됨. perlbot(객체 트릭 모음) 문서도 제거됨.
- 개발 델타 — 개발 릴리스의 perldelta 파일이 더 이상 perl과 함께 패키징되지 않음. perl 소스 코드 저장소에서 여전히 찾을 수 있어요.
진단 (Diagnostics)
진단 출력에 다음 추가·변경이 이뤄졌어요(경고와 치명적 오류 메시지 포함). 전체 목록은 perldiag 참고.
새 진단
새 오류
- "Cannot set tied @DB::args" —
caller가@DB::args를 설정하려다 tied임을 발견할 때 발생. 이 오류가 추가되기 전에는 대신 크래시했어요. - "Cannot tie unreifiable array" —
tie연산자가@_같은 특수 배열을 tie하기 전에 하는 안전 검사의 일부. 이 메시지를 본 적이 없어야 해요. - "&CORE::%s cannot be called directly" —
CORE::네임스페이스의 서브루틴을&foo문법이나 참조로 호출할 때 발생. 이 패키지의 일부 서브루틴은 아직 그렇게 호출할 수 없고 bareword로 호출해야 해요. - "Source filters apply only to byte streams" —
unicode_eval기능 아래에서eval에 전달된 문자열 안에서 소스 필터(보통 소스 필터 모듈 로딩)를 활성화하려 할 때 발생하는 새 오류.
새 경고
- "defined(@array) is deprecated" — 오래전부터 deprecated 된
defined(@array)가 이제 패키지 변수에서도 경고해요. 이전에는 어휘 변수에서만 경고했어요. - "length() used on %s" —
scalar(@array)나scalar(keys %hash)대신 배열·해시에length를 쓸 때 발생하는 새 경고. - "lvalue attribute %s already-defined subroutine" —
:lvalue속성을 이미 정의된 Perl 서브루틴에 적용할 때attributes.pm이 이 경고를 내는데, 예상치 못한 부작용이 있을 수 있기 때문이에요. - "overload arg '%s' is invalid" — "overload" 범주의 경고로, overload 프래그마가 인식하지 못하는 인자(아마 오타 낸 연산자)를 받을 때 발생.
- "$[ used in %s (did you mean $] ?)" — 버전 검사에서
$[을 잘못 쓰는 걸 잡기 위한 새 경고. 버전 번호를 담는 건$[이 아니라$]이에요. - "Useless assignment to a temporary" — lvalue 서브루틴에서 돌려받은 임시 스칼라에 할당하면 이 경고 발생 [perl #31946].
- "Useless use of \E" —
\E는\Q,\L,\U앞에 올 때만 무언가를 해요.
제거된 오류
- "sort is now a reserved word" — 인자 없이
sort를 쓰고;또는)가 따라올 때 발생하던 오류. (예:sort;는 죽었지만{sort}는 OK.) 이 오류 메시지는 더 이상 동작하지 않는close(sort)같은 코드를 잡기 위해 Perl 3에서 추가됐어요. 20년이 넘게 지난 지금 이 메시지는 더 이상 적절하지 않아요. 이제 인자 없는sort는 항상 허용되고, 이미 허용됐던 경우처럼 빈 목록을 돌려줘요 [perl #90030].
기존 진단 변경
=~연산자 왼쪽에 배열·해시가 있을 때 생기던 "Applying pattern match..." 경고가 이제 변수 이름을 언급해요.- "Attempt to free non-existent shared string"의 "non-existent" 철자가 "nonexistent"로 수정됨. perldiag에는 이미 올바른 철자로 있었어요.
- topicalizer 밖에서
default·when을 쓰는 오류 메시지가continue·루프 제어 메시지와 일치하도록 표준화됨. 이제 'Can't "default" outside a topicalizer'와 'Can't "when" outside a topicalizer'. - "Code point 0x%X is not Unicode, no properties match it; all inverse properties do"가 "Code point 0x%X is not Unicode, all \p{} matches fail; all \P{} matches succeed"로 변경.
- 상수 서브루틴의 재정의 경고는 원래 필수였고
no warnings아래에서도 발생했어요. 이제warnings프래그마를 존중해요. - "glob failed" 경고 메시지가 이제
no warnings로 억제 가능 [perl #111656]. - "Invalid version format (%s)" 오류 메시지가 음수에 대해 괄호 안에서 "non-numeric data"가 아니라 "negative version number"라고 말해요.
- "Possible attempt to put comments in qw() list"와 "Possible attempt to separate words with commas" 두 경고가 더 이상 상호 배타적이지 않아요. 같은
qw구성이 둘 다 생산할 수 있어요. $_가 암시적이고 undefined일 때y///r의 uninitialized 경고가 비-/r 변형처럼 변수 이름을 언급해요.- 'Use of "foo" without parentheses is ambiguous' 경고가 내장 함수뿐 아니라 (;$) 프로토타입을 가진 사용자 정의 서브루틴에도 적용되도록 확장.
- 유니코드 문자를 담은 어휘(
my) 변수 이름을 언급하는 경고가 무조건 UTF8을 출력하는 대신 이제 출력 핸들의:utf8레이어 유무를 존중해요. 또한$SIG{__WARN__}핸들러에 전달된 문자열에 원시 UTF8 바이트 대신 올바른 이름이 포함돼요.
유틸리티 변경 (Utility Changes)
h2ph
h2ph는 원래 이런 형태의 코드를 생성했어요:
unless(defined(&FOO)) {
sub FOO () {42;}
}
하지만 서브루틴은 컴파일 타임 선언이라 조건의 영향을 받지 않아요. 이제 서브루틴 주위에 문자열 eval을 내보내도록 수정됨 [perl #99368].
splain
splain은 더 이상 첫 줄 번호가 반복되는 백트레이스를 내지 않아요. 다음:
Uncaught exception from user code:
Cannot fwiddle the fwuddle at -e line 1.
at -e line 1
main::baz() called at -e line 1
main::bar() called at -e line 1
main::foo() called at -e line 1
이렇게 됐어요:
Uncaught exception from user code:
Cannot fwiddle the fwuddle at -e line 1.
main::baz() called at -e line 1
main::bar() called at -e line 1
main::foo() called at -e line 1
여러 줄로 된 일부 오류 메시지는 perldiag에 별도 항목으로 나열돼 있어요. splain이 이 경우 별도 항목을 못 찾고 실패하는 대신 찾도록 배움.
zipdetails
IO::Compress::Base 업그레이드의 일부로 포함된 새 유틸리티. zip 파일의 내부 레코드 구조 정보를 표시해요. zip 파일에 저장된 압축 데이터의 상세 표시에는 관심이 없어요.
설정과 컴파일 (Configuration and Compilation)
- F<regexp.h>가 perl 헤더를 포함하는 일부 프로젝트가 쓰는 GCC의
-Werror옵션과 호환되도록 수정 (5.14.1). USE_LOCALE{,_COLLATE,_CTYPE,_NUMERIC}이 perl -V 출력에 추가됨 (비록 작은 영역에만, 인터프리터 바이너리의 동작에 영향을 주므로).IPC::Open2의 코드·테스트가 F<ext/IPC-Open2>에서 F<ext/IPC-Open3>으로 이동.IPC::Open2::open2()가IPC::Open3::_open3()의 얇은 래퍼로 구현되어 매우 밀접하게 결합되어 있기 때문.- magic 타입과 magic vtable이 이제 수동 유지 대신 새 스크립트 F<regen/mg_vtable.pl>의 데이터에서 생성. EBCDIC 변형마다 '~'의 코드 포인트가 다르므로, 문자→코드 포인트 변환은 빌드 시 F<generate_uudmap>이 새 생성 헤더 F<mg_data.h>로 수행.
PL_vtbl_bm과PL_vtbl_fm은 이제 별개 C 변수 대신 전처리기가PL_vtbl_regexp로 정의.PL_vtbl_sig제거. -DPERL_GLOBAL_STRUCT로 빌드가 다시 동작. 이 설정은 보통 쓰이지 않아요.- MAD로 설정된 Perl이 OP가 해제될 때
MADPROP구조를 이제 올바르게 해제.MADPROP이 이제PerlMemShared_malloc()로 할당. - F<makedef.pl>이 리팩터링. 빌드의 일부로 쓰는 플랫폼(AIX, VMS, Win32)에 눈에 띄는 영향 없음.
useperlio는 더 이상 비활성화할 수 없음.- F<global.sym> 파일이 더 이상 필요 없어 제거됨. exported 함수 목록을 담고 있었고, F<regen/embed.pl>이 F<embed.fnc>와 F<regen/opcodes> 데이터에서 생성하는 파일 중 하나였어요. F<global.sym>의 유일한 사용자인 F<makedef.pl>이 이제 F<embed.fnc>와 F<regen/opcodes>를 직접 읽도록 리팩터링.
- F<pod/buildtoc>가 리팩터링·단순화. 이제 오직 perltoc 빌드 코드만 담고, Makefile 재생성 코드는 F<Porting/pod_rules.pl>로 이동. 이 변경이 빌드 과정에 실질적 영향이 있으면 버그예요.
- F<pod/roffitall>이 이제 배포판과 함께 제공되는 대신 F<pod/buildtoc>가 빌드. manpage 목록이 이제 생성됨(따라서 최신).
XS::Typemap의 man page가 더 이상 설치되지 않음.XS::Typemap은 설치되지 않는 테스트 모듈이라 문서 설치가 무의미해요.-Dusesitecustomize와-Duserelocatableinc옵션이 이제 함께 제대로 동작.
플랫폼 지원 (Platform Support)
플랫폼별 참고
Cygwin
- 1.7 버전부터 Cygwin이 네이티브 UTF-8 경로를 지원. 그 환경에서 Perl이 빌드되면 디렉터리·파일 이름이 UTF-8로 인코딩돼요.
- Cygwin은 원래 Win32 환경 변수를 전부 초기화하지 않아요. 새로 추가된
Cygwin::sync_winenv()함수와 추가 링크에 대한 논의는 F<README.cygwin> 참고 [perl #110190].
HP-UX
- HP-UX PA-RISC/64가 이제 gcc-4.x 지원. socketsize 수정으로 64bitall 빌드의 HP-UX PA-RISC 테스트 스위트가 통과 (5.14.2).
VMS
- 불필요한 include 제거, 각종 컴파일러 경고 수정, F<vms/vms.c>의 닫히지 않은 주석 몇 개 닫기.
- VMS 빌드에서 sockadapt 레이어 제거.
- v7.0 이전 VMS와 v6.0 이전 DEC C의 명시적 지원 제거.
- Perl 5.10.1부터 자체 제작
stat래퍼가 밑줄을 포함한 디렉터리 이름과 같은 위치에 점을 포함한 같은 이름의 파일을 구분하지 못했어요 (예: 디렉터리 t/test_pl과 파일 t/test.pl). 이 문제가 수정됨. - VMS 빌드가 이제 31자보다 긴 Perl용 C 코드 심볼 이름을 허용.
Perl__it_was_the_best_of_times_it_was_the_worst_of_times같은 심볼이 VMS 링커를 막히게 하지 않고 자유롭게 만들어질 수 있어요.
GNU/Hurd
- DBM 모듈 빌드 힌트, 라이브러리 검색 경로 탐지, 큰 파일 지원 활성화로 GNU/Hurd의 수많은 빌드·테스트 실패가 해결됨.
OpenVOS
- Perl이 이제 OpenVOS에서 동적 링킹으로 빌드되며, 최소 지원 버전은 이제 Release 17.1.0.
SunOS
- CC workshop C++ 컴파일러가 이제 cc가 없는 시스템에서 탐지·사용됨.
내부 변경 (Internal Changes)
- 포맷의 컴파일된 표현이 이제
PERL_MAGIC_fm의mg_ptr로 저장됨. 이전에는 문자열의 정상 끝인SvLEN()너머의 문자열 버퍼에 저장했어요.SvCOMPILED()와SvCOMPILED_{on,off}()는 이제 XS 코드 호환용으로만 존재. 첫 번째는 항상 0, 나머지 둘은 이제 no-op. (5.14.1) - 일부 전역 변수가
const로 표시되고, 인터프리터 구조의 멤버가 재정렬되며, opcode가 재정렬됨.OP_AELEMFASTop가OP_AELEMFAST과OP_AELEMFAST_LEX로 분리. - 해시를 비울 때(예:
undef(%h)또는%h=()) HvARRAY 필드가 더 이상 일시적으로 0이 되지 않아요. 해제되는 요소에서 호출되는 소멸자가 남은 요소를 보게 돼요. 그래서%h=()이delete $h{$_} for keys %h에 더 가까워짐. - Boyer-Moore 컴파일 스칼라가 이제 PVMG이고, Boyer-Moore 테이블이
PERL_MAGIC_bm의 mg_ptr로 저장됨. 이전에는 PVGV였고 테이블이SvLEN()너머 문자열 버퍼에 저장됐어요. 이로써 코어가SvLEN()너머 데이터를 저장하는 마지막 지점이 제거됨. Perl_sv_magic()의 로직 단순화가 알 수 없는 magic 타입 관련 오류 경우의 작은 동작 변화를 가져와요. 이전에는 알 수 없는 magic 타입을 받으면 (1) 읽기 전용이면 "Modification of a read-only value attempted"로 croak, (2) SV가 이미 이 magic을 가지면 오류 없이 반환, (3) 그 외에는 "Don't know how to handle magic of type \%o"로 croak. 이제 읽기 전용 값이나 이미 알 수 없는 magic 타입을 가진 SV에서도 항상 "Don't know how to handle magic of type \%o"로 croak해요.- 실험적
fetch_cop_label함수가cop_fetch_label로 이름 변경. cop_store_label함수가 API에 추가됐지만 실험적.- F<embedvar.h>가 단순화되고, 기본(비중복) 설정에서 PL_* 변수에 대한 매크로 간접화 한 단계가 제거됨. PERLVAR*() 매크로가 이제
PL_Idefgv로 확장되는 대신PL_defgv같은 토큰으로 직접 확장. 구현과 불필요하게 친밀한 XS 코드는 갱신이 필요할 수 있어요. - XSUB 심볼을 내보낼지 명시적으로 고르는 API가 추가됨. 더 자세한 내용은 커밋 e64345f8의 주석 참고.
is_gv_magical_sv함수가 제거되고gv_fetchpvn_flags와 병합. GV가 rvalue 문맥에서 자동 활성화되어야 하는지 판단하는 데 호출되곤 했어요. 이제 새GV_ADDMG플래그(API의 일부 아님)로 대체.utf8n_to_uvuni()가 잘못된 UTF-8 입력, 허용된 malformation, 꺼진utf8경고에서, 잘 정의된 코드 포인트를 계산할 수 없는 malformation이면 항상 유니코드 REPLACEMENT CHARACTER를 돌려줘요. 이전에는 기본적으로 쓰레기 값을 돌려줬어요. 잘 정의된 값을 가진 유일한 malformation은 길이 0 문자열(반환 0)과 과도한(overlong) UTF-8 시퀀스예요.- Padlist가 이제
AvREAL로 표시됨(참조 카운트됨). 항상 참조 카운트됐지만, F<pad.c>가 F<sv.c>의 일반 정리 코드 대신 자체 정리를 해서 real로 표시되지 않았어요. 그것이 스레드 클로닝에서 문제를 일으켰으므로 이제AvREAL플래그가 켜지지만 F<pad.c>가 pad를 자체적으로 해제한 직후, padlist 해제 직전에 꺼져요. - Perl 코어를 구성하는 모든 C 파일이 UTF-8로 변환됨.
- 유니코드 심볼 작업의 일부로 다음 새 함수가 추가됨:
HvNAMELEN
HvNAMEUTF8
HvENAMELEN
HvENAMEUTF8
gv_init_pv
gv_init_pvn
gv_init_pvsv
gv_fetchmeth_pv
gv_fetchmeth_pvn
gv_fetchmeth_sv
gv_fetchmeth_pv_autoload
gv_fetchmeth_pvn_autoload
gv_fetchmeth_sv_autoload
gv_fetchmethod_pv_flags
gv_fetchmethod_pvn_flags
gv_fetchmethod_sv_flags
gv_autoload_pv
gv_autoload_pvn
gv_autoload_sv
newGVgen_flags
sv_derived_from_pv
sv_derived_from_pvn
sv_derived_from_sv
sv_does_pv
sv_does_pvn
sv_does_sv
whichsig_pv
whichsig_pvn
whichsig_sv
newCONSTSUB_flags
gv_fetchmethod_*_flags 함수들은 gv_fetchmethod_flags처럼 실험적이며 향후 릴리스에서 바뀔 수 있어요.
- 다음 함수가 추가됐는데 API의 일부가 아니에요:
GvNAMEUTF8
GvENAMELEN
GvENAME_HEK
CopSTASH_flags
CopSTASH_flags_set
PmopSTASH_flags
PmopSTASH_flags_set
sv_sethek
HEKfARG
포맷 문자열에서 HEK를 보간하기 위한 SVf에 대응하는 HEKf 매크로도 있어요.
sv_catpvn_flags가 내부 전용 플래그SV_CATBYTES와SV_CATUTF8를 받는데, 연결할 char 배열이 UTF8인지 알려줘요. 임시 SV를 만들어sv_catsv에 전달하는 것보다 효율적으로 연결할 수 있어요.- XS AUTOLOAD sub의 경우
$AUTOLOAD가 5.6.0에서처럼 다시 설정돼요. 5.8~5.14 호환을 위해SvPVX(cv)설정에 추가됨. - Perl은 이제 MRO 플러그인이 돌려주는 배열(선형화된 isa)이 그 배열이 만들어진 클래스 이름으로 시작하는지 가정하는 대신 검사해요. 이로써 메서드 조회 중 첫 요소가 건너뛰어지는 걸 방지해요. 즉
mro::get_linear_isa가 MRO 플러그인이 제공한 것보다 한 요소 더 많은 배열을 돌려줄 수 있어요 [perl #94306]. PL_curstash가 이제 참조 카운트됨.- 이제 F<feature.pm> 로딩을 피하려고 버전 선언이 쓰는
PL_hints($^H)에 기능 묶음 힌트가 있음. 힌트 비트 한 설정이 "custom" 기능 묶음을 나타내며, 이는%^H항목이 여전히 적용됨을 뜻해요. F<feature.pm>이 그걸 사용해요.HINT_FEATURE_MASK매크로가 다른 힌트와 함께 F<perl.h>에 정의됨. 기능·묶음을 설정·테스트하는 다른 매크로는 새 F<feature.h>에 있음.FEATURE_IS_ENABLED(F<feature.h>로 이동)는 더 이상 코드베이스 전체에 쓰이지 않고, F<feature.h>에 정의된 더 구체적인 매크로(예:FEATURE_SAY_IS_ENABLED)가 쓰임. - F<lib/feature.pm>은 이제 생성 파일이며, F<feature.h>도 생성하는 새 F<regen/feature.pl> 스크립트가 만듦.
- tied 배열이 이제 항상
AvREAL.@_나DB::args가 tie되면 이를 보장하기 위해 먼저 reify됨. - 두 새 함수
utf8_to_uvchr_buf()와utf8_to_uvuni_buf()가 추가됨. (이제 deprecated된)utf8_to_uvchr·utf8_to_uvuni와 같지만, 입력 문자열 끝을 넘어 읽는 걸 막는 추가 매개변수를 받아요. - 정규식 엔진이 이제 유니코드 아래에서 TRIE 대소문자 구분 없는 매치를 함. 이는
use re 'debug';출력을 바꿀 수 있고 다양한 것을 빨라지게 해요. PL_check에 직접 쓰는 것의 스레드 안전 대안을 제공하는 새wrap_op_checker()함수가 있음.
선택된 버그 수정 (Selected Bug Fixes)
배열과 해시
- 반복할 다음 두 해시 요소가 삭제되면 "Use of freed value in iteration" 오류를 일으키던 버그 수정 [perl #85026]. (5.14.1)
- void 문맥에서 현재 해시 반복자(다음
each호출이 돌려줄 요소)를 삭제하면 해제되지 않던 문제 [perl #85026]. delete $Class::{method}문법으로 메서드를 삭제하면 void 문맥에서는 메서드 캐시를 갱신했지만 스칼라·목록 문맥에서는 그러지 않았어요.- void 문맥에서 해시 요소 삭제 시, 내부 해시 항목이 이제 값이 해제되기 전에 해제돼, 후자의 해제가 호출한 소멸자가 불일치 상태의 해시를 보는 걸 막아요. 소멸자가 해시 자체를 해제하면 이중 해제를 일으킬 수 있었어요 [perl #100340].
- 빈 해시를 더 빠르게 하려고 Perl 5.12.0에 넣은
keys최적화가 마지막 요소가 삭제된 후 호출되면each가 반복자를 리셋하지 못하게 했어요. - 깊게 중첩된 해시 해제가 더 이상 크래시하지 않음 [perl #44225].
- XS 코드에서 값이 없는 요소를 가진 해시를 만들 수 있어요. 해시 요소·슬라이스 연산자가 lvalue 문맥에서 이것을 다룰 때 크래시했어요. 이제 "Modification of non-creatable hash value attempted" 오류 메시지를 냅니다.
- 해시·배열에 대한 목록 할당이 해시·배열 자체를 해제하는 소멸자를 발화시키면 크래시가 일어났어요. 더 이상 그렇지 않아요 [perl #107440].
- localize된 배열·해시의 typeglob(예:
local @{"x"}; delete $::{x})을 해제해 스코프 종료 시 크래시를 일으킬 수 있었어요. Hash::Util에 영향을 주는 일부 코어 버그 수정: glob 복사본인 해시 요소를 잠그면 다음 할당이 glob을 손상시키던 문제 (5.14.2), copy-on-write 스칼라를 담는 해시 요소를 잠금 해제하면 그 스칼라 수정이 같은 문자열 버퍼를 공유하는 다른 스칼라를 수정하던 문제.
C API 수정
newHVhvXS 함수가 tied 해시에서 크래시하거나 빈 해시를 돌려주는 대신 이제 동작.SvIsCOWC 매크로가 이제 아래처럼 만들어진 typeglob의 읽기 전용 복사본에 대해 false를 돌려줘요:
$hash{elem} = *foo;
Hash::Util::lock_value %hash, 'elem';
이전에는 true를 돌려줬어요.
SvPVutf8C 함수가 더 이상 인자를 수정하려 하지 않아 오류가 나지 않음 [perl #108994].SvPVutf8이 이제 magic 변수에서 제대로 동작.SvPVbyte가 이제 non-PV에서 제대로 동작.- 잘못된 UTF-8 입력이 주어지면 XS 호출 가능 함수
is_utf8_string(),is_utf8_string_loc(),is_utf8_string_loclen()이 입력 문자열 끝을 넘어 최대 12바이트까지 읽을 수 있었어요. 더 이상 그렇지 않아요 [perl #32080]. 다만 현재is_utf8_char()는 이 결함이 여전히 있어요. - C 수준
pregcomp함수가 패턴이 overloaded·tied·기타 magic 스칼라이면 패턴이 UTF8인지 혼동할 수 있었어요 [perl #101940].
컴파일 타임 힌트
%^H를 tie하는 게 더 이상 컴파일 스코프에 들어갈 때 perl을 크래시시키거나%^H내용을 무시하지 않음 [perl #106282].eval $string과require가eval호출 자체가 컴파일될 때%^H가 비어 있으면 컴파일 중%^H를 localize하지 않았어요. 이는use re "/m"이 주변 코드가 호출자에게 켜려는 다른 플래그를 켜는 무서운 부작용을 일으킬 수 있었어요 [perl #68750].eval $string과require가 이제 런타임이 아닌 $string 또는 required 파일 컴파일 동안에만 힌트($^H와%^H)를 localize해요. 이로써BEGIN { $^H{foo}=7 }이BEGIN { eval '$^H{foo}=7' }와 동등해짐 [perl #70151].- XS 코드에서(
newXS또는newATTRSUB로) BEGIN 블록을 만들면 완료 시 현재 컴파일 중 코드의 힌트가 현재 힌트가 됐어요. 이는 non-warning 스코프에서 경고가 발생하게 할 수 있었어요.
Copy-on-write 스칼라
copy-on-write 또는 공유 해시 키 스칼라는 5.8.0에 도입됐지만 대부분의 Perl 코드는 만나지 못했어요(대부분 내부에서만 쓰였죠). Perl 5.10.0이 __PACKAGE__나 해시 키를 스칼라에 할당하면 copy-on-write가 되도록 확장했어요. Perl의 여러 부분이 이를 고려하도록 갱신되지 않았지만 이제 고쳐졌어요.
utf8::decode에 copy-on-write 스칼라의 문자열 버퍼를 제자리에서(복사 건너뛰기) 수정하는 지저분한 버그가 있었어요. 이로 인해 해시에 같은 키를 가진 두 요소가 생길 수 있었어요 [perl #91834]. (5.14.2)- lvalue 서브루틴이 COW 스칼라를 돌려주도록 허용하지 않았어요. lvalue 스칼라 문맥은 Perl 5.12.3과 5.14.0에서 고쳐졌지만 목록 문맥은 이 릴리스에서야 고쳐짐.
- copy-on-write 값을 담는 제한된 해시(
fields프래그마 참고)의 요소를 삭제할 수 없고, 그런 해시를 비울 수 없었어요(%hash = ()). (5.14.2) - copy-on-write 문자열을 담고 있으면 tied 변수를 localize하는 게 읽기 전용으로 만들었어요. (5.14.2)
- stash 요소에 copy-on-write 문자열을 할당하는 게 더 이상 이중 해제를 일으키지 않아요. 이 변경과 무관하게 그런 할당의 결과는 여전히 정의되지 않아요.
- 내부적으로 PVMG 또는 PVLV면 tied 변수에 copy-on-write 문자열을 할당하는 게 더 이상 그 변수가 tie되는 걸 막지 않아요.
- copy-on-write 스칼라를 돌려주는 tied 변수에서 치환을 하면 어서션 실패나 "Attempt to free nonexistent shared string" 경고를 일으키곤 했어요.
- 5.12의 회귀: 5.14.0에서 비트 할당 연산자
|=,^=,&=가 왼쪽이 copy-on-write 문자열이면 undefined로 남기기 시작했어요 [perl #108480]. Storable,Devel::Peek,PerlIO::scalar에도 비슷한 문제가 있었어요.
디버거
- F<dumpvar.pl>과 디버거의
x명령이 이름에 "="를 포함한 클래스로 bless된 객체를 다루도록 수정. 그런 객체의 내용은 추출되지 않았어요 [perl #101814]. - 디버거 세션을 재시작하는 "R" 명령이 Windows나
POSIX::_SC_OPEN_MAX상수가 없는 다른 시스템에서 동작하도록 수정 [perl #87740]. #line 42 foo지시문이 문자열 eval에서 발생하면 디버거가 쓰는 줄 배열을 갱신하지 않았어요. 5.14에서 부분 수정됐지만 각 eval에서 단일#line 42 foo에만 동작했어요. 이제 여러 개에 동작해요.- 디버거가 서브루틴 호출을 가로챌 때 서브루틴 이름이나 참조가
$DB::sub에 저장되어 디버거가 접근해요. 때때로(예:$foo = *bar; undef *bar; &$foo)$DB::sub이 서브루틴을 찾는 데 쓸 수 없는 이름으로 설정되어 디버거의 호출 시도가 실패했어요. 참조가 필요한지 검사하는 게 이제 더 견고해져 그런 문제가 발생하지 않아요 [rt.cpan.org #69862]. - 모든 서브루틴에는 디버거가 쓰는 파일 이름이 연관돼 있어요. 상수 서브루틴에 연관된 것은 스레드 아래에서 복제될 때 잘못 할당되곤 했어요. 그래서 스레드 애플리케이션 디버깅이 메모리 손상을 일으킬 수 있었죠 [perl #96126].
역참조 연산자
defined(${"..."}),defined(*{"..."})등이 아직 사용되지 않은 대부분(전부는 아님) 내장 변수에 대해 true를 돌려줬어요. 이 버그는${^GLOBAL_PHASE}·${^UTF8CACHE}등에 영향을 줬어요. 패키지 이름도 함께 주어지면(${"::!"}) false를 돌려주기도 했어요 [perl #97978, #97492].- Perl 5.10.0이 유사 버그 도입: "foo"가 이전에 사용된 적 없는 내장 전역 변수 이름일 때
defined(*{"foo"})가 첫 호출에서만 false를 돌려주곤 했어요. 이것도 수정됨. - 5.6.0부터
*{ ... }가 undefined 값을 다루는 방식이 비일관적이었어요. strict 모드나 lvalue 문맥에서 대부분의 undefined 값에 대해 죽었지만,undef()가 돌려주는 특정 스칼라(내부적으로&PL_sv_undef)에 대해서는 (경고와 함께) 빈 문자열로 취급했어요. 수정됨.undef()는 이제 Perl 5.005처럼 다른 undefined 스칼라처럼 취급돼요.
파일핸들, 마지막 접근
Perl에는 마지막으로 접근된 파일핸들을 저장하는 내부 변수가 있어요. $.과 인자 없는 tell·eof가 쓰죠.
- 이 내부 변수를 glob 복사본으로 설정하고 그 glob 복사본을 glob이 아닌 것으로 수정해도, 다시 glob을 할당한 후 변수와 마지막 접근 파일핸들이 계속 연관될 수 있었어요:
my $foo = *STDOUT; # $foo is a glob copy
<$foo>; # $foo is now the last-accessed handle
$foo = 3; # no longer a glob
$foo = *STDERR; # still the last-accessed handle
이제 $foo = 3 할당이 그 내부 변수를 해제해서 <$foo>가 없었던 것처럼 마지막 접근 파일핸들이 없어요. 이는 또한 $foo가 스코프를 벗어나 같은 내부 SV가 다른 핸들에 쓰일 때 무관한 핸들이 마지막 접근 핸들이 되는 걸 막아요 [perl #97988].
- 5.14의 회귀로 이 문장들이 그 내부 변수를 설정하지 않았어요:
my $fh = *STDOUT;
tell $fh;
eof $fh;
seek $fh, 0,0;
tell *$fh;
eof *$fh;
seek *$fh, 0,0;
readline *$fh;
이제 수정됐지만 tell *{ *$fh }는 여전히 문제가 있고 어떻게 고칠지 불명확해요 [perl #106536].
파일테스트와 stat
"filetests"는 하이픈 뒤 단일 문자의 연산자(-r, -x, -M 등)를 가리켜요. "stacked"는 같은 피연산자를 공유하는 다른 filetest 연산자가 뒤따르는 것(예: -r -x -w $fooo)을 뜻해요.
stat이 더 일관된 경고를 낸다. "_"에 대해 더 이상 경고하지 않고 [perl #71002], 다른 미연결 핸들에 대한 경고를 건너뛰는 것도 시점에 따라 없어짐. 운영체제의fstat함수가 실패하면 미연결 핸들에 대해 더 이상 경고하지 않음.stat이 잘못된 내부 C 타입을 써서 큰 inode 번호에 대해 때때로 음수를 돌려줬어요 [perl #84590].lstat은 (경고와 함께) 파일핸들이 주어지면stat으로 폴백하도록 문서화돼 있어요. IO 참조가 주어지면 실제로는stat _의 등가를 해서 핸들을 무시했어요.- 앞에
stat이 없는-T _가 보이는 미초기화 값이 없음에도 혼란스러운 "uninitialized" 경고를 냈어요. -T,-B,-l,-t가 다른 filetest 연산자와 stacked될 때 이제 동작 [perl #77388].- 5.14.0에서 filetest op(
-r,-x등)가 bareword 인자나 인자 없이 호출되면, 목록 연산자의 이전 인자에 속한 tied 인자에서 FETCH를 호출하기 시작했어요. 수정되어push @foo, $tied, -r이 더 이상$tied에서 FETCH를 호출하지 않아요. - Perl 5.6에서 bareword가 아닌 것 뒤의
-l은 인자를 파일 이름으로 취급했어요. 그게 5.8에서 glob 참조(\*foo)에 대해 바뀌었지만 glob 자체(*foo)에 대해서는 아니었어요.-l이 glob 참조에 대해 "_" 핸들이 쓰는 마지막 stat 버퍼를 설정하지 않고undef를 돌려주기 시작했는데, 경고가 켜진 경우에만요. 경고가 꺼지면 5.6과 같았어요. 즉 그냥 버그이자 비일관성이었죠. 이제 5.6 동작이 복원됨. - bareword 뒤의
-l이 더 이상 자신이 속한 목록 연산자의 이전 인자를 "먹지" 않아요. 그래서print "bar", -l foo가 이제 실제로 "bar"를 출력해요. - Perl은 마지막 stat 버퍼를 추적하는 여러 내부 변수를 유지해요: 어느 파일(핸들)에서 왔는지, 어떤 타입인지, 마지막 stat이 성공했는지. 이들이 어긋날 수 있는 다양한 경우가 있었고, 경계 경우에서 비일관·불규칙 동작을 일으켰어요(
-T를 언급하는 모든 곳은-B에도 적용):-T 핸들은 stat은 하지만 마지막 stat 타입을 리셋하지 않아 뒤의lstat _이 잘못된 결과를 돌려줬어요. 또 성공 상태도 설정하지 않았어요.stat이나 filetest가 마지막으로 쓴 핸들을 해제하면-T _가 무관한 핸들을 쓸 수 있었어요.- IO 참조가 있는
stat은 stat 타입을 리셋하지도,-T _가 쓰도록 파일핸들을 기록하지도 않았어요. - 치명적인 경고가 미연결 파일핸들의 filetest 연산자나 어떤 핸들의
-l에 대해 stat 버퍼가 리셋되지 않게 할 수 있었어요. 치명적 경고는-T가$!을 설정하는 것도 막았어요. - 마지막 stat이 읽을 수 없는 파일에 있었으면
-T _는undef를 돌려주고 마지막 stat 버퍼를 그대로 두어야 해요. 하지만 stat 타입을 설정해서lstat _이 동작을 멈췄어요. -T 파일이름이 읽을 수 없는 파일에 대해 내부 stat 버퍼를 리셋하지 않았어요. 이 모두가 수정됐어요.
포맷
- 포맷과
formline의 여러 경계 경우가 수정. 특히 포맷 자체가 잠재적으로 가변적(tie와 오버로딩)인 경우, 포맷과 데이터의 인코딩이 다른 경우. 두 경우 모두 출력이 손상될 수 있었어요 [perl #91032]. formline이 더 이상 인자를 제자리에서 문자열로 변환하지 않아, 참조를formline에 넘겨도 참조가 파괴되지 않아요 [perl #79532].$^A(포맷 출력 누산기)에 할당하면 이제 출력된 줄 수를 재계산해요.
given과 when
given이 암시적$_를 제대로 스코프하지 않아 메모리 누수나 "Variable is not available" 경고를 일으켰어요 [perl #94682].given이 쓰는 암시적 어휘$_에 set-magic을 호출하지 않았어요. 즉 같은given블록의 한 실행에서 다음 실행까지, 입력이 다른 변수여도pos가 기억될 수 있었어요 [perl #84526].when블록이 이제 바깥given블록 내부에 선언된 변수를 돌려줄 수 있어요 [perl #93548].
glob 연산자
- VMS 외 OS에서 Perl의
glob연산자(및<>형태)가 내부에서File::Glob을 써요.File::Glob이 패턴을 단어로 나눈 뒤 각 단어를bsd_glob함수에 넘겨요. - 나누는 방식에 여러 비일관성이 있었어요. 이제 따옴표('와 ")는 항상 셸 스타일 단어 구분자(단어 일부로 공백 허용)로 취급되고, 백슬래시는 따옴표를 이스케이프하기 위해 존재하지 않는 한 항상 보존돼요. 이전에는 패턴에 공백이 있는지에 따라 그럴 때도 아닐 때도 있었어요. 또한 패턴 끝의 이스케이프된 공백이 더 이상 잘리지 않아요 [perl #40470].
CORE::glob이 이제 기본 globbing 함수를 호출하는 방법으로 동작.CORE::접두사에도 불구하고 오버라이드를 존중하곤 했어요.- miniperl(perl 자체가 빌드될 때 모듈 설정에 쓰임) 아래에서
glob이 이제 csh를 호출하기 전에 %ENV를 비워요. csh는 일부 시스템에서 LS_COLORS 환경 변수 내용이 마음에 들지 않으면 croak하거든요 [perl #98662].
Lvalue 서브루틴
- 명시적 return이 이제 복사 대신 return에 전달된 실제 인자를 돌려줘요 [perl #72724, #72706].
- Lvalue 서브루틴이 마지막 문과 return의 인자에 대해 lvalue 문법(즉
=왼쪽에 올 수 있는 것)을 강제하곤 했어요. lvalue 서브루틴이 항상 lvalue 문맥에서 호출되는 건 아니므로 이 제한이 제거됐어요. - Lvalue 서브루틴이 돌려줄 수 있는 값에 대해 덜 제한적이에요.
shift·delete·다른 서브루틴이 돌려주는 값에서 croak하곤 했지만 더 이상 그러지 않아요 [perl #71172]. - 빈 lvalue 서브루틴(
sub :lvalue {})이 목록 문맥에서@_를 돌려주곤 했어요. 모든 서브루틴이 그렇게 하곤 했지만 일반 sub는 Perl 5.8.2에서 수정됐어요. 이제 lvalue 서브루틴도 그렇게 수정. - 자동 활성화(autovivification)가 이제 lvalue 서브루틴에서 돌려받은 값에서 동작하고 [perl #7946], lvalue 문맥에서
keys반환도 동작. - Lvalue 서브루틴이 rvalue 문맥에서 반환 값을 복사하곤 했어요. CPU 낭비일 뿐 아니라 버그도 일으켰어요.
($)프로토타입이 lvalue sub이 반환 값을 복사하게 만들었고 [perl #51408],while(lvalue_sub() =~ m/.../g) { ... }이 무한 루프에 빠졌어요 [perl #78680]. - 잠재적 lvalue 문맥(예: 서브루틴 인자나
for에 전달된 목록)에서 호출되면 lvalue 서브루틴이 돌려주는 읽기 전용 값을 복사하곤 했어요. 예:sub :lvalue { $] }이$]을 돌려주지 않고 복사본을 돌려줬어요. - 잠재적 lvalue 문맥에서 호출되면 배열·해시를 돌려주는 lvalue 서브루틴이 배열·해시를 스칼라 변수에 바인딩해 버그를 일으켰어요. 배열이 서브루틴에서 처음 돌려주는 것이면 5.14.0에서 수정됐지만(
$scalar, @array나 해시 반환은 아니었음) 이제 더 일반적 수정이 적용됨 [perl #23790]. - 모든 인자가
my()나our()로 둘러싸인 메서드 호출($object->method(my($a,$b))처럼)이 서브루틴에 lvalue 문맥을 강제하곤 했어요. 이로 인해 lvalue 메서드가 특정 값을 돌려주지 못했어요. - 컴파일 타임에 lvalue로 판정되지 않는 lvalue sub 호출(
&$name또는&{"name"})이 lvalue 서브루틴의 마지막 문에서 발생하면 더 이상 strict refs에서 면제되지 않아요 [perl #102486]. - 컴파일 타임에 sub이 보이지 않는 sub 호출이 lvalue 서브루틴의 마지막 문에서 발생하면 non-lvalue 서브루틴을 거부하고 "Can't modify non-lvalue subroutine call"로 죽곤 했어요 [perl #102486].
- sub이 컴파일 타임에 보이는 non-lvalue sub 호출은 반대 버그를 보였어요. lvalue 서브루틴의 마지막 문에 호출이 있으면 lvalue 문맥에서 호출될 때 오류가 없었어요. Perl이 non-lvalue 서브루틴이 돌려주는 임시 값에 맹목적으로 할당했죠.
AUTOLOAD루틴이 lvalue 또는 잠재적 lvalue 문맥의 sub 호출에서, 컴파일 타임에 sub이 보이지 않으면, (autoload가 필요 없을 때) 실제 호출되는 sub보다 우선하곤 했어요.- XSUB이나
sub foo :lvalue;문법의 별칭 서브루틴 스텁에:lvalue속성을 적용하는 게 Perl 5.12에서 동작을 멈췄어요. 수정됨. - 이미 정의된 서브루틴에 :lvalue 속성을 적용하는 건 제대로 동작하지 않아요. 속성이 sub의 컴파일 방식을 바꾸니까요. 그래서 Perl 5.12가 이미 정의된 sub에 속성을 적용하려 하면 경고하기 시작했어요. 그런 경우 속성은 버려져요. 하지만 5.12의 변경이 커스텀 속성도 함께 있는 경우를 놓쳤어요: 그 경우 여전히 조용히 그리고 효과 없이 속성을 적용했죠. 그 누락이 수정됨.
sub foo :lvalue :Whatever(foo가 이미 정의됨)가 이제 :lvalue 속성에 대해 경고하고 적용하지 않아요. - 중첩 lvalue 서브루틴 호출을 통한 lvalue 문맥 전파에 영향주는 버그 수정. 이전에는 중첩 rvalue 문맥에서 값을 돌려주면 내부 서브루틴 호출이 lvalue 문맥으로 취급해 (읽기 전용 같은) 일부 값을 거부했어요.
오버로딩
- 'nomethod' 오버라이드에 의존하는 overloaded 객체를 포함한 산술 할당(
$left += $right)이 왼쪽 피연산자가 overloaded가 아니면 더 이상 segfault하지 않음. - 오버로딩 중 메서드를 못 찾을 때 발생하는 오류가 5.10.0 이후 잘못 "overload" 패키지를 언급하던 것을 5.8.x처럼 정확한 패키지 이름을 언급하도록 수정.
%overload::를 undef하는 게 더 이상 크래시하지 않음.
내장 키워드의 프로토타입
prototype함수가__FILE__,__LINE__,__PACKAGE__지시문에서 더 이상 죽지 않아요.time같은 영항 함수와 문법적으로 구분할 수 없으므로 빈 문자열 프로토타입을 돌려줘요.prototype이 이제eq처럼 함수와 닮지 않게 호출할 수 없는 모든 오버라이드 가능한 중위 연산자에 대해undef를 돌려줘요. 이전에는 일부에 잘못된 프로토타입을 돌려주고 다른 것은 죽였어요 [perl #94984].getprotobynumber,lock,not,select같은 여러 내장 함수의 프로토타입이 수정되거나 이전보다 현실에 가까워짐.
정규식
/[[:ascii:]]/과/[[:blank:]]/이 플랫폼이 지원할 때use locale아래에서 이제 로케일 규칙을 써요. 이전에는 플랫폼의 네이티브 문자 집합을 썼어요.m/[[:ascii:]]/i과/\p{ASCII}/i이 이제 동일하게 매치(다른 로케일 아래가 아닐 때). 이는 5.14에 도입된 회귀를 수정하는데, 첫 식이 KELVIN SIGN 같은 ASCII 밖 문자를 매치할 수 있었어요.</.*/g>이 "\n"으로 끝나는 문자열 끝에서 매치를 거부하곤 했어요. 수정됨 [perl #109206].- 5.12.0부터 Perl이
${ qr// }를 해시 요소에 할당하고Hash::Util로 잠근 후 내부 장부가 엉키곤 했어요. 이로 인해 이중 해제·크래시·불규칙 동작이 생길 수 있었어요. - 5.14.0의 새 정규식 수정자
</a>가</aa>처럼 반복되면 범위 밖 ASCII와 매치하는 범위 밖 character를</i>아래 매치하지 못하게 해요. 이것은 분기(alternation)와 관련된 일부 상황에서 동작하지 않았어요. 예:
"\N{KELVIN SIGN}" =~ /k|foo/iaa;
부적절하게 성공했어요. 수정됨.
- 5.14.0이
[\w\s]같은 정규식 문자 클래스에 메모리 누수를 도입했는데 수정됨. (5.14.1) - 정규식 매칭의 경계 경우가 잠재적으로 루프할 수 있었어요. 이는 다중 문자 fold를 가진 문자가 있는 대괄호 문자 클래스의
</i>아래에서만, 그리고 대상 문자열이 fold의 첫 부분 다음에 나머지 fold 부분으로 시작하는 다중 문자 fold를 가진 다른 문자가 오는 경우에만 발생했어요.
"s\N{U+DF}" =~ /[\x{DF}foo]/i
\xDF는 "ss"로 fold돼요. (5.14.1)
- 정규식 패턴 매칭의 몇 개 문자가 모두
</i>와 관련된 일부 상황에서 올바르게 매치하지 않았어요. 영향받는 문자: COMBINING GREEK YPOGEGRAMMENI, GREEK CAPITAL LETTER IOTA, GREEK CAPITAL LETTER UPSILON, GREEK PROSGEGRAMMENI, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS, LATIN SMALL LETTER LONG S, LATIN SMALL LIGATURE LONG S T, LATIN SMALL LIGATURE ST. - threading 아래 정규식 컴파일의 메모리 누수 회귀 수정.
- 5.14.0에 도입된 회귀 수정. 이는 유니코드 속성만으로 구성된 정규식의 역 대괄호 문자 클래스와 관련됐어요. 그 속성이 Latin1 범위 밖에서 역전되지 않았어요.
- 세 문제 유니코드 문자가
</i>아래 정규식 패턴 매칭에서 이제 더 잘 동작. 과거에 LATIN SMALL LETTER SHARP S, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS이 fold하는 시퀀스("ss" 포함)와 함께</i>아래 제대로 매치되지 않았어요. 5.14.0이 일부 수정했지만,(?(DEFINE)정규식 술어에서 문자·시퀀스를 쓰면 panic을 포함한 다른 문제를 도입했어요. 5.14에 도입된 알려진 버그와 그때까지 동작하지 않던 다른 경계 경우가 수정됨. 이 모두</i>아래 대괄호 문자 클래스 밖에서 문자·시퀀스를 쓰는 것과 관련돼요. [perl #98546] 닫음. 대괄호 문자 클래스 안에서 다중 문자 fold를 가진 특정 문자를 쓰면 알려진 문제가 남아 있어요 —qr/[\N{LATIN SMALL LETTER SHARP S}a-z]/i같은 구성 포함. [perl #89774] - RT #78266: 정규식 엔진이 정규식의 일부로 매치되지 않은 이름 붙은 캡처에 접근할 때 5.10에서 도입 이후 메모리를 누출하고 있었어요. 예를 들어 이 코드가 1억 MB 넘게 소모했어요:
for (1..10_000_000) {
if ("foo" =~ /(foo|(?<capture>bar))?/) {
my $capture = $+{capture}
}
}
system "ps -o rss $$"'
- 5.14에서
</[[:lower:]]/i>과</[[:upper:]]/i>이 더 이상 반대 대소문자를 매치하지 않았어요. 수정됨 [perl #101970]. - 오른쪽에 overloaded 객체가 있는 정규식 매치가 때때로 객체를 너무 여러 번 문자열화했어요.
- 5.14에 도입된 회귀 수정 —
</i>정규식 매칭에서 패턴이 UTF-8이고 대상 문자열이 아니며, 패턴과 매치해야 할 문자열의 문자가 앞에 Latin-1 문자가 오면 매치가 부적절하게 실패했어요 [perl #101710]. - 대소문자 구분 없는 정규식 패턴 매칭에서 UTF-8 인코딩 문자열에 대해 더 이상 매치 시작 스캔이 첫 가능 위치만 보지 않아요. 이는
"f\x{FB00}" =~ /ff/i같은 매치 실패를 일으켰어요. - regexp 최적화 프로그램이 불편한 내용의 고정 문자열 노드를 병합할 때 디버그 빌드에서 더 이상 크래시하지 않음.
- 5.14.0에 도입된 정규식 수정자
</aa>와\b이스케이프 시퀀스 조합 관련 panic 수정 [perl #95964]. (5.14.2) </aa>와\b·\B조합이 UTF-8 인코딩 문자열에서 제대로 동작하지 않았어요.</aa>아래의 모든 비ASCII 문자는 비단어 문자로 취급돼야 하지만, 유니코드 규칙으로 비ASCII 문자의 단어성/비단어성을 판단하고 있었어요. 수정됨 [perl #95968].(?foo: ...)이 더 이상 전달된 문자 집합을 잃지 않음.- trie 최적화가 빈
(?:)를 포함한 분기 문제가 있어서"x" =~ /\A(?>(?:(?:)A|B|C?x))\z/이 매치되어야 하는데 그러지 못했어요 [perl #111842]. - 정규식에 포함된 코드 블록에서 어휘(
my) 변수를 쓰는 게 더 이상 메모리 손상·크래시를 일으키지 않아요. 다만 (루프 등에서) 잘못된 변수가 폐쇄되거나 (die 등) 비정상 종료가 메모리 손상을 일으키는 문제가 여전히 있어 이 코드 블록은 여전히 실험적이에요. \h,\H,\v,\V정규식 메타문자가 문자열 끝에서 매치하려 하면 panic 오류 메시지를 일으키곤 했어요 [perl #96354].- 네 C1 제어 문자 MW·PM·RI·ST의 약어를
\N{}, vianame(), string_vianame()이 인식하지 못했어요. $&외의 "&" 이름 변수(즉@&또는%&)를 언급하는 게 더 이상$&동작을 멈추지 않아요. "'"와 "`" 이름 변수에도 같게 적용 [perl #24237].UNIVERSAL::AUTOLOADsub을 만드는 게 더 이상%+,%-,%!가 때때로 동작을 멈추게 하지 않아요 [perl #105024].
Smartmatching
~~이 이제 Any~~Object의 우선순위를 올바르게 처리하고, 왼쪽의 overloaded 객체에 속지 않아요.- Perl 5.14.0에서
$tainted ~~ @array가 제대로 동작하지 않았어요. 때로는 잘못 실패하거나(첫 요소 뒤 배열에 나타나는 문자열을$tainted가 담으면) 잘못 성공했어요(첫 요소 뒤에undef가 오면) [perl #93590].
sort 연산자
sort이 비교 루틴으로 제공된sub {}과sub {()}을 동등하게 취급하지 않았어요.sub {()}에서 croak하곤 했어요.sort이 XSUB인 커스텀 sort 루틴에서 다시 동작. 5.10.0에서 멈췄어요.- 커스텀 sort 루틴에 대한 상수인
sort이 정렬되지 않은 결과를 만들긴 하지만 더 이상 크래시하지 않아요. 5.10.0에서 크래시하기 시작했어요. - 커스텀 비교 루틴이 숫자가 아닌 값을 돌려줄 때
sort이 내는 경고가 이제 "in sort"를 포함하고 비교 루틴의 마지막 줄이 아니라sort연산자의 줄 번호를 보여줘요. 경고도 이제sort이 발생하는 스코프에서 경고가 활성화된 경우에만 발생해요. 이전에는 비교 루틴의 스코프에서 활성화되면 발생했어요. - 내부적으로 최적화되는
sort { $a <=> $b }이 이제 NaN에 대해<=>가undef를 돌려주므로 "uninitialized" 경고를 냅니다. 이는 최적화되지 않는sort { 1; $a <=> $b }및 다른 복잡한 경우와 일치하게 해요 [perl #94390].
substr 연산자
- tied(및 기타 magic) 변수가 더 이상 "Attempt to use reference as lvalue in substr" 경고에서 면제되지 않아요.
- 그 경고가 이제
substr자체가 아니라 반환된 lvalue에 할당될 때 발생해요. 이는substr의 반환 값이 참조된 뒤 나중에 할당되는 경우에만 차이를 만들어요. - 읽기 전용 값이나 typeglob의 부분 문자열을 함수(잠재적 lvalue 문맥)에 전달하는 게 더 이상 즉시 "Can't coerce"이나 "Modification of a read-only value" 오류를 일으키지 않아요. 그 오류는 전달된 값에 할당할 때만 발생해요. "substr outside of string" 오류에도 같게. lvalue를 읽기만 하면 rvalue
substr처럼 이제 그냥 경고예요. substr할당이 첫 인자가 tied 변수면 더 이상 FETCH를 두 번 호출하지 않고 한 번만 호출해요.
임베디드 null 지원
Perl의 일부 부분이 문자열에 임베디드된 null(chr 0)과 제대로 동작하지 않았어요. 즉 $m = "a\0b"; foo->$m이 $m에 담긴 실제 메서드 이름 대신 "a" 메서드를 호출한다는 뜻이었어요. null을 지원하도록 수정된 부분: 메서드 이름, typeglob 이름(파일핸들·서브루틴 이름 포함), 패키지 이름(ref() 반환 값 포함), typeglob 요소(*foo{"THING\0stuff"}), 시그널 이름, 변수 이름·값·메서드 등을 언급하는 각종 경고·오류 메시지. 이 변경의 부작용 하나는 "\0"으로 bless하는 게 더 이상 ref()가 false를 돌려주지 않게 한다는 거예요.
Threading 버그
- 스레드에서 돌려받은 typeglob이 부모 스레드가 같은 이름의 glob을 이미 가지면 더 이상 복제되지 않아요. 즉 돌려받은 서브루틴이 이제 올바른 패키지 변수에 할당해요 [perl #107366].
- 클로닝 중 메모리 할당으로 스레드가 크래시하던 일부 경우가 수정됨 [perl #90006].
- 스레드 생성 전에
DB패키지에서caller를 쓰면 스레드 조인이 때때로 "Attempt to free unreferenced scalar" 경고를 냈어요 [perl #98092]. - (
lock &sub로) 서브루틴을 잠그는 게 일반 sub에서 더 이상 컴파일 타임 오류가 아니에요. lvalue 서브루틴의 경우 sub을 스칼라로 돌려주려 하지 않아ref \$_이 때때로 "CODE"를 돌려주는 이상한 부작용이 없어져요.lock &sub은 이제threads::shared가 로드되면 런타임 오류이고(그 외에는 no-op), 향후 버전에서 고쳐질 수 있어요.
Tied 변수
FETCH가 무시되거나 너무 많이 호출되던 다양한 경우가 수정됨:
PerlIO::get_layers[perl #97956]$tied이 참조를 담을 때$tied =~ y/a/b/,chop $tied,chomp $tiedlocal $_호출 시 [perl #105912]- 네 인자
select sysread에 전달된 tied 버퍼$tied .= <>- 세 인자
open(세 번째가 tied 파일핸들,open $fh, ">&", $tied처럼) - 비교 루틴에 대한 tied glob 참조가 있는
sort - 목록 문맥의
..·...[perl #53554] - tied 변수가 문자열을 돌려줄 때
${$tied},@{$tied},%{$tied},*{$tied}(&{}는 영향 없음) defined ${ $tied_variable }- rvalue 문맥에서 파일핸들 인자를 받는 다양한 함수(
close,readline등) [perl #97482] ${ (), $tied } = 1같은 복잡한 식 역참조의 일부 경우가 FETCH를 여러 번 호출하곤 했는데 이제 한 번 호출해요.$tied->method— $tied가 패키지 이름을 돌려주면 메모리 손상으로 메서드 호출 실패까지 유발.*$tied = \&{"..."}과*glob = $tied같은 할당chdir,chmod,chown,utime,truncate,stat,lstat과 filetest op(-r,-x등)
추가로:
caller는 DB 패키지에서 호출될 때@DB::args를 서브루틴 인자로 설정해요.@DB::args가 tie되어 있으면 그때 크래시하곤 했어요. 이제 대신 croak해요.- %ENV나
%^H의 요소를 tie한 뒤 그 요소를 삭제하면 tie 객체의 DELETE 메서드 호출이 됐어요. 요소 자체를 tie하는 게 스칼라를 tie하는 것과 같아야 하는데 말이죠(요소는 물론 스칼라) [perl #67490]. - Perl이 tied 배열·해시의 요소를 자동 활성화할 때(새 참조로 STORE 호출 포함) 이제 STORE 직후 FETCH를 호출해요. FETCH가 같은 참조를 돌려줄 거라고 가정하는 대신요. 이는 tied 객체 구현을 더 쉽게 만들어요 [perl #35865, #43011].
- 네 인자
select가 문자열인 tied·tainted 변수에 대해 더 이상 "Non-string passed as bitmask" 경고를 내지 않아요. - typeglob을 돌려주는 tied 스칼라를 localize하는 게 더 이상 스코프 끝까지 tie되는 걸 막지 않아요.
- tied 핸들 메서드에서
goto하려 하는 게 메모리 손상·크래시를 일으키곤 했어요. 이제 오류 메시지를 냅니다 [perl #8611]. - tied 변수를 서브루틴 참조로 쓸 때 버그 수정: 변수에 마지막으로 할당되거나 반환된 것이 참조나 typeglob이면
\&$tied이 크래시하거나 잘못된 서브루틴을 돌려줄 수 있었어요. 참조 경우는 Perl 5.10.0에 도입된 회귀였고, typeglob의 경우 지금까지 거의 동작한 적이 없었어요.
버전 객체와 vstring
- 비트 보수 연산자(그리고 어쩌면 다른 연산자)가 vstring을 받으면 문자열이 바뀌었음에도 반환 값에 vstring magic이 붙어 있었어요. 즉
version->new(~v1.2.3)이 실제로 전달된 문자열이 "\376\375\374"임에도 "v1.2.3"처럼 보이는 버전을 만들었어요. 이것은B::Deparse가~v1.2.3을~없이 잘못 deparse하게 했어요 [perl #29070]. - magic(예: tied,
$!) 변수에 vstring을 할당한 뒤 다른 것을 할당하면 모든 magic이 사라지곤 했어요. 즉 tied 변수가 풀리고,$!이 실패한 시스템 콜에서 갱신을 멈추고,$|이 autoflush 설정을 멈추는 등 말썽이 생겼어요. 수정됨. version->new("version")과printf "%vd", "version"이 더 이상 크래시하지 않아요 [perl #102586].use v5.43으로 암묵적으로 발생하는 버전 비교가 더 이상 로케일 설정을 바꾸지 않아요 [perl #105784].- 버전 객체가 불리언 문맥에서 메모리 누수를 일으키지 않아요 [perl #109762].
경고, 재정의
autouse네임스페이스의 서브루틴이 재정의 경고에서 다시 한번 면제돼요. 5.005에서 동작했지만 5.6에서 대부분의 서브루틴에 대해 깨졌어요.autouse패키지의 서브루틴을 재정의하는 XS로 만든 sub의 경우 5.10에서 동작을 멈췄어요.- 새 XSUB이 기존 sub을 덮어쓰면 5.8.x처럼 재정의 경고를 냅니다. (5.10-14에서 autouse 로직이 뒤집혔어요.)
newCONSTSUB이 런타임 힌트 대신 컴파일 타임 경고 힌트를 쓰곤 했어요. 다음 코드는 재정의 경고를 내서는 안 되지만,newCONSTSUB이 기존 서브루틴을 재정의하면 예전에는 냈어요:
use warnings;
BEGIN {
no warnings;
some_XS_function_that_calls_new_CONSTSUB();
}
- 상수 서브루틴의 재정의 경고는 기본으로 켜져 있어요(perldiag에서 severe warnings로 알려짐). 이는 경고를 일으킨 게 glob 할당이나 Perl 서브루틴 선언일 때만 발생했어요. XSUB 생성이 경고를 발화시키면 기본 경고가 아니었어요. 수정됨.
- 재정의 경고가 발생해야 하는지 보는 내부 검사가 이런 경우 "uninitialized" 경고를 내곤 했어요:
use warnings "uninitialized";
use constant {u => undef, v => undef};
sub foo(){u}
sub foo(){v}
경고, "Uninitialized"
- rvalue 문맥에서 파일핸들 인자를 받는 다양한 함수(
close,readline등)가 undefined 핸들에 대해 두 번 경고하곤 했어요 [perl #97482]. dbmopen이 mode 인자가undef면 세 번이 아니라 이제 한 번만 경고해요 [perl #90064].+=연산자가 왼쪽이undef일 때 보통 경고하지 않지만 tied 변수에서는 경고하고 있었어요. 수정됨 [perl #44895].- Perl 5.14의 버그 수정이 새 버그를 도입해, 연산자가 두 피연산자를 갖고 하나가
%{...}나@{...}이면 "uninitialized" 경고가 잘못된 변수를 보고했어요. 수정됨 [perl #103766]. - 목록 문맥의
..·...이 문자열(숫자가 아닌) 범위의 "uninitialized" 경고에서 이제 변수 이름을 언급해요.
약한 참조
- 자동 호출되는
DESTROY메서드의 첫 인자를 약화시키면 잘못된 "DESTROY created new reference" 오류·크래시를 일으킬 수 있었어요. 이제 읽기 전용 참조를 약화시키는 건 오류예요. - 스코프를 벗어나는 어휘 해시에 대한 약한 참조가 stale(undefined)로 가지 않고 해시를 계속 가리켰어요.
- 스코프를 벗어나는 어휘 변수에 대한 약한 참조가 이제 magic 메서드(예: tie 객체의 DESTROY)가 호출되기 전에 끊겨요. 이는 그런 메서드가 다음에 스코프에 들어갈 때 보일 변수를 수정하는 걸 막아요.
- @ISA 배열에 대한 약한 참조를 만들거나 배열 인덱스(
$#ISA)에 접근하면 나중에 @ISA 배열에 추가되는 요소의 내부 장부가 혼란스러워질 수 있었어요. 예를 들어 요소 자체에 대한 약한 참조를 만들면 그 약한 참조가 @ISA에 밀려들어갈 수 있고,$#ISA사용 후 추가된 요소는 메서드 조회에서 무시됐어요 [perl #85670].
기타 주목할 만한 수정
quotemeta가 이제use feature 'unicode_strings'아래에서 문자열이 UTF-8로 인코딩됐든 아니든 같은 비ASCII 문자를 일관되게 따옴표 처리해, 악명 높은 "Unicode Bug"의 마지막 잔재를(희망컨대) 고쳐요 [perl #77654]. 따옴표 처리되는 코드 포인트가 유니코드 권장사항에 따라 바뀌었어요.perlfunc의 quotemeta 참고.study가 이제 no-op이며, 아마 study가 정규식 매치를 잘못 동작하게 하는 모든 미해결 버그를 수정했을 거예요!open foo || die(Perl 4에서 동작하던)를 쓰면 "Precedence problem" 경고가 발생해요. 이 경고는||뒤에 오지 않는 완전 정규화 bareword 핸들 이름에 잘못 적용되곤 했어요. 수정됨.- 패키지 별칭(
*foo:: = *bar::) 후에 0·1 인자select가 때때로 파일핸들을 가리키는 데 쓸 수 없는 이름을 돌려주거나, 파일핸들이 선택됐음에도undef를 돌려줬어요. 이제 그런 경우 typeglob 참조를 돌려줘요. PerlIO::get_layers가 숫자라고 생각하는 일부 인자를 무시하고 다른 것은 파일핸들 이름으로 취급하지 않아요. 이제 평면 스칼라(즉 참조가 아님)에서 일관돼요.#!줄의 인식되지 않는 스위치:-x처럼#!줄에 올 수 없는 스위치를 거기 쓰면 perl이 "Can't emulate..."로 죽어요. 이전에는 명령줄이든#!줄이든 perl이 전혀 인식하지 못한 스위치에도 같은 메시지를 냈어요. 이제 "Unrecognized switch" 오류 메시지를 냅니다 [perl #104288].system이 이제 SIGCHLD 시그널 핸들러를 잠시 차단해, 핸들러가 종료 상태를 가로채는 걸 막아요 [perl #105700].printf·sprintf의%n포맷 코드(문자 수를 다음 인자에 할당)가 이제 바이트 수 대신 실제 문자 수를 할당해요. 또한substr같은 특수 lvalue 함수와 존재하지 않는 해시·배열 요소에서도 동작 [perl #3471, #103492].- Perl은 관찰 가능한 차이가 없으면 속도를 위해 서브루틴에서 돌려받은 값 복사를 건너뛰어요. 잘못된 로직 때문에 결과가 다른 곳에서 참조되더라도
delete,shift,splice의 결과에서 이렇게 했어요. 해제하려는 tied 변수에서도 했죠 [perl #91844, #95548]. utf8::decode가 이제 읽기 전용 스칼라를 수정하기를 거부해요 [perl #91850].grep·map블록, 정규식에 포함된 코드 블록, @INC 필터(@INC의 서브루틴이 돌려주는 서브루틴) 안에서$_를 해제하면 이중 해제·크래시를 일으키곤 했어요 [perl #91880, #92254, #92256].eval이 런타임 오류가 있으면 스칼라 문맥에서undef를, 목록 문맥에서 빈 목록을 돌려줘요.eval에 목록 문맥의 문자열이 전달되고 문법 오류가 발생하면 undefined 요소 하나를 담은 목록을 돌려주곤 했어요. 이제 모든 오류에 대해 목록 문맥에서 빈 목록을 돌려줘요 [perl #80630].goto &func이 현재 서브루틴의 스코프 펼침이 "goneto" 서브루틴을 undef하는 소멸자를 발화시키면 크래시하는 대신 오류 메시지를 냅니다 [perl #99850].- Perl이 코드가 현재 컴파일되고 있는 패키지에 추가 참조 카운트를 유지해요. 이로써 다음 코드가 더 이상 크래시하지 않아요 [perl #101486]:
package Foo;
BEGIN {*Foo:: = *Bar::}
sub foo;
x반복 연산자가 64비트 빌드에서 큰 반복 횟수로 크래시하지 않아요 [perl #94560].*CORE::GLOBAL::require가 오버라이드됐을 때 암시적$_에require를 호출하는 게 더 이상 segfault하지 않고,$_이 이제 오버라이드 서브루틴에 전달돼요 [perl #78260].use와require가 이제 호출자 스코프에서 활성화된 I/O 레이어(open.pm이 활성화)의 영향을 받지 않아요 [perl #96008].our $::é; $é(잘못됨)이 더 이상 5.10.0에서 내기 시작한 "Compilation error at lib/utf8_heavy.pl..." 오류 메시지를 내지 않아요 [perl #99984].- 64비트 시스템에서
read()이 이제 32비트 범위를 넘는 큰 문자열 오프셋을 이해해요. - 서브루틴 속성 처리 중 발생하는 오류가 더 이상 서브루틴의 op 트리 누수를 일으키지 않아요.
- 같은 상수 서브루틴을
index와formline둘 다에 넘기는 게 더 이상 둘 중 하나를 실패하게 하지 않아요 [perl #89218]. (5.14.1) - 같은 문에서 속성으로 선언된 어휘 변수에 대한 목록 할당(
my ($x,@y) : blimp = (72,94))이 Perl 5.8.0에서 동작을 멈췄어요. 수정됨. - Perl 5.10.0이 pack 템플릿 중간의 "U*"가 입력 문자열이 비어 있으면 "U0"과 동등하게 만드는 잘못된 로직을 도입했어요. 수정됨 [perl #90160]. (5.14.2)
- 어떤 스칼라도 참조하지 않는 객체의 소멸자가 전역 소멸 중 호출되지 않았어요. 배열 요소가 bless되거나(
bless \$a[0]) 클로저가 bless된 변수를 참조하면(bless \my @a; sub foo { @a }) 생길 수 있었어요. 이제 전역 소멸에 스칼라가 참조하는 객체를 검사하는 일반 패스 이후 남을 수 있는 객체의 소멸자를 발화시키는 추가 패스가 있어요 [perl #36347]. - here 문서 파싱 중 해제된 버퍼에서 읽힐 수 있던 경우 수정 [perl #90128]. (5.14.1)
each(배열)이 이제while조건 안에서each(해시)처럼defined(...)로 감싸져요 [perl #90888].do블록이return의 인자일 때 문맥 전파 문제 수정.if블록 안의return다음에 또 다른return이 오는 특정 경우에undef를 돌려주곤 했어요.- tainted 상수로
index를 호출하는 게 더 이상 이후 컴파일 코드의 상수를 taint하지 않아요 [perl #64804]. 1 while 1같은 무한 루프가 블록의 나머지에서strict 'subs'모드가 동작하는 걸 멈추게 하곤 했어요.($a,$b) = ($b,$a)같은 목록 할당에서 Perl은 왼쪽에 할당하기 전에 오른쪽 항목을 복사해야 해요. 효율을 위해 어떤 변수도 양쪽에 언급되지 않으면(예:($a,$b) = ($c,$d)) 오른쪽 값을 왼쪽 항목에 바로 할당해요. 속임수를 쓸 수 있는지 판단하는 로직이 잘못돼 오른쪽의&&·||가 속일 수 있었어요. 그래서($a,$b) = $some_true_value && ($b,$a)이 두 스칼라에$b값을 할당하게 됐어요.- Perl이 더 이상
("string", $variable) ||= 1의 문자열에 lvalue 문맥을 적용하려 하지 않아요(예전에는 오류였죠).||=의 왼쪽은 스칼라 문맥에서 평가되므로 마지막 항목을 제외한 모두에 void 문맥을 주는 스칼라 콤마 연산자예요. void lvalue 문맥 같은 건 없으니 Perl이 강제로 하려 한 건 실수였어요 [perl #96942]. caller가 DB 패키지에서, 첫caller호출 후@DB::args에 할당됐으면 메모리를 누출하곤 했어요.Carp가 이 버그를 발화시켰어요 [perl #97010]. (5.14.2)close와 비슷한 파일핸들 함수가 내장 전역 변수(예:$+)에서 호출되면, 변수가 undefined 값을 담고 있으면 보통의 "Use of uninitialized value" 경고 대신 죽곤 했어요.- 자동 활성화 파일핸들이 Perl 5.6.0에 도입됐을 때,
readline이readline($foo)(그러나<$foo>는 아님)로 호출될 때 자동 활성화되게 잘못 만들어졌어요. 이제 절대 자동 활성화하지 않도록 수정. - undefined 익명 서브루틴 호출(
undef &{$x = sub{}}후 $x가 담는 것)이 "Not a CODE reference" 오류를 내곤 했는데 "Undefined subroutine called"로 수정됨 [perl #71154]. caller사용 사이에@DB::args가 해제되게 하는 게 더 이상 크래시하지 않아요 [perl #93320].setpgrp($foo)이 인자가 하나면setpgrp가 인자를 무시해서($foo, setpgrp)과 동등했어요. 이제setpgrp($foo,0)과 동등해요.shmread이 공유 메모리에서 읽을 때 스칼라 플래그를 올바르게 설정하지 않아 스칼라의 기존 캐시된 숫자 표현이 유지되곤 했어요 [perl #98480].++과--이 이제 glob 복사본에서 죽는 대신 동작.splice()이 잘릴 때 경고하지 않아요. 이제splice(@a,MAX_LEN)으로 배열 크기를 제한할 수 있어요.$$이 더 이상 tainted되지 않아요. 이 값이getpid()에서 직접 오므로 항상 안전해요.- 파서가 STDIN이 파싱 시작 전에 닫혀 있으면 파일핸들을 더 이상 누출하지 않아요 [perl #37033].
die;이 $@에 비참조·비문자열·magic(예: tainted) 값을 담으면 그 값을 이제 제대로 전파해요 [perl #111654].
알려진 문제 (Known Problems)
- Solaris — 두 종류 실패가 있어요.
make가 Sun의make이면 F에서 잘못 형성된 매크로 할당 오류가 나요. 이는 ./Configure가 depends를 만들려 할 때 발생하고, Configure는 0으로 종료하지만 추가make는 실패해요.make가gmake이면 Configure는 완료되지만 F</usr/include/stdbool.h> 관련 오류가 나요. - Win32 — STDERR이 리다이렉트되지 않으면 여러 테스트가 멈춰요. 원인은 조사 중.
- 루트로 빌드할 때 파일이 other-readable이 되지 못하게 하는 umask를 쓰면 F<t/op/filetest.t>가 실패해요. 이건 perl 동작이 아니라 테스트 버그예요.
- 최근 gcc와 링크 타임 최적화(예:
Configure -Doptimize='-O2 -flto')로 설정하면 옵티마이저가 Configure 일부 테스트를 최적화해 실패해요. 우회책은 Configure 실행 시-flto플래그를 빼고 실제 빌드 때 다시 넣는 거예요:
sh Configure -Doptimize=-O2
make OPTIMIZE='-O2 -flto'
- 다음 CPAN 모듈이 perl 5.16과 테스트 실패가 있어요. 전부 패치가 제출되어 곧 새 릴리스가 나올 거예요:
Date::Pcalc6.1Module::CPANTS::Analyse0.85 —Module::Find0.10과File::MMagic1.27의 문제 때문.PerlIO::Util0.72
감사의 말 (Acknowledgements)
Perl 5.16.0은 Perl 5.14.0 이후 약 12개월의 개발을 나타내며, 139명의 저자가 2,500개 파일에 걸쳐 약 590,000줄의 변경을 담고 있어요.
이 릴리스에 기여한 것으로 알려진 사람들: Aaron Crane, Abhijit Menon-Sen, Abigail, Alan Haggai Alavi, Alberto Simões, Alexandr Ciornii, Andreas König, Andy Dougherty, Aristotle Pagaltzis, Bo Johansson, Bo Lindbergh, Breno G. de Oliveira, brian d foy, Brian Fraser, Brian Greenfield, Carl Hayter, Chas. Owens, Chia-liang Kao, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Christopher J. Madsen, chromatic, Claes Jacobsson, Claudio Ramirez, Craig A. Berry, Damian Conway, Daniel Kahn Gillmor, Darin McBride, Dave Rolsky, David Cantrell, David Golden, David Leadbeater, David Mitchell, Dee Newcum, Dennis Kaarsemaker, Dominic Hargreaves, Douglas Christopher Wilson, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frederic Briere, George Greer, Gerard Goossen, Gisle Aas, H.Merijn Brand, Hojung Youn, Ian Goodacre, James E Keenan, Jan Dubois, Jerry D. Hedden, Jesse Luehrs, Jesse Vincent, Jilles Tjoelker, Jim Cromie, Jim Meyering, Joel Berger, Johan Vromans, Johannes Plunien, John Hawkinson, John P. Linderman, John Peacock, Joshua ben Jore, Juerd Waalboer, Karl Williamson, Karthik Rajagopalan, Keith Thompson, Kevin J. Woolley, Kevin Ryde, Laurent Dami, Leo Lapworth, Leon Brocard, Leon Timmermans, Louis Strous, Lukas Mai, Marc Green, Marcel Grünauer, Mark A. Stratman, Mark Dootson, Mark Jason Dominus, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Witten, Mike Sheldrake, Moritz Lenz, Nicholas Clark, Niko Tyni, Nuno Carvalho, Pau Amma, Paul Evans, Paul Green, Paul Johnson, Perlover, Peter John Acklam, Peter Martini, Peter Scott, Phil Monsen, Pino Toscano, Rafael Garcia-Suarez, Rainer Tammer, Reini Urban, Ricardo Signes, Robin Barker, Rodolfo Carvalho, Salvador Fandiño, Sam Kimbrel, Samuel Thibault, Shawn M Moore, Shigeya Suzuki, Shirakata Kentaro, Shlomi Fish, Sisyphus, Slaven Rezic, Spiros Denaxas, Steffen Müller, Steffen Schwigon, Stephen Bennett, Stephen Oberholtzer, Stevan Little, Steve Hay, Steve Peters, Thomas Sibley, Thorsten Glaser, Timothe Litt, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tony Cook, Vadim Konovalov, Vincent Pit, Vladimir Timofeev, Walt Mankowski, Yves Orton, Zefram, Zsbán Ambrus, Ævar Arnfjörð Bjarmason.
이 목록은 버전 관리 기록에서 자동 생성되므로 거의 확실히 불완전해요. 특히 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이 지원되는 모든 플랫폼에서 문제를 완화·수정하는 패치 릴리스 조정을 도와줘요. 이 주소는 Perl 코어의 보안 이슈에만 쓰고, CPAN에 독립 배포된 모듈에는 쓰지 마세요.
같이 보기 (SEE ALSO)
- F
파일 — 무엇이 바뀌었는지 상세를 보는 방법 설명. - F
파일 — Perl 빌드 방법. - F
파일 — 일반 사항. - F
·F 파일 — 저작권 정보.