Perl 변경 안내: 5.44.0

Perl 변경 안내: 5.44.0 (perldelta)

이 문서는 Perl 5.42.0 릴리스와 5.44.0 릴리스의 차이를 설명해요. 새 기능, 보안 수정, 호환성 변경, 폐기, 성능 개선, 모듈 갱신을 강사가 옆에서 설명하듯 정리했어요.

출처: perldoc - perldelta

본문

핵심 개선 (Core Enhancements)

시그니처의 이름 붙은 파라미터 (Named Parameters in Signatures)

서브루틴 시그니처에 큰 새 기능이 더해졌어요. 호출자가 인자를 위치가 아니라 이름/값 쌍으로 넘길 수 있게 됐어요.

sub f ($x, $y, :$alpha, :$beta = undef) { ... }

f( 123, 456, alpha => 789 );

원래 PPC0024에서 명세됐어요. 이 기능은 현재 **실험적(experimental)**이며 자세한 내용은 perlsub에 있어요.

다변수 foreach에서 별명 참조 사용 (Multi-variable foreach can now use aliased references)

5.22에서 참조 별명(ref aliasing)이, 5.36에서 다변수 foreach가 도입됐어요. 이 버전에서 두 기능을 함께 쓸 수 있게 됐어요:

use v5.44;
use feature qw( refaliasing declared_refs );

my %hash = (
    one => [1],
    two => [2, 2],
);

foreach my ( $key, \@items ) ( %hash ) {
    say "The $key array contains: @items";
}

refaliasingdeclared_refs 모두 여전히 실험적이에요.

/xx 아래 정규식 패턴의 향상된 동작 (Enhanced /xx)

실험적으로 /xx 패턴 수정자를 쓰면 대괄호 문자 클래스(예: [a-zA-Z])가 여러 줄에 걸쳐 확장되고 주석을 담을 수 있어요. use feature "enhanced_xx"로 활성화해요. /x 및 /xx 참고.

Unicode 17.0 지원 (Unicode 17.0)

https://www.unicode.org/versions/Unicode17.0.0/ 참고.

PRNG 시딩을 위한 새 엔트로피 소스 (New source of entropy for PRNG seeding)

Perl은 이제 getentropy() 시스템 호출로 내부 PRNG 시딩용 무작위 바이트를 가져와요(이전엔 /dev/urandom에서 읽음). 순서: ① getentropy()(Linux·BSD·MacOS) ② /dev/urandom ③ 내부 상태 변수 해시(Unix 시간·PID·포인터). 내부 PRNG는 여전히 보안 용도에 부적합해요(rand 참고).

보안 (Security)

  • CVE-2026-8376 : Perl_study_chunk의 버퍼 오버플로. regcomp_study.c에서 결합 서브문자열 버퍼 크기를 바이트가 아니라 문자로 검사했어요. 32비트 빌드에서 정수 오버플로 → out-of-bounds 쓰기 발생 가능.
  • CVE-2026-57432 : S_measure_struct의 버퍼 오버플로. pack/unpack으로 계산된 크기가 메모리에 안 들어갈 만큼 크면 정수 오버플로가 일어날 수 있어요(항목 반복 횟수로 큰 숫자를 박을 때 주로 발생).
  • CVE-2026-13221 : 정규식 trie 16비트 필드 오버플로. 약 65,000개 이상의 분기가 있는 alternation에서 trie 최적화가 오버플로돼 오탐·미탐이 생길 수 있어요.

비호환 변경 (Incompatible Changes)

식별자·정규식 그룹 이름에 유니코드 규칙 완전 적용

이제 Perl은 \w에는 맞지만 유니코드 XID 속성(\p{XID_Start}·\p{XID_Continue})에는 맞지 않는 약 160개 문자를 식별자와 정규식 그룹 이름에서 명시적으로 금지해요. 이전에는 일부가 초기엔 받아들여졌다가 나중에 관련 없는 메시지로 거부됐어요. 문자 전부가 use utf8을 쓴 프로그램에만 영향을 미치고, 이름의 두 번째 이후 위치의 문자에만 해당해요. 금지 문자의 130개는 5쌍의 원형·사각형 등으로 감싼 라틴 문자 26자들이에요.

폐기 (Deprecations)

  • 5.12부터 폐기됐던, 바깥에서 goto로 루프나 블록 몸체로 뛰어드는 것이 더 이상 허용되지 않아요.
  • /xx로 컴파일되는 대괄호 문자 클래스에서 이스케이프하지 않은 #이나 리터럴 세로 공백 사용이 폐기돼요. #는 백슬래시로 이스케이프하고(m/ [ % \# ( ) ] /xx), 세로 공백은 \n 같은 구문을 써요.

성능 개선 (Performance Enhancements)

  • 단순(오버플로 없는) 정수 +·-·*이 약간 빨라졌어요(하위 C 컴파일러 지원이 있을 때).
  • 컴파일 타임에 알려진 상수 문자열 키로 해시를 채우는 게 흔히 빨라졌어요.
  • signatures 기능 아래 서브루틴 시작의 시그니처 처리 런타임이 더 효율적이게 됐어요.

모듈·프래그마 (Modules and Pragmata)

다양한 코어 모듈·프래그마가 갱신됐어요. 주요 보안·기능 변경은 다음과 같아요:

  • Archive::Tar 3.04 → 3.12 (CVE-2026-9538, CVE-2026-42496, CVE-2026-42497 수정)
  • HTTP::Tiny 0.090 → 0.096 (CVE-2026-7010, CVE-2026-7017 수정)
  • IO::Compress 2.213 → 2.223 (여러 CVE 수정)
  • Socket 2.038 → 2.041 (CVE-2026-12087 수정)
  • Storable 3.37 → 3.41 (CVE-2026-57433 수정)

그 외에도 Encode, feature(1.97→2.02), POSIX, Scalar::Util, Test::Simple, threads, Time::HiRes, utf8, version, warnings, B::Deparse, ExtUtils::ParseXS 등 수십 개 모듈이 버전을 올렸어요.

문서 (Documentation)

  • perlapi : 소스 줄 번호·API 요소가 첫 포함된 릴리스 찾는 법 포함.
  • perlxs : XS 작성 참조 매뉴얼이 완전히 재작성·현대화(약 2배 커짐, ANSI 시그니처 권장).

진단 (Diagnostics)

  • Use of uninitialized value%s 경고: 이항 연산자의 두 피연산자가 모두 초기화 안 됐을 때 역순(오른쪽→왼쪽)으로 발행되던 것을 피연산자 평가 순서와 일치하게 수정.
  • 잘못된 UTF-8 바이트 시퀀스 진단이 판정에 관련 없는 바이트는 포함하지 않게 됐어요.
  • ${^_FOO}처럼 캐럿으로 시작하는 2자 이상 변수 이름이 중괄호로 감싸져 표시돼요.
  • import 메서드가 없는 패키지에 import 호출이 이제 일반 경고(카테고리 missing_import, 기본 켜짐)로.

새 오류 (New Errors)

  • Can't redeclare catch variable as "%s" : catch 블록의 예외 변수에 my·our·state를 쓰는 건 무효. catch는 자동으로 렉시컬 선언되는 베어 변수 이름만 받아요.
  • Use of "goto" to jump into a construct is no longer permitted : 5.44부터 바깥에서 루프 안으로 뛰어드는 goto가 예외를 던져요.
  • \x{%X} is a \w char that isn't valid in a name "%s".

새 경고 (New Warnings)

  • Possible attempt to escape whitespace in qw() list : qw() 목록에서 백슬래시로 공백을 보호할 수 없어요(백슬래시는 리터럴 데이터로 취급).

구성·컴파일 (Configuration and Compilation)

  • C23 <stdckdint.h>와 관련 매크로가 가능하면 사용돼요.
  • POSIX 로케일 카테고리 값을 Configure에 전달해 크로스 컴파일을 지원할 수 있게 됐어요.
  • PERL_CREATE_GVSV 구성 매크로가 제거됐어요.

테스트 (Testing)

  • 임베딩 테스트 시 링크하는 libperl이 빌드하는 perl과 일치하는지 검사 추가.

플랫폼 지원 (Platform Support)

  • Windows : USE_IMP_SYS는 있는데 USE_ITHREADS가 없는 빌드 수정.
  • AIX : 모든 릴리스에서 스레드 안전 로케일 처리 비활성(OS 지원 버그). IBM Open XL C/C++ 컴파일러(ibm-clang) 지원.
  • z/OS : clang만 지원. 몇몇 코어 cpan 모듈(Encode, ExtUtils-MakeMaker, HTTP-Tiny 등)에 알려진 문제.

내부 변경 (Internal Changes)

  • ExtUtils::ParseXS XS 파서가 대대적 내부 재구성.
  • 폐기된 sv_locking()·sv_unlocking 제거.
  • Perl_expected_size 실험적 스텁 매크로 추가.
  • SvPV_shrink_to_cur가 COW 바이트 포함하도록 개정.
  • sv_vcatpvfn_flags()가 잘못된 입력에 NUL 대신 Unicode REPLACEMENT CHARACTER 사용.
  • valid_utf8_to_uv 신규 함수 추가.
  • newSVsv_flags_NN 신규 함수(기존 SV 값으로 새 SV 생성).
  • STATIC_ASSERT_EXPR 신규 변형 — XS 작성자에게도 개방.
  • amagic_call API에 AMGf_force_scalar, AMGf_force_overload 플래그 추가.
  • 반복 연산자의 승수 피연산자에 상한 적용(PERL_FOLD_REPEAT_LIMIT).
  • fromCTRL 매크로 추가(toCTRL의 역).
  • defer_error 신규 함수, qerror는 이제 폐기된 별명.
  • op_clear가 API의 일부가 됨.

주요 버그 수정 (Selected Bug Fixes)

  • method 시그니처의 보고 인자 수가 암시적 $self를 반영하도록 수정.
  • use integer; 아래에 오버로드된 0+ 메서드 호출 순서가 뒤바뀌던 문제 수정.
  • v5.42.0에서 두 변수 for 루프의 특정 구문으로 컴파일러가 크래시하던 문제 수정.
  • pack/unpack의 여러 오류 조건이 이제 감지돼요.
  • XS의 INTERFACE 키워드가 C23 호환.
  • &CORE::__CLASS__가 잘못된 결과를 돌려주던 문제 → &CORE::__CLASS__ cannot be called directly 오류로.
  • parse_subsignature()가 빈 시그니처 처리.
  • 255자 이상 아이덴티파이어 지원(비ASCII 언어 포함).
  • 기타 다수(일광 절약 시간 전환, sort 비교, filehandle 대상 스칼라, 해시 키 인코딩 보존 등).

알려진 문제 (Known Problems)

없음.

추모 (Obituary)

Matt S. Trout(클럽의 배틀 크라이 "WELL VOLUNTEERED!"의 주인공)의 타계를 애도하는 내용이 실려 있어요. IRC op, PAUSE 관리자, Shadowcat Systems 공동 창업자, DBIx::Class 설계자로서 Perl을 형성했어요.

기여자·버그 보고 (Acknowledgements / Reporting Bugs / Give Thanks)

Perl 5.44.0은 5.42.0 이후 약 12개월의 개발로, 71명의 저자가 1,300개 파일에 약 270,000줄을 변경했어요. 버그는 https://github.com/Perl/perl5/issues에 보고하고, 감사 인사는 perlthanks 프로그램으로 보낼 수 있어요.

함께 보기 (SEE ALSO)

Changes 파일(변경 세부 보기), INSTALL 파일(빌드 방법), README 파일(일반 사항), Artistic·Copying 파일(저작권).

더 알아보기 (Learn more)

더 깊이 보려면 다음 문서를 함께 읽어 보세요.