Perl 5.26.0 변경 사항

Perl 5.26.0 변경 사항 (perl5260delta)

이 문서는 Perl 5.24.0 릴리스와 5.26.0 릴리스 사이의 차이를 설명해요.

출처: perldoc - perl5260delta

공지

이 릴리스에는 넓게 영향을 주는 세 가지 업데이트가 있어요.

"."이 더 이상 @INC에 없음 — 보안상 이유로 현재 디렉터리(".")가 모듈 검색 경로(@INC) 끝에 기본 포함되지 않아요. 이것은 모듈의 빌드·테스트·설치와 스크립트 실행에 널리 영향을 줄 수 있어요. 아래 "@INC에서 현재 디렉터리(".") 제거" 섹션을 보세요.

do가 이제 경고할 수 있음do"."@INC에 있었다면 로드했을 파일을 로드하는 데 실패할 때 deprecation 경고를 줘요.

정규 표현식 패턴에서 리터럴 왼쪽 중괄호 "{"는 이스케이프해야 함 — 아래 "정규 표현식 패턴의 이스케이프되지 않은 리터럴 "{" 문자는 더 이상 허용되지 않음"을 보세요.

핵심 개선 사항

어휘 서브루틴이 더 이상 실험적이지 않음

v5.18에서 도입된 lexical_subs 피처를 쓰면 더 이상 경고가 나지 않아요. 이전에 해당 피처가 쓰던 experimental::lexical_subs 경고 카테고리를 끈 기존 코드도 계속 동작해요. lexical_subs 피처는 이제 효과가 없고, 어떤 피처 선언이 스코프에 있든 모든 Perl 코드가 어휘 서브루틴을 쓸 수 있어요.

들여쓰기 있는 Here-document

여기에 here-doc에 새 수정자 "~"가 추가되어, 파서가 종결 구분자로 /^\s*$DELIM\n/을 찾도록 해요. 다음 문법이 모두 지원돼요:

<<~EOF;
<<~\EOF;
<<~'EOF';
<<~"EOF";
<<~`EOF`;
<<~ 'EOF';
<<~ "EOF";
<<~ `EOF`;

"~" 수정자는 here-doc의 각 줄에서 구분자 앞에 나타나는 동일한 공백을 제거해요. 새 줄은 그대로 복사되고, 올바른 시작 공백이 없는 줄은 perl이 croak해요. 예:

if (1) {
  print <<~EOF;
    Hello there
    EOF
}

이것은 선행 공백 없이 "Hello there\n"을 출력해요.

새 정규 표현식 수정자 /xx

정규 표현식 패턴을 수정하기 위해 두 개의 "x" 문자를 지정하면 단일 x가 하는 모든 일을 하면서, 추가로 브래킷 문자 클래스 안의 TAB과 SPACE 문자를 일반적으로 무시해서 가독성을 위해 추가할 수 있어요: [ ^ A-Z d-f p-x ]/xx처럼요. 자세한 내용은 perlre의 "/x and /xx"를 보세요.

@{^CAPTURE}, %{^CAPTURE}, %{^CAPTURE_ALL}

@{^CAPTURE}는 마지막 매치의 캡처 버퍼를 배열로 노출해요. 즉 $1${^CAPTURE}[0]이에요. 이것은 substr($matched_string,$-[0],$+[0]-$-[0]) 같은 코드의 더 효율적인 대안이고, $matched_string을 따로 추적할 필요도 없어요. 다른 정규 표현식 매직 변수처럼 이 변수의 내용은 동적이므로, 매치의 수명을 넘어 저장하려면 다른 배열로 복사해야 해요.

%{^CAPTURE}%+(즉 이름 있는 캡처)와 동등해요. 더 자기 문서화적이라는 것 외에는 두 형식 사이 차이가 없어요. %{^CAPTURE_ALL}%-(즉 모든 이름 있는 캡처)와 동등해요.

변수에 대한 참조 선언

실험적 기능으로, Perl은 이제 참조 연산자가 my(), state(), our(), local() 뒤에 올 수 있게 허용해요. 이 문법은 use feature 'declared_refs'로 켜야 해요. 실험적이며 기본으로 experimental::refaliasing 경고를 내요(끄지 않으면). 주로 참조에 대한 대입에 쓰기 위한 것이에요:

use experimental 'refaliasing', 'declared_refs';
my \$a = \$b;

자세한 내용은 perlref의 "Assigning to References"를 보세요.

유니코드 9.0 지원

변경 목록은 유니코드 공식 사이트에서 볼 수 있어요. 코어 Perl에 동봉되지만 p5p가 유지하지 않는 모듈은 반드시 유니코드 9.0을 지원하지는 않아요. Unicode::Normalize는 9.0에서 동작해요.

\p{I<script>}가 개선된 Script_Extensions 속성 사용

유니코드 6.0은 Script(sc) 속성의 개선된 형태를 도입하고 Script_Extensions(scx)라고 불렀어요. 속성이 그냥 \p{I<script>}로 지정되면 Perl은 이제 이 개선된 버전을 사용해요. 이것은 문자가 주어진 스크립트에서 쓰이는지 판단할 때 프로그램을 더 정확하게 만들지만, 매우 특별히 옛 동작이 필요했던 프로그램에서는 약간 깨질 가능성이 있어요. \p{sc=I<script>} 같은 복합 형태의 의미는 바뀌지 않아요. perlunicode의 "Scripts"를 보세요.

지원하는 플랫폼의 UTF-8 로케일에서 기본 조합 정렬 가능

일부 플랫폼은 UTF-8 로케일에서 자체적으로 적절한 조합·정렬을 해요. Perl은 이제 이것과 함께 동작해요. 이식성과 완전한 제어를 위해 Unicode::Collate를 여전히 권장하지만, 이제는 애플리케이션에 따라 충분히 좋은 결과를 위해 특별한 일을 하지 않아도 될 수 있어요. perllocale의 "Category LC_COLLATE: Collation: Text Comparisons and Sorting"을 보세요.

임베디드 NUL 문자를 포함한 문자열의 더 나은 로케일 조합

다중 레벨 문자 가중치가 있는 로케일에서 NUL은 이제 더 높은 우선순위의 것에서 무시돼요. 하지만 일부 문자열에는 여전히 함정이 있어요. perllocale의 "Collation of strings containing embedded NUL characters"를 보세요.

참조로 호출 가능한 해시·배열 함수의 CORE 서브루틴

CORE 네임스페이스의 해시·배열 함수(keys, each, values, push, pop, shift, unshift, splice)는 이제 앰퍼샌드 문법(&CORE::keys(\%hash)과 참조(my $k = \&CORE::keys; $k->(\%hash))로 호출할 수 있어요. 이전에는 인라이닝될 때만 쓸 수 있었어요.

64비트 빌드의 새 해시 함수

짧은 키와 긴 키의 성능을 더 잘 균형 잡기 위해 하이브리드 해시 함수로 전환했어요. 16바이트 이하의 짧은 키에는 One At A Time Hash의 최적화 변형을, 더 긴 키에는 Siphash 1-3을 사용해요. 매우 긴 키에서 성능이 크게 개선되고, 짧은 키에서도 약간 개선돼요.

보안

@INC에서 현재 디렉터리(".") 제거

perl 바이너리는 @INC에 기본 경로 집합을 포함해요. 역사적으로는 taint 모드(perl -T)로 실행하지 않는 한 현재 디렉터리(".")를 마지막 항목으로 포함했어요. 편리하지만 보안 함의가 있어요. 예를 들어 스크립트가 현재 디렉터리가 신뢰할 수 없는(/tmp 같은) 곳에서 선택 모듈을 로드하려 하면, 그 디렉터리 아래의 코드를 로드·실행할 수 있어요.

v5.26부터 "."은 taint 모드에서뿐 아니라 기본으로 항상 제거돼요. 이것은 모듈 설치와 스크립트 실행에 큰 함의가 있어요. 다음 새 기능들이 이 문제를 완화하기 위해 추가됐어요.

Configure -Udefault_inc_excludes_dot"." 없이 perl 실행 파일을 빌드하는 새 Configure 옵션 default_inc_excludes_dot(기본 활성화)가 있어요. -U로 이 옵션을 끄면 옛 동작으로 되돌아가요.

PERL_USE_UNSAFE_INC — perl 인터프리터가 인식하는 새 환경 변수예요. 시작 시 이 변수가 1이면 "."@INC에 자동 덧붙여져요(taint 모드 제외). 이렇게 하면 사례별로 옛 동작을 복원할 수 있는데, 임시 버팀목으로 의도된 것이고 미래 버전에서 제거될 거예요. 현재 cpan 유틸리티와 Test::Harness가 dot 부재를 처리하지 못하는 CPAN 모듈 설치를 돕기 위해 설정해요.

do가 내는 새 deprecation 경고userequire@INC를 사용하는 건 잘 알려져 있지만, do "file"도 상대 경로면 @INC를 검색한다는 걸 모르는 사람이 많아요. "." 제거로 단순한 do "file.pl"은 현재 디렉터리에서 읽고 실행하는 데 실패할 거예요. 흔히 기대되는 동작이므로, dot이 @INC에 있었다면 찾았을 파일 로드에 do가 실패할 때마다 새 deprecation 경고를 내요.

스크립트와 모듈 작성자가 새 환경에서 동작하게 하려면:

스크립트 작성자 — 자체 코드에 문제가 있으면 두 가지 주요 옵션이 있어요. 첫째, 스크립트가 신뢰할 수 있는 디렉터리에서만 실행된다고 확신하면 "."을 경로에 다시 넣으세요:

BEGIN {
    my $dir = "/some/trusted/directory";
    chdir $dir or die "Can't chdir to $dir: $!\n";
    # 이제 안전함
    push @INC, '.';
}

둘째, 스크립트가 신뢰할 수 없는 디렉터리에서 실행되도록 의도됐다면, 갑자기 파일 로드에 실패하는 것은 보안 문제를 암시할 수 있어요. 상대 경로를 전체 경로로 바꾸거나 ./ 접두사를 쓰세요:

do "$ENV{HOME}/foo_config.pl"
# 또는
do "./foo_config.pl"

CPAN 모듈 설치·사용cpan 같은 자동 도구로 설치하면 이 도구가 빌드·테스트 중에 PERL_USE_UNSAFE_INC를 설정해서, dot 인지하도록 갱신되지 않은 배포를 설치할 수 있어요. 수동으로 설치하려면 재래식 호출을 다음과 같이 바꾸세요:

(export PERL_USE_UNSAFE_INC=1; \
 perl Makefile.PL && make && make test && make install)

모듈 작성자 — dot 없는 환경에서 실행되도록 배포를 갱신해야 할 수 있어요. 빌드·테스트·설치 동안 스크립트가 로컬 모듈·설정 파일을 상대 경로로 포함하려 하면 이제 실패할 거예요. PERL_USE_UNSAFE_INC=0으로 빌드 프로세스를 명시적으로 꺼서 잠재 문제를 드러내는 게 현명해요:

(export PERL_USE_UNSAFE_INC=0; \
 perl Makefile.PL && make && make test && make install)

테스트에서 dot 제거 문제를 고칠 때 dot을 @INC에 다시 넣는 것은 주의해서 해야 해요(이것도 실제 오류를 숨길 수 있어요). 가능하면 절대/상대 경로를 명시하거나 필요한 파일을 하위 디렉터리로 옮겨 그 하위 디렉터리를 @INC에 넣으세요. 모듈이 전역적으로 @INC에 dot을 추가하는 건 나쁜 형태로 간주돼요.

PATH의 이스케이프된 콜론과 상대 경로

Unix 시스템에서 Perl은 새 프로세스를 시작할 때 PATH 환경 변수의 상대 경로를 tainted로 취급해요. 이전에는 OS와 달리 백슬래시가 콜론을 이스케이프하게 해서, PATH가 /\.:처럼 설정되면 상대 경로가 안전한 것으로 간주될 수 있었어요. 이 검사는 그 예에서 "."을 tainted로 취급하도록 고쳐졌어요.

PerlIO 디버깅 출력에 새 -Di 스위치 필요

이것은 재귀 호출을 피하기 위해 PerlIO 내부 코드 디버깅에 쓰여요. 이전에는 perl이 setuid로 실행 중이 아니고 -T/-t 스위치가 아직 파싱되지 않았다면 이 출력이 PERLIO_DEBUG 환경 변수가 지정한 파일로 보내졌어요. perl이 스위치를 아직 파싱하지 않은 시점에 출력하면 -T가 제공됐어도 PERLIO_DEBUG가 이름 짓는 파일을 만들거나 덮어쓸 수 있었어요.

이제 PerlIO 디버깅 출력을 내려면 -Di 스위치가 있어야 해요. 기본으로 stderr에 쓰지만, PERLIO_DEBUG 환경 변수를 설정해 파일로 리디렉션할 수 있어요. perl이 setuid로 실행되거나 -T가 제공되면 PERLIO_DEBUG는 무시되고 다른 -D 스위치처럼 stderr로 보내져요.

비호환 변경 사항

정규 표현식 패턴의 이스케이프되지 않은 리터럴 "{" 문자는 더 이상 허용되지 않음

LEFT CURLY BRACKET을 매칭하도록 지정하려면 이제 "\{" 또는 "[{]처럼 말해야 해요. 아니면 치명적 패턴 컴파일 오류예요. 이 변경은 언어의 미래 확장을 가능하게 해요. 이것들은 v5.16부터 deprecated였고 v5.22부터 일부 사용에 대해 메시지가 발생했어요. 불행히도 메시지를 발생시키는 코드가 버그가 있어서 경고해야 할 때도 경고하지 못했어요. 따라서 이런 경우의 금지 시행은 Perl 5.30까지 연기되지만, 그동안 기본-ON deprecation 메시지를 발생시키도록 코드는 고쳐졌어요.

일부 리터럴 "{" 사용은 패턴의 첫 문자나 교대("|") 다음처럼 의미가 리터럴 외의 무엇이 될 수 없는 문맥에서 일어나요. qr/{fee|{fie/는 문자열 {fee{fie 중 하나와 매칭해요. 이런 용도는 불필요한 코드 변경을 강요하지 않도록 이스케이프할 필요가 없고 경고도 발생하지 않으며, 바꿀 계획도 없어요. 하지만 "{"를 이스케이프하는 건 항상 올바르고, 항상 그렇게 하라는 단순한 규칙만 기억하면 돼요.

scalar(%hash) 반환 서명 변경

scalar(%hash)에 대해 반환되는 값이 더 이상 해시에 할당된 버킷 정보를 보여주지 않아요. 그냥 사용된 키의 개수를 반환해요. 따라서 0+keys(%hash)와 동등해요. Hash::Util::bucket_ratio()를 통해 후위 호환 형태가 제공되는데, 이것은 Perl 5.24 이하가 제공한 scalar(%hash)와 같은 동작을 해요.

lvalue 서브루틴에서 반환된 keys

lvalue 서브루틴에서 반환된 keys는 더 이상 리스트 문맥에서 대입될 수 없어요.

sub foo : lvalue { keys(%INC) }
(foo) = 3;  # 죽음
sub bar : lvalue { keys(@_) }
(bar) = 3;  # 역시 오류

이것은 lvalue 서브 케이스를 (keys %hash) = ...(keys @_) = ...(둘 다 오류)와 일관되게 해요.

${^ENCODING} 기능 제거

이 변수에 값을 대입하는 것과 관련된 특별 동작이 제거됐어요. 결과적으로 encoding 프래그마의 기본 모드는 더 이상 지원되지 않아요. UTF-8이 아닌 인코딩으로 소스 코드를 써야 한다면 CPAN의 Filter::Encoding 같은 소스 필터나 encodingFilter 옵션을 쓰세요.

POSIX::tmpnam() 제거

근본적으로 안전하지 않은 tmpnam() 인터페이스는 Perl 5.22에서 deprecated됐고 이제 제거됐어요. 대신 File::Temp 인터페이스를 쓸 수 있어요.

require ::Foo::Bar는 이제 무효

이전에는 require ::Foo::Bar/Foo/Bar.pm을 읽으려 했어요. 이제 이중 콜론으로 시작하는 어떤 bareword require도 죽어요.

리터럴 제어 문자 변수 이름은 더 이상 허용되지 않음

어떤 상황에서도 변수 이름은 리터럴 제어 문자를 포함할 수 없어요. 이전에는 ASCII 플랫폼의 단일 문자 이름에서 허용됐지만 Perl 5.20부터 deprecated됐어요. 이는 소스 코드에서 리터럴 제어(NAK나 NEGATIVE ACKNOWLEDGE 같은)인 $<T> 같은 것에 영향을 줘요.

\N{...}에서 NBSP는 더 이상 허용되지 않음

문자 이름은 더 이상 non-breaking space를 포함할 수 없어요. Perl 5.22부터 그렇게 하는 것은 deprecated됐어요.

Deprecations

독립 그라핀이 아닌 문자열 구분자가 이제 deprecated

Perl이 결국 문자열 구분자가 유니코드 그라핀 클러스터(단일 문자처럼 보이지만 여러 개의 시퀀스일 수 있는)가 되도록 허용하려면, 그 자체로 그라핀이 아닌 단일 문자 구분자를 허용하는 것을 멈춰야 해요. 이런 것들은 실제 코드에 존재할 가능성이 낮아요, 앞의 문자에 붙은 것으로 표시되기 때문이에요.

인쇄 가능 문자에 매핑되는 \cX는 더 이상 deprecated가 아님

이것은 이 기능을 제거할 계획이 없음을 의미해요. 여전히 경고를 발생시키지만 문법 경고가 활성화된 경우에만 그래요. 이 기능은 원래 니모닉이 없는 비인쇄 문자(\t/\n은 비인쇄 문자 두 개의 니모닉)를 표현하는 방법이 되도록 의도됐어요. 하지만 인쇄 가능 문자 몇 개를 지정하는 데 쓸 수 있는데, 그것들은 인쇄 가능 문자 자체로 더 명확히 표현돼요.

성능 개선

  • boolean 문맥의 해시가 때로 더 빨라져요: if (!%h) { ... }. 이미 특수 처리됐지만 일부 케이스(grep %$_, @AoH 같은)가 빠져 있었고, 포함된 것들도 개선됐어요.
  • 64비트 빌드에서 짧은 키와 긴 키에 다른 해시 함수를 써요.
  • readline()/<>로 파일을 줄 단위로 읽는 것이 새 줄을 찾는 코드 구현이 더 좋아져서 일반적으로 더 빨라요.
  • 참조 하나를 다른 것에 대입하는 것($ref1 = $ref2)이 일부 케이스에서 최적화됐어요.
  • Copy-on-Write 문자열 생성의 일부 예외를 제거했어요. 문자열 버퍼 증가 알고리즘이 약간 바뀌어 COW할 수 없는 문자열을 만날 가능성이 줄었어요.
  • 배열·해시 대입을 더 잘 최적화해요. 목록 대입의 LHS에 배열·해시가 나타나면((..., @a) = (...); 같은) 상당히 빨라질 수 있어요. 예를 들어 다음 코드는 Perl 5.24.0보다 약 1/3 빨라요:
my @a;
for my $i (1..10_000_000) {
    @a = (1,2,3);
    @a = ();
}
  • 단일 숫자 문자열을 숫자로 변환하는 것이 상당히 빨라져요.
  • split 빌트인이 많은 경우에서 약간 빨라져요. 특히 다음 두 특수 처리 형식에서요: my @a = split ...;, local @a = split ...;.
  • 실험적 서브루틴 시그니처 기능의 느린 구현이 훨씬 빨라져서 이제 전통적인 my ($a, $b, @c) = @_와 속도가 비슷해요.
  • Bareword 상수 문자열이 상수 폴딩에 참여할 수 있게 됐어요. 원래는 1999년 8월 Perl 5.6 개발 중 use strict "subs"가 bareword 상수에 여전히 적용되도록 상수 폴딩에서 제외됐었는데, 이제 다른 방식으로 달성돼 bareword도 다른 상수처럼 상수 폴딩의 성능 이점을 얻어요. 또한 bareword 상수 표현식의 void-문맥 경고가 연산 대신 접힌 상수 피연산자를 보고하는데, 이는 비-bareword 상수와 일치해요.

모듈과 프래그마

업데이트된 모듈과 프래그마(일부): IO::Compress 2.069→2.074, Archive::Tar 2.04→2.24, arybase 0.11→0.12, attributes 0.27→0.29(:unique/:locked의 deprecation 메시지가 Perl 5.28에서 사라질 것 언급), B 1.62→1.68, B::Concise 0.996→0.999(op_private 플래그에 더 설명적), B::Debug, B::Deparse 1.37→1.40, B::Xref, base 2.23→2.25, bignum, Carp 1.40→1.42, charnames, Compress::Raw::Bzip2/Zlib 2.069→2.074, Config::Perl::V, CPAN 2.11→2.18, CPAN::Meta, Data::Dumper 2.160→2.167(XS 구현이 Deparse 지원), DB_File, Devel::Peek, Devel::PPPort, Devel::SelfStubber, diagnostics, Digest, Digest::MD5, Digest::SHA, DynaLoader, Encode 2.80→2.88, encoding 2.17→2.19(기본 모드 더 이상 미지원, Filter 옵션 안 쓰면 임포트 시 죽음), encoding::warnings(더 이상 미지원, 경고 후 아무것도 안 함), Errno 1.25→1.28(%! 사용이 Errno 자동 로드 문서화), ExtUtils::Embed, ExtUtils::MakeMaker, ExtUtils::Miniperl, ExtUtils::ParseXS, ExtUtils::Typemaps, feature, File::Copy, File::Fetch, File::Glob(File::Glob::glob()이 deprecation 메시지), File::Spec, FileHandle, Filter::Simple(더 이상 use MyFilter 직후 no MyFilter를 EOF로 취급 안 함), Getopt::Long, Getopt::Std, Hash::Util, HTTP::Tiny 0.056→0.070(내부 599-시리즈 오류가 리디렉션 기록 포함), I18N::LangTags, IO, IO::Socket::IP, IPC::Cmd, IPC::SysV, JSON::PP, lib, List::Util 1.42_02→1.46_02, Locale::Codes, Locale::Maketext, Locale::Maketext::Simple, Math::BigInt, Math::BigInt::FastCalc, Math::BigRat, Math::Complex, Memoize, Module::CoreList, Module::Load::Conditional, Module::Metadata, mro, Net::Ping 2.43→2.55(IPv6 주소와 AF_INET6 소켓 지원), NEXT, Opcode, open, OS2::Process, overload 1.26→1.28(컴파일 속도 개선), parent, perl5db.pl 1.50→1.51(비-Unix 시스템에서 /dev/tty 무시), Perl::OSType, perlfaq, PerlIO, PerlIO::encoding, PerlIO::scalar, Pod::Checker 1.60→1.73, Pod::Functions, Pod::Html, Pod::Perldoc, Pod::Simple, Pod::Usage, POSIX 1.65→1.76(tmpnamisalnum/isalpha/iscntrl/isdigit/isgraph/islower/isprint/ispunct/isspace/isupper/isxdigit/tolower/toupper 제거, 실현이 없는 POSIX sub 임포트가 임포트 시점에 실패), re 0.32→0.34(새 /xx 수정자, re 'strict' 실험 기능), Safe 2.39→2.40, Scalar::Util, Storable, Symbol, Sys::Syslog, Term::ANSIColor, Term::ReadLine, Test, Test::Harness 3.36→3.38, Test::Simple, Thread::Queue, Thread::Semaphore(down_timed 메서드 추가), threads, threads::shared, Tie::Hash::NamedCapture, Time::HiRes 1.9733→1.9741(C++11 컴파일러 빌드, clockid_t 사용), Time::Local, Unicode::Collate, Unicode::UCD, version, VMS::DCLsym, warnings, XS::Typemap, XSLoader 0.21→0.27(@INC 밖 경로에서 바이너리 로드 보안 구멍 수정).

문서화

새 문서

perldeprecation — 이 파일은 앞으로의 모든 deprecated 사항과 이미 제거된 일부 deprecated 사항을 문서화해요. 목적은 무엇이 어떤 버전에서 사라질지 문서화하고, perl 업그레이드 후 더 이상 동작하지 않는 기능을 다루는 사람들을 위한 안내 역할을 하는 거예요.

기존 문서 변경

모든 참조에서 Usenet 언급이 제거됐어요. 선택된 변경: perlfunc(defined()에 대한 구텍스트 제거, eval()/evalbytes() 교정, seek()/tell()/sysseek() 위치가 바이트임을 강조, sort()$a/$b 명확화, study() 문서 제거, vec()이 255 초과 코드 포인트에서 잘 작동 안 함), perlguts(Size_t/SSize_t 피연산자 형식화 조언), perlhack(탭 규칙, SPACE로 전환), perlhacktips(cBOOL, TRUE/FALSE), perlinterp(파서 탐색 예제 확장), perllocale(호환 불가 로케일이 코어 덤프 일으킬 수 있음), perlmod, perlmodlib, perlobj(완전 자격 이름 메서드 호출 섹션, 수동 @ISA 비권장 철회), perlootut(Moo 언급), perlop(구분자가 단어 문자면 공백 사용, 작은따옴표 구분 패턴에서 변수 보간 없음), perlre(전면 재작성, /x에서 "#" 이스케이프), perlretut(소개 자료, 메타문자 리터럴 매칭), perlunicode(BYTE ORDER MARK, UTS#18), perlvar(@ISA 문서화).

진단

새 오류

  • A signature parameter must start with '$', '@' or '%'
  • Bareword in require contains "%s"
  • Bareword in require maps to empty filename
  • Bareword in require maps to disallowed filename "%s"
  • Bareword in require must not start with a double-colon: "%s"
  • %s: command not found (A) 스크립트를 Perl 대신 bash나 다른 셸로 실수로 실행했어요. #! 줄을 확인하세요.
  • %s: command not found: %s (A) zsh로 실행된 경우.
  • The experimental declared_refs feature is not enabled (F) my \%x처럼 변수에 대한 참조를 선언하려면 먼저 피처를 켜야 해요:
no warnings "experimental::declared_refs";
use feature "declared_refs";
  • Illegal character following sigil in a subroutine signature
  • Indentation on line %d of here-doc doesn't match delimiter
  • Infinite recursion via empty pattern — 빈 패턴(마지막 성공 매치 패턴을 재실행)을 다른 regex의 코드 블록 안에서 쓰면(/(?{ s!!new! })/처럼) 이전에는 항상 segfault였는데, 이제 이 오류를 내요.
  • Malformed UTF-8 string in "%s"
  • Multiple slurpy parameters not allowed
  • '#' not allowed immediately following a sigil in a subroutine signature
  • panic: unknown OA_*: %x
  • Unescaped left brace in regex is illegal here — 정규 표현식 패턴의 일부 문맥에서 이제 무효. 다른 문맥에서는 여전히 deprecated이고 Perl 5.30에서 무효가 돼요.
  • Version control conflict marker (F) 파서가 <<<<<<<, >>>>>>>, =======로 시작하는 줄을 찾았어요. 병합 실패 후 버전 관리 시스템이 남긴 것일 수 있어요.

새 경고

  • Can't determine class of operator %s, assuming BASEOP
  • Declaring references is experimental (S experimental::declared_refs) my(), state(), our(), local()의 우변에 참조 생성자를 쓰면 발생해요:
no warnings "experimental::declared_refs";
use feature "declared_refs";
$fooref = my \$foo;
  • do "%s" failed, '.' is no longer in @INC"."이 기본 @INC에서 제거됐으므로 do가 이제 고치도록 권장하는 경고를 발생시켜요.
  • File::Glob::glob() will disappear in perl 5.30. Use File::Glob::bsd_glob() instead.
  • Unescaped literal '%c' in regex; marked by <-- HERE
  • Use of unassigned code point or non-standalone grapheme for a delimiter will be a fatal error starting in Perl 5.30

기존 진단 변경

  • require가 실패할 때, 파일용(모듈 아님) require면 @INC를 제공하지 않아요.
  • @INC가 require 호출에 대해 스캔되지 않으면 혼동을 피하려고 @INC를 표시하지 않아요.
  • Attribute "locked" is deprecated, and will disappear in Perl 5.28 — "will disappear" 텍스트가 추가됐어요 (unique도 동일).
  • Calling POSIX::%s() is deprecated — deprecated 함수가 POSIX에서 제거되어 경고도 제거됐어요.
  • Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32 — "will not be allowed" 텍스트 추가.
  • Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 — "will be a fatal error" 텍스트 추가.
  • dump() better written as CORE::dump(). dump() will no longer be available in Perl 5.30 — "no longer be available" 텍스트 추가.
  • Experimental %s on scalar is now forbidden — 더 도움이 되는 텍스트가 뒤따라요.
  • Experimental "%s" subs not enabled — 제거됨(어휘 sub가 더 이상 실험적이지 않음).
  • Having more than one /%c regexp modifier is deprecated — 제거됨(/xx가 새 의미를 가짐).
  • %s() is deprecated on :utf8 handles. This will be a fatal error in Perl 5.30sysread/recv/syswrite/send. 기본 활성화.
  • $ is no longer supported. Its use will be fatal in Perl 5.30* — "its use will be fatal" 텍스트 추가 (그리고 $#도).
  • Malformed UTF-8 character%s — 정확한 문제 세부사항이 메시지 끝에 추가됐어요.
  • Missing or undefined argument to %s — 이제 연산 이름을 정확히 가져요.
  • NO-BREAK SPACE in a charnames alias definition is deprecated — 제거됨(이제 오류).
  • Odd name/value argument for subroutine '%s' — 이제 범인 서브 이름 포함.
  • Opening dirhandle %s also as a file. This will be a fatal error in Perl 5.28 (filehandle도 동일) — "will be a fatal error" 텍스트 추가.
  • panic: ck_split, type=%u / panic: pp_split — 제거됨.
  • Passing malformed UTF-8 to "%s" is deprecated — 치명적 "Malformed UTF-8 string in "%s""로 변경.
  • Setting $/ to a reference to %s as a form of slurp is deprecated, treating as undef. This will be fatal in Perl 5.28 — "will be fatal" 텍스트 추가.
  • ${^ENCODING} is no longer supported. Its use will be fatal in Perl 5.28 — 이 변수에 대입하는 게 이제 경고 외 효과가 없어요.
  • Too few/many arguments for subroutine '%s' — 범인 서브 이름 포함.
  • Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30) — "here (and will be fatal...)" 텍스트 추가.
  • Unknown charname '' is deprecated. Its use will be fatal in Perl 5.28 — "will be fatal" 텍스트 추가.
  • Use of bare << to mean <<"" is deprecated. Its use will be fatal in Perl 5.28
  • Use of code point 0x%s is deprecated; the permissible max is 0x%s. This will be fatal in Perl 5.28
  • Use of comma-less variable list is deprecated. Its use will be fatal in Perl 5.28
  • Use of inherited AUTOLOAD for non-method %s() is deprecated. This will be fatal in Perl 5.28
  • Use of strings with code points over 0xFF as arguments to %s operator is deprecated. This will be a fatal error in Perl 5.28

유틸리티 변경

  • c2phpstruct — 오래전에 h2xs로 대체된 옛 유틸리티로, 이제 배포에서 제거됐어요.
  • Porting/pod_lib.pl — 잘못된 실행 비트 제거, DOS 파일 끝 처리.
  • Porting/sync-with-cpan — 많은 개선.
  • perf/benchmarks — 파일 정리, 심볼 이름 변경.
  • Porting/checkAUTHORS.pl — 난해한 문자 범위를 \w로 대체.
  • t/porting/regen.t — 테스트 실패 시 더 도움이 되도록.
  • utils/h2xs.PL — 열거형의 무한 루프 방지.
  • perlbug — 본문의 긴 줄을 900자에서 줄바꿈(1000자 SMTP 제한 내). 첫 단위 테스트 추가.

구성과 컴파일

  • -Ddefault_inc_excludes_dot 추가, 기본 활성화.
  • dtrace 빌드 프로세스 변경(FreeBSD jail 내 빌드, 객체 별도 디렉터리 처리, FreeBSD 10.x에 libelf 추가, 더미 dtrace_main.o 생성).
  • -Accflags=NO_PERL_HASH_ENVPERL_HASH_SEED/PERL_PERTURB_KEYS 환경 변수 사용 비활성화 가능.
  • PERL_HASH_SEED_DEBUG 환경 변수 사용 비활성화 가능.
  • Configure가 80비트 NaN/Inf 바이트 계산 시 정렬 바이트를 0으로 만들어 재현성 있는 빌드.
  • 5.18부터 포함했던 비표준·비권장 해시 함수 빌드 옵션 제거: PERL_HASH_FUNC_SDBM, DJB2, SUPERFAST, MURMUR3, ONE_AT_A_TIME, ONE_AT_A_TIME_OLD, MURMUR_HASH_64A, MURMUR_HASH_64B.
  • "Warning: perl appears in your path" 설치 경고 제거(대부분 플랫폼이 이미 OS 제공 /usr/bin/perl).
  • make install.man의 장황함 감소(750줄 이상 절약).
  • clang -Weverything 지원 정리.
  • Configure: signbit 스캔이 음의 0을 가정하던 것 중단.
  • C++11 컴파일 장애물 제거.
  • USE_PAD_RESET 빌드 복구.
  • gai_strerror 프로브 추가(getaddrinfo() 오류 코드 번역).
  • -Duselongdouble-Dusequadmath를 동시에 요청하면 Configure가 중단.
  • -quadmath를 archname에 중복 추가하던 버그 수정.
  • PERL_GLOBAL_STRUCT/PERL_GLOBAL_STRUCT_PRIVATE의 Clang 빌드 수정.
  • make_ext.pl이 불필요한 pm_to_blib 갱신을 하지 않아 perlmain.c 불필요 재빌드 방지.
  • perl -V 출력 재포맷(옵션당 한 줄).
  • Configure -Dusecrosscompiler(타깃 호스트 없이)가 miniperl/generate_uudmap 빌드.
  • -DPERL_TRACE_OPS 빌드가 PERL_TRACE_OPS 환경 변수가 0이 아닐 때만 연산자 카운트 덤프.
  • GCC 6 + -flto 빌드의 프로브 심볼 버그 수정.
  • t/test.pl의 Perl 5.8 호환성 복원.
  • 빌드 프로세스가 "simple" 확장 빌드 전에 불필요한 빈 줄 미발행.

테스트

  • 새 테스트 comp/parser_run.t(runperl() 사용 가능).
  • 로케일 테스트가 Perl과 호환 안 되는 로케일을 사용하던 것 수정.
  • 정규 표현식 구현 엣지 케이스를 소진 테스트하는 일부가 최대 5분으로 제한(느린 시스템에서 몇 시간 걸리던 것).
  • Perl 자체 테스트 수트의 개별 테스트 시간 분석을 위한 새 내부 시설 Porting/harness-timer-report.pl.
  • t/re/regexp_nonull.t 추가(문자열 끝 직후 null 바이트 없는 스칼라 처리).
  • t/op/decl-refs.t 추가(참조 선언).
  • t/re/keep_tabs.t 추가(\t가 공백으로 확장 안 되어야 하는 테스트).
  • t/re/anyof.t 추가(브래킷 문자 클래스가 생성한 ANYOF 노드).
  • 유니코드 관련 API 매크로·함수 테스트 확장.
  • 오래 실행되는 API 테스트 파일을 병렬 실행 위해 분할.
  • t/harness가 Perl 소스 트리 밖 테스트를 실행 안 하도록.
  • 디버거 테스트가 $ENV{PERLDB_OPTS}로 실패 안 하도록.

플랫폼 지원

새 플랫폼

NetBSD/VAX — Perl이 VAX 머신의 NetBSD에서 컴파일돼요. 하지만 그 플랫폼은 대부분의 현대 시스템(과 호환되는 IEEE-754 부동소수점)처럼 부동소수점 무한대·NaN을 구현할 수 없어요. 16진수 부동소수점(0x...p[+-]n 리터럴, printf %a)도 구현되지 않아요. make test는 98% 통과.

플랫폼별 주석

  • Darwin-Dprefix=/usr를 특수 취급하지 않고 -Ddarwin_distribution 요구. OS X El Capitan은 clock_gettime()/clock_getres() 미구현(에뮬레이션). macOS 10.12에서 syscall(2) deprecated.
  • EBCDIC — 여러 테스트가 EBCDIC에서 동작/스킵되도록 갱신.
  • HP-UXNet::Ping UDP 테스트 스킵.
  • Hurd — hints 개선(malloc wrap, GNU libc 보고).
  • VAX — NetBSD에서 VAX 부동소수점 포맷 지원.
  • VMS — Unix 셸에서 PERL5LIB/PERLLIB의 경로 구분자가 콜론(":"). VSI-branded C 컴파일러 인식.
  • Windows — Visual Studio 2015(VC++ 14.0) 지원 추가. VS2015부터 이전 소켓 close() 버그 수정을 되돌림(빌드는 우선). GCC vs VC 자동 감지.
  • Linux — Linux a.out 실행 파일 포맷 지원 중단(20년 넘게 ELF 사용).
  • OpenBSD 6SA_SIGINFOpid/gid/uid 반환 미지원.
  • FreeBSDt/uni/overload.t 매달림 스킵.
  • DragonFly BSDsetproctitle() 지원.

내부 변경

  • 새 API 함수 sv_setpv_bufsize()가 SV에서 버퍼 길이와 할당 크기를 동시에 설정(필요시 버퍼 증가).
  • 새 API 매크로 SvPVCLEAR()가 SV 인자를 빈 문자열로 설정(Perl 공간 $x = ''처럼, 여러 최적화 포함).
  • 유니코드·UTF-8 문자열용 새 매크로·함수 여러 개 추가:
    • isALPHA_utf8/toLOWER_utf8 같은 매크로의 _safe 접미 버전(읽기 안전 상한 인자 추가).
    • isALPHA_utf8/toLOWER_utf8 같은 매크로가 입력 UTF-8이 malformed면 이제 die.
    • utf8 시퀀스 유효성 분석용 새 매크로: UTF8_GOT_ABOVE_31_BIT, UTF8_GOT_CONTINUATION, UTF8_GOT_EMPTY, UTF8_GOT_LONG, UTF8_GOT_NONCHAR, UTF8_GOT_NON_CONTINUATION, UTF8_GOT_OVERFLOW, UTF8_GOT_SHORT, UTF8_GOT_SUPER, UTF8_GOT_SURROGATE, UTF8_IS_INVARIANT, UTF8_IS_NONCHAR, UTF8_IS_SUPER, UTF8_IS_SURROGATE, UVCHR_IS_INVARIANT, isUTF8_CHAR_flags, isSTRICT_UTF8_CHAR, isC9_STRICT_UTF8_CHAR.
    • is_utf8_string_*() 확장 함수: is_strict_utf8_string*, is_c9strict_utf8_string*, is_utf8_string_flags*, is_utf8_fixed_width_buf*_flags, is_utf8_invariant_string, is_utf8_valid_partial_char*.
    • utf8n_to_uvchr와 파생 함수의 동작 변경(길이 0은 단언/REPLACEMENT CHARACTER, overlong·overflow malformation 처리, 첫 malformation에서 검색 포기 중단 — 이제 다중 진단 가능).
    • 새 API valid_utf8_to_uvchr()(잘 형성됐다고 가정, 주의).
    • 새 함수 utf8n_to_uvchr_error()(malformation 세부사항).
    • 더 안전한 utf8_hop_safe(), 방향 지정 utf8_hop_forward()/utf8_hop_back().
    • 유용한 utf8 바이트 시퀀스 반환 매크로 BOM_UTF8, REPLACEMENT_CHARACTER_UTF8.
  • Perl이 이제 PERL_OP_PARENT 컴파일러 define을 기본 활성화로 빌드(비활성화는 PERL_NO_OP_PARENT). 5.22에서 선택 사항이었음.
  • 새 op 세 개 OP_ARGELEM, OP_ARGDEFELEM, OP_ARGCHECK — 서브 시그니처 요소 구현.
  • OP_PUSHRE op 제거, OP_SPLIT op가 LISTOP에서 PMOP로 변경. 스플릿의 regex가 이제 split op에 직접 붙어요.
  • API 함수 op_class() 추가 — op가 어떤 struct로 할당됐는지 더 정확히 판단.
  • 내부가 sassign op가 BINOP임에 동의(이전엔 BASEOP 나열).
  • op_dump()(perl -Dx가 사용) 출력 형식 변경 — "ASCII-art" 트리 구조, op 주소·클래스 등 저수준 세부사항.
  • PADOFFSET 타입이 unsigned에서 signed로, 여러 pad 변수(PL_padix 등)가 I32PADOFFSET.
  • DEBUGGING 모드 regex 컴파일·실행 출력 개선.
  • 여러 SV 플래그 제거: SVpbm_VALID, SVpbm_TAIL, SvTAIL_on, SvTAIL_off, SVrepl_EVAL, SvEVALED.
  • op_private 플래그 OPpRUNTIME 제거.

주요 버그 수정

  • 버그 있는 strxfrm() 구현을 가진 머신에서 특정 로케일로 전환 시 panic 중단.
  • $-{$name}이 이름 있는 캡처 없는 regex에서 접근 시 AV 누출(전에 $-{$name} → leak).
  • deprecated $#를 간접 객체 메서드 호출의 객체로 쓰는 시도가 heap use-after-free/buffer overflow 일으킬 수 있던 것.
  • 간접 객체 메서드 검사 중 파서가 줄 버퍼 재할당 후 옛 버퍼 포인터 사용하던 것.
  • formline의 형식 인자로 glob을 주면 단언 실패.
  • $value1 =~ qr/.../ ~~ $value2 코드가 매치를 qr//로 변환해 스택에 여분 요소 남기던 것.
  • 5.24 이후 다중 소스(qr// 객체 삽입 등) 코드 블록 포함 regex가 잘못된 현재 패드로 크래시하거나 이상한 결과.
  • 패턴의 코드 블록에서 local()이 백트래킹 시 취소 안 되던 것.
  • substr()로 매직 변수 수정 시 해제된 메모리 접근 가능.
  • use utf8 아래에서 이제 전체 소스 코드가 UTF-8 well-formed인지 검사(이전엔 따옴표 문자열만).
  • unicode_strings 피처 스코프에서 문자열 ".." 범위 연산자 인자 처리 개선.
  • split이 스칼라 문맥에서 반환값 공간을 충분히 할당 안 하던 것(스택 블록 끝 너머 한 포인터 쓰기).
  • 큰 코드 포인트를 "W" pack 템플릿 문자로 현재 출력 위치가 알맞게 정렬된 상태에서 쓰면 할당 버퍼 끝 너머 한 0바이트 쓰기 가능.
  • 형식의 picture 인자를 형식 인자 목록의 일부로 제공하면서 picture가 인자 수정 지정 시 해제된 컴파일 형식 접근.
  • sort()의 내장 숫자 비교가 double로 정확히 표현 안 되는 큰 정수 처리 안 하던 것. 이제 <=> 구현과 동일 코드.
  • / (?{ ... <<EOF })/ 관련 Method::Signatures 깨짐 수정.
  • chop/chomp의 단언 실패(chop(@x =~ tr/1/1/)로 유발).
  • /x 아래 주석 건너뛰기 오류(UTF-8 문자 중간에서 일찍 멈출 수 있던 것).
  • perldb가 비-Unix 시스템에서 /dev/tty 무시.
  • {}->$x($x 미정의)의 단언 실패.
  • 패턴의 lookahead 문자열이 최소 길이 초과 시 단언 오류.
  • 리터럴 숫자당 잘못된 "_"에 대해 한 번만 경고.
  • 파싱 오류 후 tr/// 파스 코드가 미초기화 데이터 보던 것.
  • 매치에서 매칭 안 된 캡처의 역참조(\1)가 매칭 문자열 시작 너머 읽기.
  • use re 'strict'U+1D7E에서 시작하는 수학 숫자 다섯 그룹의 범위 경고 안 하던 것.
  • 같은 이름의 "forward" 선언 포함 서브(sub c { sub c; })가 크래시/무한 루프.
  • 비고정 UTF-8 부분 문자열을 대상으로 한 regex 실행 크래시 수정.
  • shebang #!perl -i u-u 옵션으로 잘못 해석되던 것.
  • regex 엔진이 단일 항목만 매칭하는 교대를 백트래킹할 때 잘못된 결과(캡처 버퍼가 실제 최종 매치에 실행되지 않은 경로 데이터 포함).
  • 실험적 regex_sets 기능 사용 regex의 단언 실패.
  • \eval=time 같은 참조 생성자에 대한 무효 대입 크래시.
  • evalbytes 뒤 bareword 시 파서 크래시.
  • invocant가 블레스된 패키지에 스텁이 있으면 메서드 호출 자동 로드가 잘못된 경고.
  • 존재하지 않는 요소가 있는 배열에서 splice 사용 시 다른 연산자 크래시.
  • 패턴이 고정 utf8 부분 문자열 포함 시 버퍼 오버런 가능.
  • lexer의 두 use-after-free 버그.
  • s///l이 UTF-8 아닌데 UTF-8로 착각하는 크래시.
  • regex 파서가 문법 오류 패턴에 문법 오류를 잘못 설정하던 것.
  • &. 연산자(및 문자열 처리 "&")가 utf8 문자열에서 끝 null 바이트 추가 실패·단언 실패.
  • 문법 무효 heredoc 오류 메시지 생성 시 parser heap-after-use 피함.
  • DEBUGGING 빌드에서 -DC로 실행 시 segfault 수정.
  • ")" 없는 :attr(foo의 서브 속성 파서 오류 처리.
  • lexer가 따옴표 문자열 문맥에서 마지막 문자 백슬래시 처리(두 버그 수정).
  • gv_fetchmethod_pvn_flags에서 무효 len 인자로 문자열 오버런 방지 재작업.
  • 인플레이스 배열 정렬(@a = sort { ... } @a)의 부작용 두 가지 수정(정렬 루틴이 부분 정렬된 @a 보던 것, 접근 시 크래시). 이제 정렬 함수가 @a의 원래 값 봄.
  • 비-ASCII 문자열 구분자가 종결 안 된 문자열의 오류 메시지에 정확히 보고.
  • pack("p", ...)의 잘못된 경고 수정.
  • @DB::args가 "used once" 경고에서 제외.
  • 이중 따옴표 문자열의 내장 배열·해시 슬라이스(qq|@DB::args|, qq|@SIG{'CHLD','HUP'}|)가 "Possible unintended interpolation" 경고 더 이상 안 냄.
  • gethostent 등이 torsocks 라이브러리와의 크래시 피하려 내부 null 검사.
  • defined *{'!'}, defined *{'['}, defined *{'-'} 메모리 누출 수정.
  • 같은 상수를 연속 두 번 언급(문법 오류)이 디버그 빌드 단언 실패 안 함.
  • printf "%a" 16진부동소수 관련 여러 문제 수정. "subnormal"(이전 "denormal") 부동소수점이 IEEE 754(64/128비트)와 x86 80비트 "extended precision" 모두 지원.
  • 5.24의 tr/\N{U+...}/foo/(128~255 코드 포인트) 회귀 수정.
  • 코드 포인트가 2**31 초과인 문자열 구분자 사용이 이제 허용하는 플랫폼에서 올바르게 동작(비이식적, Perl의 UTF-8 확장에 기반).
  • @{x 뒤 새 줄(제어·비-ASCII)이 깨진 문법 오류·크래시 안 냄.
  • %: = 0의 단언 실패 수정.
  • 5.18에서 "$foo::$bar" 파싱이 $foo."::".$bar로 잘못 바뀌던 것 복원($foo:: . $bar).
  • 5.20 이후 -x 스위치로 실행 시 줄 번호가 하나 밀리던 것 수정.
  • 삭제된 stash에서 서브 스텁 vivify(delete $My::{"Foo::"}; \&My::Foo::foo)가 크래시 안 함(5.18 이후).
  • 서브루틴과 파일핸들이 동시에 해제되던 난해한 크래시 수정(5.22 도입).
  • 매직 관련($ISA[0][0] 같은) 미초기화 값의 변수 이름 검색 코드 단언 실패 수정.
  • "Subroutine STASH::NAME redefined" 경고를 내는 코드(sub P::f{} undef *P::; *P::f = sub{};)의 크래시 수정. 순환에서 아치가 없으면 "Subroutine NAME redefined"로 표시.
  • 형식의 deprecated 동작 처리 코드가 트리거하는 단언 수정(format STDOUT = ... 0"$x" 같은).
  • Windows 문자열 변환 코드의 0으로 나누기 방지(빈 문자열 조합 크래시).
  • /(?<=//(?<!/같은 정규 표현식 파싱 결함의 단언 실패 수정.
  • until ($x = 1) { ... }... until $x = 1이 문법 경고 활성 시 제대로 경고.
  • socket()이 실패 시 시스템 반환 오류 코드를 $!에 남김.
  • bitwise 피처 아래 비트 연산 op의 대입 변형이 LHS가 배열·해시면 크래시 하던 것.
  • 단일 콜론 뒤 require(foo() ? require : ...)가 require ""가 아닌 암시 $_require로 올바르게 파싱.
  • 스칼라 keys %hash가 모든 스칼라 lvalue 문맥에서 일관되게 대입 가능.
  • vec/substr에 배열·해시 첫 인자 목록 대입이 런타임 크래시/ "Can't coerce" -> 컴파일 타임 오류.
  • &&/||(그리고 and/or) 연산자 포함 표현식이 부정된 bareword 상수/부정된 do {} 상수 블록 + 부정된 비폴드 표현식일 때 부정 하나가 무시되던 오래된 버그 수정. if/unless 문장 수정자도(좌우 바뀜).
  • 인자 있는 reset이 glob 아닌 stash 항목에서 크래시 안 함.
  • *:::::: 이름의 typeglob에 해시 대입·삭제 크래시 안 함.
  • 목록 대입 LHS의 true/false 값(boolean 연산자 반환) 처리 개선(5.24 회귀 단언 실패 수정).
  • 사용자 정의 유니코드 유사 속성의 단언 실패.
  • regex에서 닫히지 않은 \N{의 오류 메시지 수정("\N{NAME} must be resolved by the lexer" 잘못된 것).
  • 리스트 문맥에서 LHS에 집합체 있고 RHS 요소 부족한 목록 대입이 스칼라 lvalue 건너뛰던 것 수정. (($a,$b,@c,$d) = (1))이 이제 ($a,$b,$d) 반환.
  • / (?{ s!!! })/ 같은 코드가 C 스택 무한 재귀 — 현재 실행 패턴으로 해석될 때 빈 패턴 사용 금지로 segfault 방지.
  • lexer가 끝에 짧은 UTF-8 문자 있을 때 줄 버퍼 끝 너머 읽기 방지.
  • 유니코드 대안에 유니코드 문자열 매칭 교대 실패 수정.
  • do "a\0b"가 오류 대신 조용히 실패(undef 반환, $! 설정).
  • 인자 없는 chdir이 결과 반환 스택 공간 확보.
  • do 관련 오류 메시지가 모두 do를 언급(일부는 require였다고 주장).
  • tied/매직 undef $x 실행 시 uninitialized-value 경고를 잘못 변수 탓하지 않음.
  • $x = $x . "a"($x가 미정의 어휘 변수)가 "use of uninitialized value" 경고 누락 수정.
  • undef *_; shift/undef *_; pop(5.14부터 크래시) 수정.
  • "string$scalar->$*"이 이제 $scalar->$*가 오버로드 객체 반환 시 문자열 오버로딩보다 접합 오버로딩 선호($$scalar와 일관).
  • /@0{0*-&gt;@*/*0 같은 코드가 크래시 대신 문법 오류.
  • 문자열화 시 null 문자 포함 참조/typeglob 인자의 do/require 크래시(5.20부터) 수정.
  • 누락 tie() 패키지/메서드 오류 메시지 개선(정상 메서드 호출과 일치).
  • 잘못된 POSIX charclass 파싱이 메모리 누출 안 함.

알려진 문제

G++ 6이 subnormal 부동소수점 값을 gcc 6나 g++ 5와 다르게 처리해 "flush-to-zero"가 됨. 결과적으로 0x1.fffffffffffffp-1022 같은 매우 작은 16진수 부동소수점이 0이 됨.

이전 릴리스의 정오표

재귀 regex 문제가 5.24에서 수정됨.

부고

Jon Portnoy(AVENJ)는 다작의 Perl 저자이자 존경받는 Gentoo 커뮤니티 일원으로 2016년 8월 10일에 세상을 떠났어요. Kip Hampton도 애도해요. Perl & XML 컬럼의 저자, AxKit 핵심 기여자, OSCON 초기 연사로 잘 알려졌어요.

감사의 말

Perl 5.26.0은 5.24.0 이후 약 13개월 개발, 86명 저자가 2,600개 파일에 약 360,000줄 변경. 자동 생성/문서/릴리스 도구 제외하면 1,800개 .pm/.t/.c/.h 파일에 약 230,000줄. 목록은 버전 관리 기록에서 자동 생성되어 불완전할 가능성이 커요.

버그 보고

https://rt.perl.org/에서 버그 데이터베이스를 확인하고, 미보고 버그는 perlbug 프로그램을 실행하세요. 보안 함의가 있는 버그는 perlsec의 "SECURITY VULNERABILITY CONTACT INFORMATION"을 보세요.

감사 표현

perlthanks 프로그램을 실행해 Perl 5 Porters에게 감사를 보낼 수 있어요.

함께 보기

Changes 파일(변경 세부사항), INSTALL 파일(빌드), README 파일(일반).