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를 먼저 읽어 보세요.

출처: perldoc - perl5220delta

핵심 개선 사항

새로운 비트 연산자

네 가지 표준 비트 연산자(& | ^ ~)가 피연산자를 일관되게 숫자로 취급하도록 만드는 새로운 실험적 기능이 추가되었어요. 그리고 피연산자를 일관되게 문자열로 취급하는 네 가지 점(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 bytesuse 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 $varour($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::REGEXPqr_anoncv/compflags 메서드, B::PMOPpmregexp), 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_flagsmalloc 대신 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) :win32 PerlIO 레이어는 실험적이에요. 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가 더 빨라졌어요.
  • pthreadscl 라이브러리가 있으면 기본으로 링크돼요. 덕분에 스레딩이 필요한 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.tt/re/speed_thr.t로 이동했고 watchdog()로 실행돼요.
  • test.plplan 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 — 둘 다 오래전에 사라진 플랫폼이라 지원이 제거됐어요.

플랫폼별 주석

  • EBCDICqr/[i-j]/"i""j"만 매칭하도록 특수 처리가 필요해요. 이제 범위의 한쪽 끝이 \N{...} 형식이어도 특수 처리가 호출돼요.
  • HP-UX — archname이 이제 use64bitint와 use64bitall을 구분해요.
  • Android — 크로스 컴파일, 특히 Android용 빌드 지원이 개선됐어요.
  • VMS — 대기 없이 하위 프로세스를 생성할 때 반환값이 이제 올바른 PID예요. finite/finitel/isfinite 감지가 configure.com에 추가됐어요.
  • Win32miniperl.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_atougrok_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으로 숫자화되지 않아요).
  • /iuse locale 스코프 안에서 컴파일되고 128바이트 이상 연속 문자열과 매칭하는 패턴의 크래시 버그 수정.
  • s///g가 20억 회 이상 반복되는 매우 긴 문자열에서도 'Substitution loop'로 죽지 않고 동작해요.
  • gmtime이 NaN 값에서 크래시하지 않아요.
  • \(), minusy y///의 스택 끝 너머 쓰기 수정.
  • 인자 없는 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 블록, ${...}/@{...} 안에서 첫 번째로 올 수 있어요.
  • 반복 연산자 xforeach 같은 문맥에서 좌항에 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", $tiedFETCH를 두 번 부르지 않아요.
  • ($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::Generate 1.50, B::Utils 0.25, Coro 6.42, Dancer 1.3130, Data::Alias 1.18, Data::Dump::Streamer 2.38, Data::Util 0.63, Devel::Spy 0.07, invoker 0.34, Lexical::Var 0.009, LWP::ConsoleLogger 0.000018, Mason 2.22, NgxQueue 0.02, Padre 1.00, Parse::Keyword 0.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줄의 변경이 있었어요. 이 목록은 버전 관리 기록에서 자동 생성되므로 거의 확실히 불완전해요.