Perl 5.36.0 변경 사항
Perl 5.36.0 변경 사항 (perl5360delta)
이 문서는 Perl 5.34.0 릴리스와 5.36.0 릴리스 사이의 차이를 설명해요.
핵심 개선 사항 (Core Enhancements)
use v5.36
언제나처럼 use v5.36은 그 버전의 Perl용 feature bundle을 켜요.
5.36 bundle은 signatures feature를 켜요. Perl 5.20.0에서 도입되고 이후 여러 번 수정된 서브루틴 시그니처 feature는 이제 더 이상 실험적이지 않아요. 안정적인 언어 기능으로 간주되어 더 이상 경고를 출력하지 않아요.
use v5.36;
sub add ($x, $y) {
return $x + $y;
}
그럼에도 시그니처 서브루틴의 특정 요소는 여전히 실험적이에요 (아래 참고).
5.36 bundle은 isa feature를 켜요. Perl 5.32.0에서 도입된 후 변경 없이 유지된 이 연산자는 이제 안정적인 언어 기능으로 간주돼요. 자세한 내용은 perlop의 "Class Instance Operator"를 참고하세요.
5.36 bundle은 또한 indirect와 multidimensional feature를 끕니다. 각각 "indirect" 메서드 호출(예: $x = new Class;)과 희소 다차원 배열을 흉내내기 위한 리스트 표현식의 해시 키 사용을 금지해요. 요약하면 "더 많은 use strict가 켜진 것"처럼 문제를 일으키기 쉬운 기능을 꺼요.
또한 use v5.36은 use warnings를 쓴 것처럼 경고도 켜요.
마지막으로, v5.10부터 모든 feature bundle에 있던 실험적 switch feature가 v5.36 bundle에서 제거됐어요. (권장되진 않지만) 쓰고 싶다면 명시적으로 활성화해야 해요.
-g 명령줄 플래그
새 명령줄 플래그 -g가 추가됐어요. -0777의 더 간단한 별칭이에요. (perlrun/-g 참고)
Unicode 14.0 지원
자세한 내용은 https://www.unicode.org/versions/Unicode14.0.0/ 참고.
regex sets는 더 이상 실험적이지 않음
이번 릴리스 전까지 regex sets 기능(공식 명칭 "Extended Bracketed Character Classes")은 실험적이었어요. 5.18.0에서 도입되고 여러 번 수정된 후 이제 안정적인 언어 기능으로 간주되고 경고를 출력하지 않아요. (perlrecharclass의 "Extended Bracketed Character Classes" 참고)
가변 길이 lookbehind는 대부분 더 이상 실험적이지 않음
이전에는 어떤 형태의 가변 길이 lookbehind도 실험적이었어요. 이 릴리스에서 그 범위가 캡처링 괄호를 포함하는 lookbehind만으로 축소됐어요. "aaz"=~/(?=z)(?<=(a|aa))/가 $1을 "a"로 남겨야 할지 "aa"로 남겨야 할지 명확하지 않기 때문이에요. 현재는 가장 긴 대안 "aa"를 매칭해요. 전체 구조가 매칭해야 할 때만 매칭될 것이라는 확신은 있지만, 현재의 "longest match" 동작을 유지할지 확신하지 못해요.
SIGFPE가 더 이상 지연되지 않음
부동소수점 예외가 이제 SIGSEGV 같은 다른 "fault"형 시그널처럼 즉시 전달돼요. 따라서 $SIG{FPE} 핸들러로 그런 시그널을 잡을 기회가 생겼고, die가 이를 트리거한 perl 줄을 보고할 수 있어요.
안정적인 boolean 추적
!!0, !!1 같은 구성으로 자주 접근되고 많은 코어 함수·연산자에서 반환되는 "true"/"false" boolean 값이 이제 변수 대입을 통해서도 boolean 성질을 기억해요. 새 builtin::is_bool() 함수로 값이 boolean 성질을 가지는지 검사할 수 있어요. 다른 언어나 데이터타입 직렬화와 상호운용할 때 유용할 가능성이 높아요.
여러 값을 한 번에 반복 (experimental)
괄호 안에 렉시컬 목록을 지정해 한 번에 여러 값을 반복할 수 있게 됐어요.
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }
v5.36 이전에는 for my 뒤에 목록을 지정하는 것이 문법 오류였어요. 이 기능은 현재 실험적이며 experimental::for_list 카테고리 경고를 일으켜요. (perlsyn의 "Compound Statements" 참고, 유용한 동반자 builtin::indexed도 참고)
builtin 함수 (experimental)
인터프리터에 내장된 항상 존재하는 새 함수들을 문서화하는 새 코어 모듈 builtin이 추가됐어요.
say "Reference type of arrays is ", builtin::reftype([]);
또한 짧은 이름 버전을 제공하는 렉시컬 import 메커니즘도 제공해요.
use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);
이 메커니즘과 제공하는 함수들은 모두 현재 실험적이에요.
v5.36의 builtin 함수 요약:
- builtin::trim — 인자를 문자열로 취급해 앞뒤 공백을 제거한 결과 반환.
- builtin::indexed — 인자 목록보다 두 배 큰 목록을 반환하며 각 항목 앞에 그 인덱스를 붙임.
use builtin 'indexed'; foreach my ($index, $val) (indexed @array) { ... } - builtin::true, builtin::false, builtin::is_bool — boolean true/false 값 반환,
is_bool은 값이 boolean으로 생성됐는지 여부. - builtin::weaken, builtin::unweaken, builtin::is_weak — 참조 약화/강화/약한지 여부.
Scalar::Util의 유사 루틴 대체 가능. - builtin::blessed, builtin::refaddr, builtin::reftype — 참조에 대한 더 많은 데이터 제공.
Scalar::Util의 유사 루틴 대체 가능. - builtin::ceil, builtin::floor — 인자 이상의 최소 정수/이하의 최대 정수 반환.
POSIX의 유사 루틴 대체 가능.
defer 블록 (experimental)
defer 수식어가 붙은 블록 지원이 추가됐어요. 스코프 종료 시 실행되는 코드 섹션을 제공해요. 런타임에 defer 블록에 도달하면 그 본문은 감싸는 스코프가 종료될 때 실행되도록 설정돼요. defer 블록을 포함한 블록이 블록 도달 전에 종료되면 실행되지 않는다는 점에서 UNITCHECK와 달라요. "scope guard" 객체를 대체할 수 있어요. (perlsyn의 "defer blocks" 참고)
try/catch가 이제 finally 블록을 가질 수 있음 (experimental)
실험적 try/catch 문법이 finally 키워드로 도입되는 선택적 세 번째 블록을 지원하도록 확장됐어요.
try {
attempt();
print "Success\n";
}
catch ($e) {
print "Failure\n";
}
finally {
print "This happens regardless\n";
}
예외나 제어 흐름 키워드로 중단되어도 try/catch 구조 끝에서 실행되는 코드를 제공해요. defer 블록과 유사해요. (perlsyn의 "Try Catch Exception Handling" 참고)
quote-like 연산자의 비ASCII 구분자 (experimental)
전통적으로 Perl은 네 쌍의 구분자만 허용했어요: ( ), { }, [ ], < >, 모두 ASCII 범위. 이 기능으로 Unicode의 수백 가지 구분자를 쓸 수 있어요. 활성화되면 qr« »이나 use utf8; q𝄃string𝄂처럼 쓸 수 있어요. (feature의 extra_paired_delimiters 참고)
signatured sub에서 @_는 이제 실험적
서브루틴 시그니처가 안정화됐지만, 시그니처가 있는 sub에서 레거시 인자 배열(@_)을 사용하는 것은 여전히 실험적이며 자체 경고 카테고리 experimental::args_array_with_signatures가 있어요. experimental::signatures를 끄는 것만으로는 부족해요.
시그니처가 있고 @_나 $_[INDEX]를 명시적·묵시적으로(인자 없는 shift/pop처럼) 사용하려는 sub는 컴파일 타임 경고를 일으켜요:
use v5.36;
sub f ($x, $y = 123) {
say "The first argument is $_[0]";
}
Use of @_ in array element with signatured subroutine is experimental
at file.pl line 4.
이렇게 시도하는 코드의 동작은 더 이상 명시되지 않으며 향후 버전에서 변경될 수 있어요.
비호환 변경 (Incompatible Changes)
물리적으로 빈 sort는 이제 컴파일 타임 오류
@a = sort @empty; # 영향 없음
@a = sort; # 이제 컴파일 타임 오류
@a = sort (); # 또한 컴파일 타임 오류
빈 리스트를 만드는 이상한 방법이던 bare sort가 이제 컴파일 타임에 크록해요. sort의 미래 개선 가능성을 위해 문법 공간 일부를 비우기 위한 변경이에요.
폐기 (Deprecations)
use v5.11 이후의 (v5.11 미만) use VERSION은 폐기됨
use v5.11 이상의 스코프 안에서 X가 v5.11보다 낮은 use vX 줄은 이제 경고를 발행해요:
Downgrading a use VERSION declaration to below v5.11 is deprecated
use v5.14;
say "The say statement is permitted";
use v5.8; # 이 줄은 경고 출력
print "We must use print\n";
Perl v5.12부터 strict는 이전에 꺼지지 않았다면 켜져요. 미래에는 이 동작이 제거되고 use VERSION이 v5.12 이상에서 항상 strict를 켤 거예요. 버전을 섞고 싶은 코드는 블록 문법으로 렉시컬 스코프를 사용해 격리해야 해요:
{
use v5.14;
say "The say statement is permitted";
}
{
use v5.8; # 경고 없음
print "We must use print\n";
}
성능 개선 (Performance Enhancements)
- C11 스레드 로컬 저장소에 대한 컴파일러 지원을 probe하고, 가능하면 스레드 Perl 빌드에서 XS 확장의 "implicit context"로 사용해요. C11이 없으면 pthreads 접근을 계속 사용해요.
- 큰 해시의 키를 공유 문자열 테이블에서 할당하지 않도록 구성할 수 있어요.
<Accflags='-DPERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES>'추가. "큰"은 휴리스틱 (현재 키 추가 시 더 많은 저장소 할당이 트리거되고 해시가 42개 이상 키 가질 때). - 특정 시나리오에서 새 스칼라 생성이 눈에 띄게 빨라져요. 예를 들어 다음 코드는 약 30% 더 빨라요. [perl #19414]
$str = "A" x 64; for (0..1_000_000) { @svs = split //, $str }
모듈과 프래그마 (Modules and Pragmata)
업데이트된 모듈과 프래그마
Archive::Tar2.38→2.40,Attribute::Handlers1.01→1.02,attributes0.33→0.34,B1.82→1.83,B::Concise1.004→1.006,B::Deparse1.56→1.64,bignum0.51→0.65,charnames1.48→1.50.Compress::Raw::Bzip22.101→2.103,Compress::Raw::Zlib2.101→2.105,CPAN2.28→2.33,Data::Dumper2.179→2.184,DB_File1.855→1.857,Devel::Peek1.30→1.32,Devel::PPPort3.62→3.68,diagnostics1.37→1.39,Digest1.19→1.20,DynaLoader1.50→1.52.Encode3.08→3.17,Errno1.33→1.36,experimental0.024→0.028,Exporter5.76→5.77,ExtUtils::MakeMaker7.62→7.64,ExtUtils::Miniperl1.10→1.11,ExtUtils::ParseXS3.43→3.45,ExtUtils::Typemaps3.43→3.45,Fcntl1.14→1.15,feature1.64→1.72.File::Compare1.1006→1.1007,File::Copy2.35→2.39,File::Fetch1.00→1.04,File::Find1.39→1.40,File::Glob1.33→1.37,File::Spec3.80→3.84,File::stat1.09→1.12,FindBin1.52→1.53.GDBM_File1.19→1.23,Hash::Util0.25→0.28,Hash::Util::FieldHash1.21→1.26,HTTP::Tiny0.076→0.080,I18N::Langinfo0.19→0.21,if0.0609→0.0610.IO1.46→1.50, IO-Compress 2.102→2.106,IPC::Open31.21→1.22,JSON::PP4.06→4.07, libnet 3.13→3.14.Locale::Maketext1.29→1.31,Math::BigInt1.999818→1.999830,Math::BigInt::FastCalc0.5009→0.5012,Math::BigRat0.2614→0.2621,Module::CoreList5.20210520→5.20220520,mro1.25_001→1.26,NEXT0.68→0.69,Opcode1.50→1.57,open1.12→1.13,overload1.33→1.35.perlfaq5.20210411→5.20210520,PerlIO1.11→1.12,Pod::Functions1.13→1.14,Pod::Html1.27→1.33,Pod::Simple3.42→3.43,POSIX1.97→2.03,re0.41→0.43,Scalar::Util1.55→1.62,sigtrap1.09→1.10,Socket2.031→2.033,sort2.04→2.05,Storable3.23→3.26,Sys::Hostname1.23→1.24.Test::Harness3.43→3.44,Test::Simple1.302183→1.302190,Text::ParseWords3.30→3.31,Text::Tabs2013.0523→2021.0814,Text::Wrap2013.0523→2021.0814,threads2.26→2.27,threads::shared1.62→1.64,Tie::Handle4.2→4.3,Tie::Hash1.05→1.06,Tie::Scalar1.05→1.06,Tie::SubstrHash1.00→1.01,Time::HiRes1.9767→1.9770.Unicode::Collate1.29→1.31,Unicode::Normalize1.28→1.31,Unicode::UCD0.75→0.78,UNIVERSAL1.13→1.14,version0.9928→0.9929,VMS::Filespec1.12→1.13,VMS::Stdio2.45→2.46,warnings1.51→1.58,Win320.57→0.59,XS::APItest1.16→1.22,XS::Typemap0.18→0.19,XSLoader0.30→0.31.
문서화 (Documentation)
새 문서
- Porting/vote_admin_guide.pod: Perl Core Team 내 선거/투표 관리 절차.
기존 문서 변경
perlapi: 정리됨, 이전에 미문서화였던 함수의 80% 이상이 문서화되거나 부적절하게 API로 표시된 것으로 판정.perldeprecation:Pod::Html에서Pod::Html::Util로 이동된 함수의 새 위치.perlexperiment::win32IO pseudolayer가 제거됨을 명시 (5.35.2에서).perlgov: 후보자가 열린 자리보다 많지 않으면 투표를 건너뛸 수 있게 선거 절차 조정. 특별 선거를 최대 12주 연기 가능.perlop: invocant는 메서드 호출에서만 객체/클래스명이면 되고 서브루틴 참조에서는 아님을 명시.perlre:/dregexp 수식어 사용을 권장하지 않도록 갱신.perlrun:-?가-h의 동의어,-g가-0777의 동의어.
진단 (Diagnostics)
새 진단
새 오류:
- "Can't "%s" out of a "defer" block" — (F)
return,goto, 루프 제어 등으로 defer 블록 스코프 밖으로 점프하는 시도. 허용되지 않음. - "Can't modify %s in %s" (undef에 스칼라 대입) —
undef = $foo;가 이제 컴파일 타임 오류 "Can't modify undef operator in scalar assignment". - "panic: newFORLOOP, %s" — 파서가
foreach루프 파싱 중 내부 일관성 검사 실패.
새 경고:
- "Built-in function '%s' is experimental" —
builtin::네임스페이스 함수 호출 (현재 실험적). - "defer is experimental" —
defer블록 수식어.no warnings 'experimental::defer'로 끄면 코드가 향후 버전에서 깨질 수 있음. - "Downgrading a use VERSION declaration to below v5.11 is deprecated" — 큰 버전 선언 뒤 더 낮은 v5.11 미만 버전 요청 시.
- "for my (...) is experimental" —
for로 여러 값을 한 번에 반복 시. - "Implicit use of @_ in %s with signatured subroutine is experimental" / "Use of @_ in %s with signatured subroutine is experimental" — 시그니처 sub에서
@_를 (묵시적/명시적으로) 사용 시. - "Wide character in $0" — 프로그램 이름(
$0)에 wide character를 넣으려 하면.
기존 진단 변경
- "'/' does not take a repeat count in %s"가 이제
in %s포함. - localized sub 재정의가 더 이상 "Subroutine %s redefined" 경고를 일으키지 않음.
- "unexpected constant lvalue entersub entry..."가 panic 접두사 추가.
- "Useless use of sort in scalar context"가 새
scalar경고 카테고리로 이동 (기존void). - 수년간 코어에서 제거된 많은 진단이 이제 문서에서도 제거.
구성과 컴파일 (Configuration and Compilation)
- Perl C 소스가 이제 일부 C99 기능 사용 (목표 컴파일러 모두 지원 검증). gcc/clang에서
-Werror=declaration-after-statement를 무조건 추가하는 XS 모듈에 문제를 일으킬 수 있으므로$] < 5.035005에서만 플래그를 추가하도록 변경 필요. - makedepend 단계가 make로 병렬 실행.
MAKEFLAGS=-j8로sh ./makedepend MAKE=make cflags시간 크게 단축. Configure가#include <xlocale.h>필요 여부를 테스트. [github #18936]
테스트 (Testing)
이 릴리스의 추가·변경 사항을 반영하도록 테스트 추가·변경.
플랫폼 지원 (Platform Support)
Windows
- 구형 MSVC++(pre-VC12) 지원 제거 (C99 미지원으로 컴파일 불가).
- Microsoft Visual Studio 2022(VC 14.3)로 컴파일 지원 추가.
:win32IO 레이어 제거.:unix레이어의 실험적 대체물이 거의 20년 동안 성숙하지 못함.
VMS
keys %ENV가 일관된 결과 반환. 스칼라 컨텍스트에서%ENV/keys %ENV가 이제 환경의 모든 키 개수를 올바르게 반환.
중단 플랫폼
- AT&T UWIN: Windows용 UNIX 호환 레이어, 2012년 마지막 릴리스, Cygwin에 대체됨.
- DOS/DJGPP: GNU 툴체인의 DOS 포트. 마지막 빌드 시도는 5.20에서 miniperl 빌드까지만.
- NetWare: Novell NetWare 서버 OS 지원 코드 제거 (포트 2002년, 플랫폼 2009년 마지막, 12년간 무보고).
플랫폼별 참고
- z/OS: EBCDIC static/dynamic 및 31-bit/64-bit addressing Perl 빌드, 그리고 ASCII 지원 기반 준비. README가 ASCII/EBCDIC 빌드 설명.
내부 변경 (Internal Changes)
- 모든
PERL_IMPLICIT_CONTEXT가MULTIPLICITY로 교체됨 (XS 호환용으로 `PERL_IMPLICIT_CONTEXT``는 계속 정의). - API 상수
G_ARRAY가 더 정확한G_LIST로 개명.G_ARRAY호환 매크로 유지.Devel::PPPort3.63 스나포트. perl.h에 버전 비교 매크로PERL_GCC_VERSION_GE/GT/LE/LT추가.embed.h에 단어의 최하위 1비트 위치 인라인 함수lsbit_pos32/lsbit_pos64추가.Perl_ptr_table_clear삭제 (v5.14.0부터 폐기, CPAN 코드 미사용).- 새 boolean 매크로·함수:
sv_setbool,sv_setbool_mg,SvIsBOOL. - 4개 RV 처리 함수 추가:
sv_setrv_noinc,sv_setrv_noinc_mg,sv_setrv_inc,sv_setrv_inc_mg. xs_handshake()의 두 실패 모드가 서로 다른 메시지 제공.- 해시 반복자 상태(
struct xpvhv_aux) 메모리가 이제 해시 배열 블록이 아닌 해시 본문의 일부로 할당. - 새
phase_name()인터페이스로 각 인터프리터 phase(PL_phase 값) 이름 접근. U의pack동작이 EBCDIC에서 변경.- 새 동등성 검사 함수
sv_numeq/sv_streq(+_flags접미사 변형) 추가 — 연산자 오버로딩 인지하는 간단한 수치/문자열 비교 API. - 정수 값의 문자열 형태를 읽어도 더 이상
SVf_POK플래그를 설정하지 않음. 문자열 형태는 내부적으로 캐시되고SvPV(sv)매크로가 여전히 직접 재읽음. JSON 직렬화기 같은 코드가 값을 처음 "쓰여진" 형태(정수 vs 문자열)를 구분할 수 있게 해요. sv_dump(그리고Devel::Peek의Dump)가 이제 PV의 상위 비트 옥텟을 8진 대신 16진으로 이스케이프.
주요 버그 수정 (Selected Bug Fixes)
utime()가 닫힌 핸들에서 호출 시 errno/$!를 올바르게 설정.setsockopt()의 OPTVAL 파라미터 플래그가 매직 호출 전에 검사되고 UTF-8 플래그를 무시하던 문제 수정. [github #18660]$)와$(에 IOK 대신 IOKp만 설정 (직렬화기가 추가 그룹을 잃은 숫자로 직렬화하지 않도록). 5.16 동작 복원. [issue #18955]mktables디버깅 시설 사용 시 v5.31.10부터 크록하던 문제 수정.makedepend로직이 BSD make와 호환. [GH #19046]- 반복 중인 tied hash를
untie하면 이제 반복 상태를 즉시 해제. - 5.30.0에서 miniperl 부트스트래핑용으로 추가된
Internals::getcwd()가 이제 miniperl에서만 사용 가능. [github #19122] - BEGIN(또는
use) 문에 중단점 설정 시 해제된dbstateop에 메모리 쓰기 가능. [GH #19198] - bareword filehandle 비활성일 때 파서가 즉시 괄호가 따라와도 모든 bareword를 filehandle로 해석하던 문제 수정.
이전 릴리스 정오표 (Errata From Previous Releases)
perl5300delta가 CVE를 잘못 식별 — 올바른 식별은 CVE-2015-1592.
부고 (Obituaries)
Raun "Spider" Boardman (SPIDB) — 1996~2002년 사이 Perl 5 코어 배포에 최소 66개 커밋을 기여한 저자, 2021년 5월 24일 COVID 합병증으로 별세.
David H. Adler (DHA) — 2021년 11월 16일 별세. 1997년 첫 Perl 사용자 그룹 NY.pm 공동 창립, 1998년 Perl Mongers 공동 창립. Perl 컨퍼런스의 Bad Movie Night 조직으로 유명.
감사 (Acknowledgements)
Perl 5.36.0은 5.34.0 이후 약 1년의 개발로, 82명의 저자가 2,000개 파일에 약 250,000줄의 변경을 포함해요. 자동 생성 파일·문서·릴리스 도구 제외 시 1,300개 .pm/.t/.c/.h 파일에 약 190,000줄 변경.
버그 보고 (Reporting Bugs)
버그라고 생각되는 것을 찾으면 https://github.com/Perl/perl5/issues를 확인하세요. 미보고 버그는 이슈를 여세요. 보안 영향이 있어 공개 트래커 부적절하면 perlsec의 "SECURITY VULNERABILITY CONTACT INFORMATION"를 참고하세요.
감사 표하기 (Give Thanks)
감사 인사는 perlthanks 프로그램 실행으로 Perl 5 Porters 목록에 보낼 수 있어요.
함께 보기 (SEE ALSO)
Changes, INSTALL, README, Artistic/Copying 파일.