Perl 5.22.0 변경 사항
Perl 5.22.0 변경 사항 (perl5220delta)
이 문서는 Perl 5.20.0 릴리스와 5.22.0 릴리스 사이의 차이를 설명해요.
5.18.0 같은 더 오래된 릴리스에서 업그레이드하는 경우, 5.18.0과 5.20.0 사이의 차이를 설명하는 perl5200delta를 먼저 읽어 보세요.
핵심 개선 사항
새로운 비트 연산자
네 가지 표준 비트 연산자(& | ^ ~)가 피연산자를 일관되게 숫자로 취급하도록 만드는 새로운 실험적 기능이 추가되었어요. 그리고 피연산자를 일관되게 문자열로 취급하는 네 가지 점(dot) 연산자(&. |. ^. ~.)도 새로 도입됐죠. 대입 변형(&= |= ^= &.= |.= ^.=)에도 똑같이 적용돼요.
이 기능을 쓰려면 bitwise 피처를 켜고 experimental::bitwise 경고 카테고리를 꺼야 해요. 자세한 내용은 perlop의 "Bitwise String Operators"를 보세요.
새로운 이중 다이아몬드 연산자
<<>>는 <>과 비슷하지만, @ARGV의 각 파일을 세 인자 open으로 여는 방식이에요. 즉 @ARGV의 각 요소를 실제 파일 이름으로 취급해서, "|foo"가 파이프 open으로 처리되지 않아요.
정규 표현식의 새로운 \b 경계
qr/\b{gcb}/ — gcb는 Grapheme Cluster Boundary(자소 클러스터 경계)예요. 원어민에게 하나의 문자처럼 보이는 문자 시퀀스 사이의 경계를 찾아주는 유니코드 속성이죠. Perl은 오래전부터 \X 정규 이스케이프로 이를 다뤄왔는데, 이제 다른 방식으로도 처리할 수 있어요. 자세한 내용은 perlrebackslash의 "\b{}, \b, \B{}, \B"를 보세요.
qr/\b{wb}/ — wb는 Word Boundary(단어 경계)예요. 단어 사이의 경계를 찾는 유니코드 속성으로, 일반 \b와 비슷하지만 자연어 처리에 더 적합해요. 예를 들어 아포스트로피가 단어 중간에 올 수 있다는 걸 알고 있죠.
qr/\b{sb}/ — sb는 Sentence Boundary(문장 경계)예요. 자연어 문장을 분석할 때 도움이 되는 유니코드 속성이에요.
비캡처 정규 표현식 플래그
정규 표현식이 이제 그룹 안에서 $1, $2 등의 캡처와 채우기를 비활성화하는 /n 플래그를 지원해요:
"hello" =~ /(hi|hello)/n; # $1은 설정되지 않음
이것은 모든 캡처 그룹 앞에 ?:를 붙인 것과 같은 효과예요. 자세한 내용은 perlre의 "n"을 보세요.
use re 'strict'
이 기능은 스코프 안에서 컴파일되는 정규 표현식 패턴에 더 엄격한 문법 규칙을 적용해요. 오타나 의도하지 않은 동작을 미리 찾아내는 데 도움이 되죠. 이 동작은 앞으로 바뀔 수 있기 때문에 experimental::re_strict 카테고리의 경고를 발생시켜요.
유니코드 7.0(수정판) 지원
이 릴리스의 내용은 유니코드 공식 사이트에서 볼 수 있어요. Perl에 딸려 오는 유니코드 7.0 버전에는 아랍어 글리프 셰이핑 관련 수정이 포함되어 있어요.
use locale이 특정 로케일 카테고리만 제한 가능
이제 use locale에 매개변수를 넘겨서 로케일을 인식할 카테고리 일부만 지정할 수 있고, 나머지는 영향을 받지 않아요. 자세한 내용은 perllocale의 "The use locale pragma"를 보세요.
POSIX 2008 로케일 통화 추가 지원
POSIX.1-2008을 처리할 수 있는 플랫폼에서는 POSIX::localeconv()가 반환하는 해시에 국제 통화 필드가 포함돼요. 이 필드는 int_n_cs_precedes, int_n_sep_by_space, int_n_sign_posn, int_p_cs_precedes, int_p_sep_by_space, int_p_sign_posn이에요.
구형 플랫폼에서 로케일 UTF-8 여부 판단 휴리스틱 개선
C99도 POSIX 2001도 구현하지 않은 플랫폼에서 현재 로케일이 UTF-8인지 판단하는 건 휴리스틱에 의존하는데, 이번 릴리스에서 이 판단이 개선됐어요.
참조를 통한 별칭(aliasing)
변수와 서브루틴을 이제 참조에 대입해서 별칭으로 만들 수 있어요:
\$c = \$d;
\&x = \&y;
foreach 반복자 변수 앞에 백슬래시를 붙이는 방식으로도 별칭을 만들 수 있어요. 이게 가장 유용한 관용구일 거예요:
foreach \%hash (@array_of_hash_refs) { ... }
이 기능은 실험적이라 use feature 'refaliasing'으로 켜야 해요. experimental::refaliasing 경고 카테고리를 끄지 않으면 경고가 발생해요. 자세한 내용은 perlref의 "Assigning to References"를 보세요.
인자 없는 prototype
인자 없는 prototype()이 이제 $_를 추론해요.
새로운 :const 서브루틴 속성
const 속성을 익명 서브루틴에 적용할 수 있어요. 새 서브루틴이 만들어질 때마다(sub 표현식이 평가될 때) 즉시 실행되고, 그 값이 캡처되어 반환되는 새 상수 서브루틴을 만드는 데 사용돼요. 이 기능은 실험적이에요. 자세한 내용은 perlsub의 "Constant Functions"를 보세요.
fileno가 디렉터리 핸들에서 동작
운영체제가 지원한다면 fileno 빌트인이 이제 디렉터리 핸들에서도 동작해요. 지원하지 않는 운영체제에서는 여전히 undef를 반환하지만, 이제 $!에 "지원되지 않는 연산"이라는 걸 알려줘요. 현재는 OS DIR 구조체의 dd_fd 멤버나 POSIX.1-2008의 dirfd(3) 함수를 사용해요.
Win32에서 파이프 open의 리스트 형식 구현
Win32에서 이제 리스트 형식의 파이프가 구현됐어요:
open my $fh, "-|", "program", @arguments;
Win32 API가 프로그램 인자를 리스트로 받지 않기 때문에 system LIST과 같은 제약이 있어요.
리스트 반복에 대입
좌변이 유효한 lvalue라면 리스트에서 (...) x ...를 대입 대상으로 쓸 수 있어요. 이제 (undef,undef,$foo) = that_function()을 ((undef)x2, $foo) = that_function()으로 쓸 수 있게 됐죠.
무한대와 NaN 처리 개선
부동소수점 값은 무한대, 음의 무한대, NaN(숫자가 아님)을 담을 수 있어요. 이제 이 값들을 계산에서 더 견고하게 인식·전파하고, 출력할 때 Inf, -Inf, NaN 문자열로 정규화해요. POSIX 개선 사항도 함께 보세요.
부동소수점 파싱 개선
부동소수점 값의 파싱과 출력이 개선됐어요. 완전히 새로운 기능으로 16진수 부동소수점 리터럴(0x1.23p-4 같은)을 지원하고, printf "%a"로 출력할 수 있어요. 자세한 내용은 perldata의 "Scalar value constructors"를 보세요.
문자로 무한대·NaN 팩은 이제 치명적 오류
이전에는 무한대나 NaN을 (부호 있는) 문자로 팩하려 하면 경고하고 0xFF를 팩한 것으로 간주했어요. chr에 넘기면 U+FFFD가 반환됐죠. 그러나 이제 이런 모든 동작(pack, chr, print '%c')은 치명적 오류를 일으켜요.
실험적 C 백트레이스 API
Perl은 이제 C 레벨 API를 통해 C 레벨 백트레이스(gdb 같은 심볼릭 디버거가 하는 것과 유사)를 가져올 수 있어요. 백트레이스는 C 호출 프레임의 스택 트레이스와 심볼 이름(함수 이름), 객체 이름("perl" 같은), 가능하면 소스 코드 위치(file:line)를 반환해요. 지원 플랫폼은 Linux와 OS X예요. Configure -Dusecbacktrace로 켜야 해요. 자세한 내용은 perlhacktips의 "C backtrace"를 보세요.
보안
가능하면 Perl을 -fstack-protector-strong으로 컴파일
Perl은 5.10.1부터 -fstack-protector로 컴파일돼 왔는데, 이제 가능하면 더 새로운 변형인 -fstack-protector-strong을 사용해요.
Safe 모듈이 외부 패키지를 대체할 수 있었던 문제
치명적인 버그 수정: 외부 패키지가 대체될 수 있었어요. 이를 해결하기 위해 Safe를 2.38로 패치했어요.
가능하면 Perl을 항상 -D_FORTIFY_SOURCE=2로 컴파일
gcc 4.* 계열의 코드 하드닝 옵션인 _FORTIFY_SOURCE를 가능하면 항상 Perl 컴파일에 사용해요. Fedora 같은 많은 Linux 배포판이 이미 이 옵션을 사용하고 있었고 OS X도 오래전부터 강제해 왔기 때문에 엄청나게 큰 변화는 아니에요.
비호환 변경 사항
서브루틴 시그니처가 속성 앞으로 이동
5.20에서 도입된 실험적 서브 시그니처 기능은 시그니처를 속성 뒤에 파싱했어요. 이 릴리스에서는 사용자 피드백에 따라 시그니처가 서브루틴 이름(있으면) 뒤, 속성 목록(있으면) 앞에 오도록 위치가 바뀌었어요.
&와 \& 프로토타입이 서브만 허용
& 프로토타입 문자는 이제 익명 서브(sub {...}), \&로 시작하는 것, 명시적 undef만 허용해요. 이전에는 배열·해시·리스트 참조도 잘못 허용했어요. 또한 \& 프로토타입은 이제 서브루틴 호출이 아니라 서브루틴만 허용해요. &foo는 여전히 인자로 허용되지만 &foo()와 foo()는 더 이상 안 돼요.
use encoding이 이제 어휘적(lexical)
encoding 프래그마의 효과가 어휘 스코프로 제한됐어요. 이 프래그마는 deprecated지만, 그동안 같은 프로그램에 포함된 무관한 모듈에 부정적 영향을 줄 수 있었는데 이 변경으로 해결됐어요.
빈 리스트를 반환하는 리스트 슬라이스
리스트 슬라이스는 이제 원래 리스트가 비었을 때만(또는 인덱스가 없을 때) 빈 리스트를 반환해요. 이전에는 모든 인덱스가 원래 리스트 밖에 있으면 빈 리스트를 반환했는데, 이제 그 경우 undef 값 리스트를 반환해요.
\N{}의 연속 공백이 이제 치명적 오류
예를 들어 \N{TOO MANY SPACES} 또는 \N{TRAILING SPACE } 같은 경우예요. v5.18부터 deprecated였죠.
use UNIVERSAL '...'이 이제 치명적 오류
UNIVERSAL에서 함수를 임포트하는 건 v5.12부터 deprecated였고, 이제 치명적 오류예요. 인자 없는 use UNIVERSAL은 여전히 허용돼요.
이중 따옴표 \cX에서 X는 이제 인쇄 가능한 ASCII 문자여야 함
이전 릴리스에서는 이 조건을 어기면 deprecation 경고가 발생했어요.
정규 표현식에서 (?>와 (* 토큰 분리는 이제 치명적 컴파일 오류
v5.18부터 deprecated였어요.
qr/foo/x가 이제 모든 유니코드 패턴 공백을 무시
/x 수정자는 가독성을 위해 패턴에 공백과 주석(둘 다 무시됨)을 넣을 수 있게 해줘요. 그동안 유니코드가 지정한 공백 문자가 모두 처리되진 않았는데, 이제 다음 문자들이 추가로 인식돼요:
U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
이 문자들을 브래킷 문자 클래스 밖, 백슬래시가 앞에 없을 때 /x와 함께 쓰는 건 v5.18부터 deprecation 경고였는데, 이제 무시돼요.
(?[ ]) 안의 주석 줄은 이제 \n으로만 종료
(?[ ])는 v5.18에 도입된 실험적 기능으로, 항상 /x가 켜진 것처럼 동작해요. 하지만 차이가 있었죠. # 문자 다음의 주석 줄이 세로 공백 전부(폼 피드 포함)에 해당하는 \R로 종료됐었는데, 일관성을 위해 이제 (?[ ]) 밖의 주석 줄처럼 \n(이스케이프된 것 포함, 히어독 문자열·포맷과 동일)으로 종료되도록 바뀌었어요.
(?[...]) 연산자가 이제 표준 Perl 우선순위를 따름
이 실험적 기능은 정규 표현식 패턴에서 집합 연산을 허용해요. 이전에는 교집합 연산자가 다른 이항 연산자와 같은 우선순위였는데, 이제 더 높아졌어요. 기존 코드가 기대하는 결과와 다를 수 있어요. 자세한 내용은 perlrecharclass의 "Extended Bracketed Character Classes"를 보세요.
해시·배열 이름에서 %와 @ 생략이 더 이상 허용되지 않음
아주 오래된 Perl은 특정 위치에서 배열 이름의 @와 해시 이름의 %를 생략할 수 있게 했어요. Perl 5.000부터 deprecation 경고가 나왔고, 이제 더 이상 허용되지 않아요.
"$!" 텍스트가 use locale 스코프 밖에서 이제 영어
이전에는 거의 모든 것과 달리 $! 텍스트가 항상 현재 프로그램의 기본 로케일에 기반해 나왔어요. 로케일 차이를 처리할 준비가 안 된 프로그램에서는 쓰레기 텍스트가 표시될 수 있으니, 번역 가능한 텍스트를 표시하는 게 낫다고 판단했어요.
"$!" 텍스트가 적절할 때 UTF-8로 반환
$!와 $^E의 문자열화는 실제 텍스트가 비-ASCII UTF-8일 때 UTF-8 플래그가 설정돼요. 5.20 이전 동작을 유지해야 하는 코드는 use bytes와 use locale ":messages" 스코프 안에서 문자열화하면 돼요. bytes 프래그마는 이전처럼 UTF-8 플래그가 설정되지 않게 해요.
명시적 연산자 없는 ?PATTERN? 지원 제거
한 번만 매칭하는 m?PATTERN? 구조에는 m 연산자를 생략하고 물음표 구분자로 직접 쓰는 대체 형식이 있었는데, 5.14.0부터 deprecation 경고가 나왔죠. 이제 ?를 새 연산자에 쓸 수 있도록 문법 오류로 바뀌었어요.
defined(@array)와 defined(%hash) 이제 치명적 오류
v5.6.1부터 deprecated였고 v5.16부터 deprecation 경고가 나왔어요.
해시·배열을 참조로 사용하는 건 이제 치명적 오류
예를 들어 %foo->{"bar"}는 이제 치명적 컴파일 오류를 일으켜요. v5.8 이전부터 deprecated였어요.
* 프로토타입 변경
서브루틴 프로토타입의 * 문자는 대부분의(전부는 아닌) 서브루틴 이름보다 bareword가 우선하게 했었는데, 일관성이 없고 버그가 많았어요. 이제 서브루틴이 항상 bareword보다 우선하도록 바뀌었고, 이는 비슷하게 프로토타입된 빌트인과 일치해요:
sub splat(*) { ... }
sub foo { ... }
splat(foo); # 이제 항상 splat(foo())
splat(bar); # 여전히 splat('bar')
close(foo); # close(foo())
close(bar); # close('bar')
Deprecations(폐기 예정)
undef 외의 값으로 ${^ENCODING} 설정
이 변수는 Perl 스크립트를 ASCII나 UTF-8이 아닌 인코딩으로 작성할 수 있게 해줬어요. 하지만 모든 모듈에 전역적으로 영향을 줘서 잘못된 답과 세그멘테이션 폴트를 일으켰죠. 새 스크립트는 UTF-8로, 오래된 스크립트는 piconv 유틸리티로 손쉽게 UTF-8로 변환하는 게 좋아요.
단일 문자 변수 이름의 비그래픽 문자 사용
단일 문자 변수 이름 문법은 더 긴 변수 이름보다 관대해서 구두점 문자나 심지어 보이지 않는(비그래픽) 문자도 허용했어요. v5.20에서 ASCII 범위 제어 문자를 deprecated했는데, 이제 이전에 허용되던 모든 비그래픽 문자를 deprecated해요. 실제 효과는 use utf8 밖에서 C1 제어 문자(0x80~0xFF), NO-BREAK SPACE, SOFT HYPHEN에만 나타나요.
관찰 가능한 부작용이 있는 sub () { $var } 인라이닝
많은 경우 Perl은 sub () { $var }을 인라이닝 가능한 상수 서브루틴으로 만들어 sub 표현식이 평가될 때 $var 값을 캡처해요. 이후 $var가 수정되면 클로저 동작을 깨뜨릴 수 있죠. 빈 프로토타입(sub ())의 익명 서브루틴에만 적용돼요.
이제 변수가 다른 곳에서 수정될 수 있는 경우를 deprecated로 처리하고 deprecation 경고를 발생시켜요:
sub make_constant {
my $var = shift;
return sub () { $var }; # 괜찮음
}
sub make_constant_deprecated {
my $var;
$var = shift;
return sub () { $var }; # deprecated
}
sub make_constant_deprecated2 {
my $var = shift;
log_that_value($var); # $var가 수정될 수 있음
return sub () { $var }; # deprecated
}
두 번째 예에서 $var가 한 번만 대입되는지 감지하는 건 너무 어려워요. my 선언이 아닌 다른 자리에서 일어난다는 것 자체로 Perl이 의심스럽게 여겨요. 이 경고는 서브 본문이 단순 변수일 때만 발생해요. sub () { do_something() if 0; $var } 같은 더 복잡한 경우에는 변수가 다른 곳에서 수정 가능하면 인라이닝이 일어나지 않도록 동작이 바뀌었어요.
여러 /x 정규 표현식 수정자 사용
이제 다음과 같이 쓰는 건 deprecated예요:
qr/foo/xx;
/(?xax:foo)/;
use re qw(/amxx);
즉 x는 연속된 정규 표현식 패턴 수정자 문자열에 한 번만 나타나야 해요. 이것은 미래 릴리스의 /xx가 브래킷 문자 클래스([...])에서 가독성 공백을 허용하기 위한 준비예요.
\N{...} 문자 별칭에 NO-BREAK 공백 사용이 이제 deprecated
이 비그래픽 문자는 일반 공백과 사실상 구분할 수 없으니 허용되면 안 돼요. 자세한 내용은 charnames의 "CUSTOM ALIASES"를 보세요.
패턴에서 리터럴 {은 이제 이스케이프해야 함
정규 표현식 패턴에 리터럴 왼쪽 중괄호를 넣고 싶다면 백슬래시(\{)를 앞에 붙이거나 [{]처럼 대괄호로 감싸거나 \Q를 써야 해요. 아니면 deprecation 경고가 발생해요. 이는 v5.16에서 예고된 것으로, 언어의 미래 확장을 가능하게 하기 위한 것이에요.
모든 경고를 치명적으로 만드는 것 권장하지 않음
warnings의 "Fatal Warnings" 문서에서 use warnings FATAL => 'all'을 권장하지 않는다고 밝히고, 치명적 경고의 위험에 대해 더 강한 표현을 담았어요.
성능 개선
- 메서드나 클래스 이름이 컴파일 타임에 알려지면 런타임 메서드 조회를 빠르게 하는 해시를 미리 계산해요.
SUPER::new같은 복합 메서드 이름도 컴파일 타임에 파싱해서 런타임 파싱을 절약해요. - 키로 상수나 단순 변수만 쓰는 배열·해시 조회(특히 중첩)가 훨씬 빨라졌어요.
(...)x1,("constant")x0,($scalar)x0이 리스트 문맥에서 최적화돼요. 우항이 상수 1이면 반복 연산자가 사라지고, 상수 0이면 좌항이 단순 스칼라·상수인 한 전체 표현식이 빈 리스트로 최적화돼요. ((foo())x0은 이 최적화 대상이 아니에요.)substr대입이 서브루틴 끝(또는return인자)에서 4-인자substr로 최적화돼요. 이전에는 void 문맥에서만 이 최적화가 일어났어요."\L...","\Q..."등에서 불필요한 "stringify" op가 최적화되어lcfirst,quotemeta등만큼 빨라져요.- 빈 리스트에 대한 대입이 때로 더 빨라져요. 특히 우항의 tied 인자에 대해
FETCH를 부르지 않는 경우가 있어요. use bytes가 스코프에 있거나 문자열이 내부적으로 UTF-8을 안 쓸 때, 비-매지컬·비-tied 문자열에length를 적용하면 최대 20% 성능 향상이 있어요.- 64비트 정수의 대부분의 빌드에서 부동소수점 값만 담은 비-매지컬·비-tied 스칼라의 메모리 사용이 OS에 따라 8~32바이트 줄었어요.
@array = split에서 대입이 최적화되어split이 배열에 직접 쓸 수 있어요. 이전에는@_가 아닌 패키지 배열에만, 그리고 때때로만 일어났는데, 이제 거의 항상 일어나요.join이 이제 상수 폴딩 대상이 돼요.join "-", "a", "b"가 컴파일 타임에"a-b"로 변환되죠. 또한 구분자가 스칼라·상수이고 단일 항목 리스트를 조인하면 문자열화로 단순화되고 구분자는 아예 평가되지 않아요.qq(@array)는 stringify op와 join op 두 개로 구현되는데,qq가 단일 배열만 담고 있으면 문자열화가 최적화되어 사라져요.- void 문맥의
our $var와our($s,@a,%h)가 더 이상 런타임에 평가되지 않아요.state변수도 마찬가지예요. - 성능과 메모리 풋프린트 개선을 위해 많은 내부 함수가 리팩터링됐어요.
- 빈 파일이 감지되면
-T와-B파일 테스트가 더 일찍 반환돼요. - 키가 상수인 해시 조회가 빨라져요.
- 빈 프로토타입과
undef만 담은 본문을 가진 서브루틴이 인라이닝 대상이 돼요. - 패키지의 서브루틴을 더 이상 typeglob에 저장할 필요 없어요. 선언 시 가능하면 stash에 단순 서브 참조를 직접 넣어 메모리를 절약해요. XSUB이나 export된 서브루틴에는 적용되지 않고, typeglob에 캐시하기 때문에 메서드 호출은 되돌려요.
- ASCII 플랫폼에서
utf8::native_to_unicode()와utf8::unicode_to_native()가 최적화돼요. - Win32 Perl은 일부 데이터를 디스크에서 메모리 매핑해 같은 perl 바이너리의 프로세스끼리 공유하므로 프로세스당 8KB 메모리를 덜 써요.
모듈과 프래그마
업데이트된 모듈과 프래그마
v5.20.0 이후 많은 Perl 배포 라이브러리가 업그레이드됐어요. 전체 변경 목록은 다음을 실행하세요:
corelist --diff 5.20.0 5.22.0
주목할 만한 변경은 다음과 같아요: Archive::Tar(2.04, 병렬 테스트 지원), attributes(0.27), B(1.58, B::safename 함수, B::PADNAME/B::PADNAMELIST 클래스, B::REGEXP에 qr_anoncv/compflags 메서드, B::PMOP에 pmregexp), B::Concise(0.996), B::Deparse(1.35, 많은 디파스 버그 수정), 새 모듈 B::Op_private(op_private 필드 플래그 정보), bigint/bignum/bigrat(0.39), Carp(1.36), constant(1.33, 완전 자격 상수 이름 지원), CPAN(2.11, 플러그인/훅 실험 지원), CPAN::Meta::Requirements(2.132), Data::Dumper(2.158, CVE-2014-4330 수정 - 깊은 구조 덤프 시 재귀 제한), DynaLoader(1.32), Encode(2.72), Errno(1.23), experimental(0.013), ExtUtils::CBuilder(0.280221), ExtUtils::Manifest(1.70), ExtUtils::ParseXS(3.28), Fcntl(1.13, Linux 파이프 버퍼 크기 fcntl 명령), File::Find(1.29, 부적절하거나 철자가 틀린 옵션 경고), File::Glob(1.24), HTTP::Tiny(0.054, keep_alive 포크·스레드 안전), IO(1.35), IO::Socket(1.38), IO::Socket::IP(0.37), libnet(3.05, IPv6·SSL 지원), Locale::Codes(3.34), Math::BigInt(1.9997), Module::Metadata(1.000026), overload(1.26), PathTools(3.56), perl5db.pl(1.49), PerlIO::scalar(0.22), Pod::Perldoc(3.25), POSIX(1.53, C99 수학 함수·상수 추가), Safe(2.39), Scalar-List-Utils(1.41, 새 모듈 Sub::Util), SDBM_File(1.13), Time::Piece(1.29), Unicode::Collate(1.12), Unicode::Normalize(1.18, XSUB 제거·순수 Perl), Unicode::UCD(0.61, property_values()/charprop()/charprops_all() 함수 추가), utf8(1.17), version(0.9909), Win32(0.51, GetOSName()가 Windows 8.1 지원), Win32API::File(0.1202), XSLoader(0.20).
제거된 모듈과 프래그마
다음 모듈(및 관련 모듈)이 코어에서 제거됐어요: CGI, Module::Build.
문서화
새로운 문서
perlunicook — Tom Christiansen이 작성한, Perl에서 유니코드를 다루는 예제 문서예요.
기존 문서 변경
perlaix(long double 관련 주석), perlapi(SvSetSV가 set magic을 하지 않는다는 주석, sv_usepvn_flags는 malloc 대신 Newx 사용, NUL 삽입 위치 명확화, 항목을 그룹으로 정리), perldata(단일 문자 변수 이름 문법, 16진수 부동소수점·무한대·NaN), perlebcdic(EBCDIC 지원 개선 반영), perlfilter(LIMITATIONS 섹션 추가), perlfunc(study()가 현재 no-op, 배열 값의 delete/exists를 "strongly discouraged"로, our 문서 개선), perlguts(OOK 예제 업데이트, Unicode·EBCDIC 처리 정보), perlhack(비-ASCII 문자셋·성능 테스트 주석), perlhacktips(정적 메모리 위험, tmpfile/atoi/strtol/strtoul 대체 권장), perlhpux, perllocale, perlmodstyle(PrePAN 링크), perlop, perlpodspec(기본 인코딩 CP1252), perlpolicy(행동 강령·실험 기능 기준), perlport, perlre(/x 수정자 명확화, 새 /n 수정자), perlrebackslash(\b{sb}/\b{wb}/\b{gcb}/\b{g}), perlrecharclass(문자 범위·브래킷 클래스 개선), perlref("Assigning to References" 섹션 추가), perlsec(알고리즘 복잡도·tied 해시), perlsyn(... 문장 명확화), perlunicode(대대적 개정, Noncharacter 코드 포인트), perluniintro, perlvar($] deprecation 철회, ${^ENCODING} deprecated 표시), perlvms, perlxs(XS 코드의 로케일 문제).
진단(Diagnostics)
새로운 오류
- Bad symbol for scalar (P) 내부 요청이 심볼 테이블 항목이 아닌 것에 스칼라 항목을 추가하려 했어요.
- Can't use a hash as a reference (F)
%foo->{"bar"}처럼 해시를 참조로 쓰려 했어요. perl <= 5.6.1은 이 문법을 허용했지만 그러면 안 됐어요. - Can't use an array as a reference (F)
@foo->[23]처럼 배열을 참조로 쓰려 했어요. - Can't use 'defined(@array)' (F)
defined()는 배열엔 유용하지 않아요. 비어 있는지 보려면if (@array) { # not empty }처럼 쓰세요. - Can't use 'defined(%hash)' (F)
defined %hash는 평범한 아직 안 쓴 해시에선 false지만, 반복자·약한 참조·stash 이름 같은 여러 비자명한 상황에서 true가 돼요. 그래서 실용적으로 쓸모없어서 이제 치명적 오류예요. 비어 있지 않은지 보려면if (%hash) { # not empty }처럼 boolean 문맥에 두세요. - Cannot chr %f (F)
chr에 무효한 숫자(무한대나 NaN 같은)를 넘겼어요. - Cannot compress %f in pack (F) 무한대나 NaN을 부호 없는 문자로 변환하려 했는데 말이 안 돼요.
- Cannot pack %f with '%c' (F) 무한대나 NaN을 문자로 변환하려 했어요.
- Cannot print %f with '%c' (F) 무한대나 NaN을 문자(
%c)로 출력하려 했어요. - charnames alias definitions may not contain a sequence of multiple spaces (F) 연속된 여러 공백이 있는 문자 이름을 정의했어요. 단일 공백으로 바꾸세요.
- charnames alias definitions may not contain trailing white-space (F) 공백 문자로 끝나는 문자 이름을 정의했어요.
- :const is not permitted on named subroutines (F)
const속성은 익명 서브루틴이 클론될 때 실행되고 값을 캡처하게 해요. 이름 있는 서브루틴은 이렇게 클론되지 않으므로 의미가 없어요. - Hexadecimal float: internal error (F) 16진수 부동소수점 처리에서 심각한 문제가 발생했어요.
- Hexadecimal float: unsupported long double format (F) long double을 쓰도록 설정했지만 그 내부 형식을 몰라 16진수 부동소수점 출력이 불가능해요.
- Illegal suidscript (F) suidperl 아래 실행된 스크립트가 무효했어요.
- In '(?...)', the '(' and '?' must be adjacent in regex (F) 정규 표현식에서
"(?"는 분할할 수 없는 토큰이어야 하는데(와?사이에 뭔가 끼어 있어요. - In '(VERB...)', the '(' and '' must be adjacent in regex (F)
"(*"는(와*사이에 아무것도 없어야 하는데 분리했어요. - Invalid quantifier in {,} in regex (F) {min,max} 수량자처럼 보이지만 min/max를 유효한 숫자로 파싱할 수 없어요(앞 0이 있거나 너무 큼).
S<-- HERE>가 문제가 발견된 위치를 보여줘요. - '%s' is an unknown bound type in regex (F)
\b{...}/\B{...}를 썼는데...가 Perl에 알려지지 않았어요. - Missing or undefined argument to require (F) 인자 없이 또는 undef 값을 인자로
require를 호출했어요. 이전에는 Null filename 경고가 났어요.
새로운 경고
- \C is deprecated in regex (D deprecated) v5.20에서 deprecated된
/\C/문자 클래스가 이제 경고를 발생시켜요. v5.24에서 오류가 될 예정이에요. 이 클래스는 다중 바이트 문자 안에 있어도 단일 바이트와 매칭해 캡슐화를 깨고 UTF-8 문자열을 손상시킬 수 있어요. - "%s" is more clearly written simply as "%s" in regex (W regexp,
use re 'strict'또는(?[...])안에서만) - Argument "%s" treated as 0 in increment (++) (W numeric)
/^[a-zA-Z]*[0-9]*\z/에 매칭되는 문자열이나 숫자를 기대하는++연산자에 다른 문자열을 넘겼어요. - Both or neither range ends should be Unicode in regex (W regexp) 브래킷 문자 클래스에서 범위 한쪽 끝은
\N{}으로, 다른 쪽은 이식 불가능한 메커니즘으로 지정했어요. - Can't do %s("%s") on non-UTF-8 locale; resolved to "%s". (W locale) 1)
use locale아래, 2) 현재 로케일이 UTF-8 아님, 3) 지정 유니코드 문자에 대소문자 변경을 시도, 4) 결과가 유니코드와 로케일 규칙을 섞을 때.locale경고 카테고리는 새로 생겼어요. - :const is experimental (S experimental::const_attr)
const속성은 실험적이에요. - gmtime(%f) failed (W overflow)
gmtime에 처리할 수 없는(너무 크거나 작거나 NaN) 숫자를 넘겼어요. 반환값은undef예요. - Hexadecimal float: exponent overflow/underflow (W overflow) 16진수 부동소수점의 지수가 지원 범위를 넘어섰어요.
- Hexadecimal float: mantissa overflow (W overflow) 가수(mantissa)에 지원보다 많은 비트가 있었어요.
- Hexadecimal float: precision loss (W overflow) 내부적으로 출력할 수 있는 것보다 많은 자릿수가 있었어요.
- Locale '%s' may not work well.%s (W locale) 비-UTF-8 로케일을 쓰고 있는데 Perl이 처리하기에 완전히 호환되지 않는다고 판단했어요.
- localtime(%f) failed (W overflow)
localtime에 처리할 수 없는 숫자를 넘겼어요. - Negative repeat count does nothing (W numeric) 반복 연산자
x를 0보다 적게 실행하려 했어요. - NO-BREAK SPACE in a charnames alias definition is deprecated (D deprecated) no-break 공백이 들어간 문자 이름을 정의했어요.
- Non-finite repeat count does nothing (W numeric) 반복 연산자를
Inf(또는-Inf)나 NaN 회 실행하려 했어요. - PerlIO layer ':win32' is experimental (S experimental::win32_perlio)
:win32PerlIO 레이어는 실험적이에요.no warnings "experimental::win32_perlio";로 끌 수 있어요. - Ranges of ASCII printables should be some subset of "0-9", "A-Z", or "a-z" in regex (W regexp) 범위가 ASCII와 EBCDIC 플랫폼 사이에서 이식 불가능하고 의미가 명확하지 않아요.
[3-7],[d-g],[A-Y]는 괜찮고,[A-z],[a-Z],[%-.],[\x41-Z]는 문제예요. - Ranges of digits should be from the same group in regex (W regexp) 범위의 끝점 하나가 십진 숫자인데, 둘 다 같은 10자리 그룹에 있어야 해요.
- Redundant argument in %s (W redundant) 함수가 필요한 것보다 많은 인자를 받았어요(printf 형식이 준 인자보다 적게 요구할 때).
redundant경고 카테고리는 새로 생겼어요. - Replacement list is longer than search list — 새 진단이 아니라 이전 릴리스에서 트랜스리터레이션이 와이드 문자를 포함하면 실수로 표시되지 않았던 것을 고쳤어요.
- Use of \b{} for non-UTF-8 locale is wrong. Assuming a UTF-8 locale (W locale) 로케일 규칙으로 매칭하는데 유니코드 경계를 매칭하지만 로케일이 유니코드가 아니에요.
- Using /u for '%s' instead of /%s in regex (W regexp)
/a나/aa수정자가 적용된 부분에서 유니코드 경계(\b{...}/\B{...})를 사용했어요. - The bitwise feature is experimental (S experimental::bitwise)
bitwise피처가 켜진 상태에서 비트 연산자를 쓰면 발생해요.no warnings "experimental::bitwise";로 끌 수 있어요. - Unescaped left brace in regex is deprecated, passed through in regex (D deprecated, regexp) 패턴에 리터럴
{를 썼어요.\{를 사용하세요. v5.26에서 문법 오류가 될 예정이에요. - Use of literal non-graphic characters in variable names is deprecated (D deprecated)
$^X,${^GLOBAL_PHASE}같은^FOO변수를 가리키는 리터럴 비그래픽(제어 포함) 문자 사용을 deprecated해요. - Useless use of attribute "const" (W misc)
const속성은 익명 클로저 프로토타입에만 효과가 있어요. - Useless use of /d modifier in transliteration operator — 새 진단 아니지만 이전에 실수로 숨겨졌던 것을 고쳤어요.
- "use re 'strict'" is experimental (S experimental::re_strict)
'strict'아래 패턴 컴파일이 바뀔 수 있으니 오늘 컴파일되는 패턴이 미래엔 안 될 수 있어요. - Warning: unable to close filehandle properly: %s (S io) 파일핸들의 참조 카운트가 0이 되고 사용자 코드가
close()를 호출하지 않았을 때 암시적 close에서 오류가 발생하면 이제 경고해요. 버퍼링 때문에 디스크 꽉 참 같은 상황에서 오류가 마지막 close에서만 감지될 수 있어서 close 결과를 확인하지 않는 건 위험해요. - Wide character (U+%X) in %s (W locale) 싱글바이트 로케일에서 다중 바이트 문자를 만났어요. 싱글바이트 로케일과 유니코드를 섞는 건 위험해요.
기존 진단 변경
<> should be quotes가<> at require-statement should be quotes로 바뀌어 더 식별하기 쉬워졌어요.- Argument "%s" isn't numeric%s에 Inf·NaN의 "numeric" 정의가 특이하다는 주석이 추가됐어요.
- Global symbol "%s" requires explicit package name에 '(did you forget to declare "my %s"?)'가 추가됐어요.
'"my" variable &foo::bar can't be in a package'가 'variable' 대신 'subroutine'이라고 말하도록 변경됐어요.\N{} in character class restricted to one character in regex메시지가 inverted class·범위 끝점을 반영하도록 변경됐어요.panic: frexp에 ': C<%f>'가 추가되어 문제의 부동소수점 숫자를 보여줘요.- Possible precedence problem on bitwise %c operator가 %s로 재구성됐어요.
- Unsuccessful %s on filename containing newline 경고가 이제 새 줄이 파일 이름 끝에 있을 때만 발생해요.
- "Variable %s will not stay shared"가 실제로 어휘 서브일 때 "Subroutine"이라고 말하도록 변경됐어요.
- Variable length lookbehind not implemented in regex에 유니코드 동작 정보가 추가됐어요.
제거된 진단
- "Ambiguous use of -foo resolved as -&foo()" — 실제로 모호함이 없고, 부정 상수(
-Inf등) 사용을 방해했어요. - "Constant is not a FOO reference" — 오버로딩을 고려하지 않아 상수 역참조의 컴파일 타임 검사가 제거됐어요.
유틸리티 변경
find2perl, s2p, a2p 제거
Perl 코어에서 x2p/ 디렉터리가 제거돼 find2perl, s2p, a2p가 빠졌어요. 이것들은 모두 별도 배포(App::find2perl, App::s2p, App::a2p)로 CPAN에 공개됐어요.
h2ph
h2ph가 이제 컴파일러의 사전 정의 매크로에서 16진수 상수를 처리해요($Config{cppsymbols}에 보이는 대로).
encguess
더 이상 코어가 아닌 모듈에 의존하지 않아요.
구성과 컴파일
Configure가 이제lrintl(),lroundl(),llrintl(),llroundl()을 검사해요.Configure -Dmksymlinks가 더 빨라졌어요.pthreads와cl라이브러리가 있으면 기본으로 링크돼요. 덕분에 스레딩이 필요한 XS 모듈이 스레딩되지 않은 perl에서도 동작해요. 스레딩된 perl을 원하면 여전히-Dusethreads를 넘겨야 해요.- x86·IA-64 플랫폼의 4배 정밀도 부동소수점을 구현하는 GCC quadmath 라이브러리를 써서 더 정밀하고 넓은 범위의 숫자를 얻을 수 있어요.
- MurmurHash64A와 MurmurHash64B를 내부 해시 함수로 설정할 수 있어요.
make test.valgrind가 이제 병렬 테스트를 지원해요:TEST_JOBS=9 make test.valgrind.- MAD(Misc Attribute Decoration) 빌드 옵션이 제거됐어요. Perl 5에서 6으로의 자동 변환을 쉽게 하려고 파스 트리를 더 충실히 보존하려던 유지되지 않는 시도였어요.
- 새 컴파일 플래그
-DPERL_OP_PARENT가 추가됐어요. - Pathtools가 더 이상 miniperl에서 XS를 로드하지 않아 빌드가 약간 빨라져요.
테스트
t/porting/re_context.t추가:utf8과 의존성이Perl_save_re_context()가 하드코딩으로 로컬라이즈하는$1..$n캡처 변수의 일부만 사용하도록 테스트해요.- 성능 이슈 테스트가
t/perf/taint.t에 추가됐어요. - 특정 최적화가 깨지면 매우 느려지는 정규 표현식 테스트가
t/re/speed.t와t/re/speed_thr.t로 이동했고watchdog()로 실행돼요. test.pl이plan skip_all => $reason을 허용해Test::More와 더 호환돼요.- 무한대와 NaN이 올바르게 동작하는지 테스트하는
t/op/infnan.t이 추가됐어요.
플랫폼 지원
되살아난 플랫폼
IRIX와 Tru64 — 다시 동작해요. 몇몇 make test 실패가 남아 있어요.
EBCDIC 코드 페이지 1047을 쓰는 z/OS — 코어 perl이 이 EBCDIC 플랫폼에서 동작해요. CPAN의 많은 모듈(Pod::Simple 포함)이 여전히 테스트 실패하지만, 작업이 진행 중이에요.
지원 종료 플랫폼
NeXTSTEP/OPENSTEP — 둘 다 오래전에 사라진 플랫폼이라 지원이 제거됐어요.
플랫폼별 주석
- EBCDIC —
qr/[i-j]/가"i"와"j"만 매칭하도록 특수 처리가 필요해요. 이제 범위의 한쪽 끝이\N{...}형식이어도 특수 처리가 호출돼요. - HP-UX — archname이 이제 use64bitint와 use64bitall을 구분해요.
- Android — 크로스 컴파일, 특히 Android용 빌드 지원이 개선됐어요.
- VMS — 대기 없이 하위 프로세스를 생성할 때 반환값이 이제 올바른 PID예요.
finite/finitel/isfinite감지가configure.com에 추가됐어요. - Win32 —
miniperl.exe가-fno-strict-aliasing으로 빌드되어 GCC 4.8에서 64비트 빌드가 완료돼요.nmake minitest가 동작해요. C++ 모드 빌드(USE_CPLUSPLUS=define), 파이프 open 리스트 형식,DebugSymbols/DebugFull옵션,USE_LONG_DOUBLE옵션 등이 추가됐어요. - OpenBSD — 제공하는 보안 기능 때문에 이제 시스템
malloc을 기본 사용해요. - Solaris — Sun Studio 컴파일러를
F</opt/solstudio*>와F</opt/solarisstudio*>에서 찾아요.
내부 변경
- op가 (있을 경우) 부모를 찾을 수 있게 하는 실험적 지원이 추가됐어요. 기본이 아닌 빌드 옵션
-DPERL_OP_PARENT로 켜요.PERL_OP_PARENT빌드에서는op_sibling필드가op_sibparent로 이름이 바뀌고op_moresib플래그가 추가됐어요. 새 매크로OpHAS_SIBLING/OpSIBLING, 일반 목적 함수op_sibling_splice(), 저수준 매크로OpMORESIB_set/OpLASTSIB_set/OpMAYBESIB_set, C 함수Perl_op_parent()와 Perl 메서드B::OP::parent()가 추가됐어요. - XS 코드가 POSIX 로케일 카테고리
LC_NUMERIC을 더 잘 다룰 수 있게 매크로가 만들어졌어요. grok_atou가grok_atoUV로 대체됐어요.- SV를 가리키는 약한 참조를 가져오는 새 함수
Perl_sv_get_backrefs()가 추가됐어요. screaminstr()함수가 제거됐어요(공개 API로 표시됐지만 문서화되지 않았고 CPAN 사용도 없었어요).newDEFSVOP(),block_start(),block_end(),intro_my()함수가 API에 추가됐어요.op.c의 내부convert함수가op_convert_list로 이름이 바뀌고 API에 추가됐어요.sv_magic()이 더 이상 읽기 전용 값의 "ext" 마법을 금지하지 않아요.- XSUB에서
CvPADLIST에 접근하는 게 이제 금지돼요. CV가 XSUB인지 검사하려면CvISXSUB()를 쓰세요. SVt_NV타입의 SV는 빌드 설정·플랫폼이 허용할 때때때로 bodiless(sizeof(NV) <= sizeof(IV)일 때)가 돼요.$DB::single,$DB::signal,$DB::trace가 값이 IV로 저장되는 set/get 매직을 갖게 돼 오버로드 객체 대입 시 무한 재귀를 막아요.- 문서화되지 않은
Perl_tmps_grow()가 공개 API에서 제거됐어요. - 내부가 더 이상
SVs_PADMY플래그를 설정·사용하지 않아요. SETsv/SETsvUN매크로가 제거됐어요.sv_catpvn_flags()가SV_CATBYTES/SV_CATUTF8플래그를 받아요.- 새 opcode 클래스
METHOP가 도입되어 메서드 호출 성능 정보를 담아요. - 새 API 함수
cv_name()이 서브루틴 이름을 담은 SV를 반환해요. - 새 API 함수
cv_set_call_checker_flags()가 추가됐어요. CvGV가 더 복잡한 매크로가 됐고, boolean 문맥용CvHASGV가 추가됐어요.sync_locale함수가 공개 API에 추가됐어요. XS에서 호출하는 비-Perl 라이브러리(Gtk등)가 로케일을 바꿔야 할 때 Perl로 돌아가기 전에 이 함수로 알려줘요.- OPs의
op_private필드 플래그 정의·레이블이regen/op_private의 데이터에서 자동 생성돼요. - deprecated 변수
PL_sv_objcount가 제거됐어요. - Perl은 필요할 때만을 제외하고
LC_NUMERIC을 "C"로 유지하려 해요. 소수점 구분자가 점이 아니면 감당 못 하는 많은 XS 모듈을 보호하기 위해서예요. 새 매크로STORE_LC_NUMERIC_SET_TO_NEEDED/STORE_LC_NUMERIC_FORCE_TO_UNDERLYING이 있어요. - 문자열이 잘 형성된 UTF-8 문자로 시작하는지 효율적으로 판단하는 새 매크로
isUTF8_CHAR가 작성됐어요. - 여러 private API 함수의 컨텍스트 매개변수가 제거됐어요:
cast_ulong,cast_i32,cast_iv,cast_uv,cv_const_sv,mg_find,mg_findext,mg_magical,mini_mktime,my_dirfd,sv_backoff,utf8_hop. PADNAME/PADNAMELIST타입이 SV/AV의 단순 별칭이 아니라 별도 타입이 됐어요.- 패드 이름이 항상 UTF-8이에요.
- 새 op 클래스
UNOP_AUX가 추가됐어요.op_aux필드가 추가된UNOP의 서브클래스예요. - 새 op
OP_MULTIDEREF가 추가되어 키가 상수나 단순 변수인 중첩 배열·해시 조회를 한 번에 수행해요.
주요 버그 수정
close가 이제$!를 설정해요. I/O 오류 시 핸들에 오류 사실이 기록되고,close가 그 핸들에 대해 false를 반환하면서$!도 복원해요. 이제close $fh or die $!가 안정적으로 동작해요.no re가 이제use re가 켜는 모든 것을 끌 수 있어요.pack("D", $x)/pack("F", $x)가 x86 long double 빌드에서 패딩을 0으로 채워요.- 부모 스레드에서 클론된 배열 확장 시 "Modification of a read-only value attempted" 오류를 수정했어요.
*x=<y>의 단언 실패·크래시 수정.- 어휘 서브 컴파일 관련 크래시/루프 버그 수정.
- 함수 이름, 따옴표 없는 HERE-document 종결자, 배열 인덱스로 쓰는 변수 이름에서 UTF-8이 올바르게 동작해요.
- 큰 tainted 문자열의 반복 전역 매칭이 현재 매칭 위치에 따라 지수적으로 느려지는 문제 수정.
- 파서가 문법 오류에 혼동돼 생기는 여러 크래시 수정.
- 어휘
$_스코프의split이 단언 실패를 일으키지 않도록 수정. my $x : attr문법이 여러 리스트 연산자 안에서 단언 실패를 일으키지 않도록 수정.- 따옴표 안
@다음 비-ASCII 숫자가 오면 파서가 크래시 대신@를 리터럴로 처리하도록 수정. *bar::=*foo::=*glob_with_hash가 5.14 이후 크래시하던 것 수정.- 스칼라 문맥의
foreach가 스택에 항목을 밀지 않아 생기던 버그 수정(이제undef반환). - 환경 변수 내용을 저장하는 여러 데이터가 사용 전에 덮어써질 수 있던 문제 수정.
/.*..../로 시작하는 패턴이 v5.8 이후,/.*..../i형식이 v5.18 이후 느렸던 것 수정.$/의 원래 보이는 값이 무효 값으로 설정될 때 보존되도록 수정.- POSIX 클래스(
[:ascii:]같은)가 부정된([:^ascii:]) 상태에서 경고가 나지 않던 것 수정. - 5.14.0의
eval { LABEL: }크래시 버그 수정. /$a[/같은 코드가 다음 입력 줄을 읽어 여는 대괄호 바로 뒤처럼 취급하던 것을 더 이상 허용하지 않아요.pack의 인자 언더플로 수정.- 비-strict
\x{}처리 수정. 이제\x{0}과 동등해요. stat -t가 더 이상 스택 가능으로 취급되지 않아요.qr{x+(y(?0))*}가 더 이상 SEGV를 일으키지 않아요.- 정규 표현식 패턴의 역참조 파싱 무한 루프 수정.
- NaN 동작 관련 여러 사소한 버그 수정("NaNcy"가 더 이상 NaN으로 숫자화되지 않아요).
/i로use locale스코프 안에서 컴파일되고 128바이트 이상 연속 문자열과 매칭하는 패턴의 크래시 버그 수정.s///g가 20억 회 이상 반복되는 매우 긴 문자열에서도 'Substitution loop'로 죽지 않고 동작해요.gmtime이 NaN 값에서 크래시하지 않아요.\(), minusyy///의 스택 끝 너머 쓰기 수정.- 인자 없는
prototype()이$_를 추론하도록 수정. - 사전 선언된 서브 안에 선언된 어휘 state 서브의 크래시 수정.
- 익명 서브 안의 중첩 어휘 state 서브의 'Bizarre copy' 오류·크래시 수정.
- perl5db.pl의 'Undefined subroutine &DB::db_warn called' 버그 수정.
s/${<>{})//같은 치환의 특정 문법 오류 크래시(5.10 이후) 수정.- 문자열 크기 계산 오버플로 수정.
33 x ~3같은 반복 표현식이 이제 메모리 래핑 패닉을 제대로 발생시켜요. formline("@...", "a");크래시 수정.- 정규 표현식 컴파일 중 리터럴 패턴 파싱의 버퍼 오버런·크래시 수정.
fchmod()/futimes()가 닫힌 파일핸들을 전달받아 실패할 때$!를 설정해요.op_free()/scalarvoid()가 깊은 재귀 op 트리를 자유화할 때 스택 오버플로로 크래시하지 않아요.- 5.20.0에서 정규 표현식 코드 블록 안에서
$^N의 UTF-8 플래그가 실수로 꺼지던 것 수정. - 실패한
semctl호출이 스택의 기존 항목을 덮어쓰지 않아요. else{foo()}가 올바른 줄 번호를 할당해요.@array = split의 대입 최적화가 lvalue 문맥 사용을 막던 버그 수정.- 서브 시그니처(실험적) 검사 실패 시 파일·줄 번호가 호출자가 아닌 호출된 서브 것을 보여주던 것 수정.
- 플립플롭 연산자의 스칼라 문맥 상태가 무한 재귀 수준별로 분리 유지되던 문제 수정(문서와 반대).
- 플립플롭 연산자가 매번 같은 스칼라를 반환하던 것 수정(이제 항상 새 스칼라).
use,no, 문장 레이블, 특수 블록(BEGIN), pod가map/grep블록,print/say블록,${...}/@{...}안에서 첫 번째로 올 수 있어요.- 반복 연산자
x가foreach같은 문맥에서 좌항에 lvalue 문맥을 전파해요. - 스칼라 문맥의
(...) x ...가 "x" 오버로딩 객체에서 스택을 손상시키던 것 수정. - 어휘 스칼라 대입 최적화 관련 버그 수정(
$foo++,$foo--,- $foo,chomp,chr,setpgrp등). tied/values/each로 같은 스칼라가 양쪽에 있으면 목록 대입이 잘못되는 버그 수정.setpgrp($nonzero)가 5.16에서setpgrp(0)으로 잘못 바뀌던 것 수정.__SUB__가 디버거(-d)와eval $string서브에서 잘못된 값을 반환하거나 메모리를 손상시키던 것 수정.sub () { $var }가 인라이닝 가능할 때 매번 다른 스칼라를 반환해요.my sub f () { $var }와sub () : attr { $var }가 인라이닝 대상이 아니에요.- 빈 프로토타입 서브 인라이닝이 더 일관돼요. 명시적
return은 항상 인라이닝을 막아요. - VMS 같은 시스템에서
crypt가 UTF-8 문자열을 손상시키던 것 수정. crypt가 tied 첫 인자에FETCH를 두 번 부르지 않아요.- 마지막 줄의 종결되지 않은 here-doc이 이중 free를 일으키지 않아요.
index()/rindex()가 2GB 이상 문자열에서 크래시하지 않아요.- Win32 빌드의
PERL_SYS_INIT/PERL_SYS_INIT3메모리 누수 수정. POSIX::localeconv()가use locale스코프 밖에서도 프로그램 기본 로케일 데이터를 반환해요.POSIX::localeconv()가LC_NUMERIC/LC_MONETARY가 없는 플랫폼에서도 동작해요.POSIX::localeconv()가 반환값을 UTF-8 여부에 맞게 표시해요.- Microsoft Windows의
use locale스코프에서 여러 POSIX 문자 클래스가 POSIX 표준에 맞지 않는 결과를 주던 것 수정. - Coverity가 감지한 여러 문제 수정.
- Android 빌드에서
system()이 제대로 동작해요(-Dtargetsh가 무시되던 문제 수정). qr(...\(...\)...),qr[...\[...\]...],qr{...\{...\}...}가 이제 동작해요.s///e가 tainted UTF-8 문자열에서pos()를 손상시키던 것(5.20 도입) 수정.- 비단어 경계
\B가 항상 문자열 끝을 매칭하지 않던 것(5.14 도입) 수정. " P" =~ /(?=.*P)P/가 매칭하도록 수정.eval안의 실패한use Foo컴파일이 불필요한BEGIN서브 정의를 남기던 것 수정.method { BLOCK } ARGS문법이{로 시작하는 인자를 올바르게 파싱해요.- 버전 파싱이 로케일 숫자 구분자 변경을 올바르게 처리해요.
- 정규 표현식의 길이 0 단언·코드 블록이
pos가 잘못된 값을 보게 하던 버그 수정. - typeglob 상수의 역참조가 올바르게 동작해요.
- 시길(
$@%&) 뒤 중괄호 파싱이 블록으로 확정 처리돼요. undef $reference가 참조 대상을 즉시 해제해요.- 어휘 서브의 이름 사용(자동 로드·오버로딩·오류 메시지) 크래시 수정.
- Bareword 조회가 서브루틴 이름이 아닐 때 패키지를 vivify하지 않으려 해요.
- 익명 상수 컴파일이 현재 패키지의
__ANON__서브를 삭제하지 않아요(5.8.0 이후 버그). sub f;/sub f ();같은 스텁 선언이use constant로 선언된 같은 이름의 상수를 지우지 않아요(5.10.0 이후).qr/[\N{named sequence}]/가 많은 경우 제대로 동작해요.- 컴파일 타임에 평가되는 tainted 상수가 무관한 문장을 taint하지 않아요.
open $$fh, ...의 이중 free 가능성 수정.- bareword가 메서드 이름일 때
our서브와 혼동되던 파서 문제 수정. - 이중 따옴표 문자열 안
\U=가 문법 오류를 내던 것 수정. -B/-T파일 테스트가 UTF-8 인코딩 파일을 텍스트로 취급하도록 수정(유효하지 않은 UTF-8 상당수 처리).- 정규 표현식 패턴 컴파일 경고가 여러 번 출력되던 것 수정.
- 5.20.0의 UTF-8 패턴의 단일 ASCII 소문자가 대문자와 매칭 안 하던 회귀 수정.
- 상수 폴딩이 잘못 경고를 억제하던 것 수정.
- 유니코드 테이블 로딩이 단언 실패를 일으키던 것 수정.
- 어휘 서브의 스레드 클로닝이 잘못 동작하던 것 수정.
- 5.14.0 이후
$SomePackage::{__ANON__}삭제 후 익명 서브 undef가 내부를 손상시키던 것 수정. (caller $n)[3]이 어휘 서브 이름을 보고해요.sort subname LIST가 비교 루틴으로 어휘 서브를 지원해요.- 별칭(
*x = *y)이 같은 변수의 두 이름을 양쪽에 언급하는 목록 대입을 혼동시키던 것 수정. - 긴 here-doc 종결자가 짧은 입력 줄에서 잘못된 읽기를 하던 것 수정(5.16 이후, Perl 3.000 이후의 버그).
split /^/를split /^/m처럼, 그리고 실수로split /\A/도 그렇게 취급하던 최적화 수정.my Class $var문법이use utf8스코프에서 Latin-1 값 상수와 혼동되던 것 수정.- 처음부터 읽기 전용이던 값을 잠그거나 푸는 게 더 이상 영향을 주지 않아요.
- 종결되지 않은
(?(...)...)정규 표현식 구조의 크래시·잘못된 오류 메시지 수정. pack "w", $tied가FETCH를 두 번 부르지 않아요.($x, $z) = (1, $y)같은 목록 대입이 별칭된 변수에서 올바르게 동작해요.- 문법 오류 코드 블록이 있는 패턴이 디버그 빌드에서 매달리거나 단언 실패하지 않아요.
- 디버그에서
sort파싱의 단언 실패 수정. *a = *b; @a = split //, $b[1]의 잘못된 읽기 수정.() = @array = split에서 앞의() =가 최적화자를 혼동시키지 않아요.- 치명적 경고가 문법 오류 출력을 막지 않아요.
- VMS의 NaN double-to-long-double 변환 오류 수정.
make distclean이 파일을 잘못 남기던 문제 수정.- AIX가
getsockopt에서 길이를 올바르게 설정해요. - 정규 표현식 컴파일의 최적화 단계가 "영원히" 돌며 메모리를 다 쓰던 것 수정.
crypt.t테스트가 기본 알고리즘이 비활성화되면 SHA-256을 사용해요.- 공유 배열 크기 설정의 off-by-one 오류 수정.
- 컴파일 중 무한 루프 버그 수정(
sub foo { () = ($a, my $b, ($c, do { while(1) {} })) }같은, 5.20.0 도입). - Win32에서 포크된 의사 프로세스의
local변수 복원 시 메모리 손상·크래시 수정. ^**필드가 있는 포맷에write호출 시 panic 수정.- 비-ASCII 어휘 서브 이름이 오류 메시지에 깨지지 않아요.
\@서브루틴 프로토타입이 괄호 배열을 평탄화하지 않고 배열 자체 참조를 가져요.- C 스타일
for루프만 담은 블록이 스택을 손상시키던 것 수정. scalar()가 lvalue 문맥을 전파해요.for(scalar($#foo)) { ... }가$_로$#foo를 수정할 수 있어요.qr/@array(?{block})/이 "Bizarre copy of ARRAY"로 죽지 않아요.- 중첩 이름 있는 서브의
eval '$variable'이 어휘 변수에도 전역 변수를 조회하던 것 수정. - 5.20.0의
sort CORE::fake가 마지막 6자를 잘라내던 것 수정(이전 동작 복원). use utf8밖에서 단일 문자 Latin-1 어휘 변수의 오류 메시지가 깨지던 것 수정.- 존재하지 않는 핸들의
readline이${^LAST_FH}를 이상하게 만들던 것 수정(이제 undef). - void 문맥의
(...) x ...가 현재 서브의 문맥 대신 좌항에 스칼라 문맥을 적용해요.
알려진 문제
- Visual C 6으로 컴파일된 perl에서 NaN을 pack하면 제대로 동작하지 않아
t/op/infnan.t실패. - Perl이 어떤 유니코드 버전에서도 잘 동작하도록 다시 컴파일되는 게 목표인데, 5.22에서는 가장 이른 버전이 유니코드 5.1(현재는 7.0)이에요.
- EBCDIC 플랫폼:
cmp(따라서sort)가 UTF-EBCDIC 문자열 혼합에서 올바른 결과를 주지 않을 수 있어요.tr////y///의\N{...}범위가 다르게 취급돼요.Encode/encoding이 대부분 깨져 있어요. 많은 코어 동봉 CPAN 모듈이 테스트 실패해요.pack/unpack의"U0"포맷이 제대로 안 될 수 있어요. - 다음 모듈들이 이 Perl 버전에서 테스트 실패가 알려져 있어요:
B::Generate1.50,B::Utils0.25,Coro6.42,Dancer1.3130,Data::Alias1.18,Data::Dump::Streamer2.38,Data::Util0.63,Devel::Spy0.07,invoker0.34,Lexical::Var0.009,LWP::ConsoleLogger0.000018,Mason2.22,NgxQueue0.02,Padre1.00,Parse::Keyword0.08.
부고
Brian McCauley가 2015년 5월 8일 사망했어요. 그는 Usenet, Perl Monks, 기타 Perl 포럼에 자주 글을 올렸고, NOBULL이라는 닉네임으로 Perl FAQ를 포함한 여러 CPAN 기여를 했어요. 거의 모든 YAPC::Europe에 참석했고 실제로 YAPC::Europe 2006과 QA Hackathon 2009 조직을 도왔죠. 특히 보드게임을 사랑했고, 많은 Perl monger들이 Brian과 함께 Fluxx를 즐겼던 기억을 간직할 거예요.
감사의 말
Perl 5.22.0은 Perl 5.20.0 이후 약 12개월간의 개발을 나타내며, 94명의 저자가 2,400개 파일에 걸쳐 약 590,000줄의 변경을 담고 있어요. 자동 생성 파일·문서화·릴리스 도구를 제외하면 1,500개의 .pm, .t, .c, .h 파일에 약 370,000줄의 변경이 있었어요. 이 목록은 버전 관리 기록에서 자동 생성되므로 거의 확실히 불완전해요.