Perl 5.40.0 변경 사항

Perl 5.40.0 변경 사항 (perl5400delta)

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

출처: perldoc - perl5400delta

핵심 개선 사항 (Core Enhancements)

__CLASS__ 키워드

class feature를 사용할 때, 메서드·ADJUST 블록·필드 초기화 표현식 안의 코드는 이제 새 __CLASS__ 키워드를 쓸 수 있어요. __PACKAGE__와 유사하게 클래스 이름을 산출하지만, __PACKAGE__가 코드가 나타난 컴파일 타임 패키지를 주는 반면 __CLASS__는 객체 인스턴스가 속한 실제 런타임 클래스를 인지해요. 특히 $self에 접근할 수 없는 생성자 동안 클래스에 대한 메서드 디스패치에 유용해요. (perlfunc/__CLASS__ 참고)

필드 변수용 :reader 속성

class feature를 사용할 때 필드 변수는 이제 :reader 속성을 취할 수 있어요. 주어진 인스턴스에서 필드 변수 값을 단순히 반환하는 접근자 메서드를 자동 생성해요.

field $name :reader;

다음과 동등해요:

field $name;
method name () { return $name; }

대체 이름도 제공 가능해요:

field $name :reader(get_name);

(perlclass/:reader 참고)

-M 명령줄 옵션에서 공백 허용

명령줄 옵션을 처리할 때 perl은 이제 -M 스위치와 그 뒤 모듈 이름 사이에 공백을 허용해요.

$ perl -M Data::Dumper=Dumper -E 'say Dumper [1,2,3]'

이는 기존 -I 옵션의 동작과 일치해요.

use VERSION 선언 제한

5.36에서 v5.11 이상에서 v5.11 미만으로 use VERSION 선언을 낮추는 폐기 경고가 추가됐어요. 이제 이것은 치명적 오류가 됐어요.

또한, 다른 use VERSION이 스코프 안에 있을 때 뒤따르는 use VERSION 선언을 내는 것이 이제 치명적 오류가 돼요 (두 버전 중 하나가 5.39 이상일 때). 이는 builtin에서 import된 렉시컬 함수를 둘러싼 복잡함을 피하기 위한 것이에요. v5.39 미만의 다른 뒤따르는 use VERSION 선언에도 Perl 5.44에서 더 이상 허용되지 않을 것임을 경고하는 폐기 경고가 추가됐어요.

builtin::infbuiltin::nan 함수 (experimental)

builtin 네임스페이스에 infnan 두 함수가 추가됐어요. 각각 부동소수점 무한대와 Not-a-Number 값을 산출하는 상수처럼 동작해요.

^^ 논리 xor 연산자

Perl은 항상 저우선순위 논리 연산자 and, or, xor과, 고우선순위 비트 연산자 &, ^, |을 가졌어요. 이번 릴리스까지 중간 우선순위 논리 연산자 &&||은 있었지만 배타적 or에 해당하는 것은 없었어요. 이번 릴리스가 마지막 ^^ 연산자를 추가해 집합을 완성해요.

$x ^^ $y and say "One of x or y is true, but not both";

try/catch feature는 더 이상 실험적이지 않음

이전에는 오류 처리를 위한 try/catch feature가 실험적이었어요. 5.34.0에서 도입된 후 이제 안정적인 언어 기능으로 간주되고 경고를 출력하지 않아요. 여전히 try feature로 활성화해야 해요. (perlsyn/Try Catch Exception Handling 참고)

for로 여러 값을 한 번에 반복하는 것은 더 이상 실험적이지 않음

5.36.0에서 도입된 후 이제 안정적인 언어 기능으로 간주되고 경고를 출력하지 않아요. (perlsyn/Compound Statements 참고)

builtin 모듈은 더 이상 실험적이지 않음

5.36.0에서 도입된 builtin 모듈이 이제 안정적인 것으로 간주되고 경고를 출력하지 않아요. 그러나 여러 함수는 여전히 실험적이에요.

:5.40 feature bundle이 try를 추가

최신 버전 feature bundle이 이제 최근 안정화된 try feature를 포함해요. -E 스위치가 이 bundle을 사용하므로 -E 스크립트에서 즉시 사용 가능해요.

use v5.40;이 builtin 함수를 import

feature bundle import 외에, use v5.40;(또는 이후 버전)는 해당 builtin 버전 bundle을 import해요.

보안 (Security)

CVE-2023-47038 - 불법 사용자 정의 Unicode 프로퍼티로 버퍼 끝 너머 쓰기

Nathan Mills가 Perl 보안 팀에 직접 보고. 5.30.0~5.38.0로 컴파일한 조작된 정규식이 힙 할당 버퍼에서 공격자 제어 1바이트 버퍼 오버플로를 일으킬 수 있어요.

CVE-2023-47039 - Windows용 Perl 이진 하이재킹 취약점

GitHub 사용자 ycdxsb가 보고. Windows용 Perl은 셸(cmd.exe)을 찾기 위해 시스템 경로 환경 변수에 의존해요. 병맥 검색 순서 문제로 Perl은 현재 작업 디렉토리에서 cmd.exe를 먼저 찾아요. 제한된 권한의 공격자가 C:\ProgramData 같은 약한 권한 위치에 cmd.exe를 두면, 관리자가 이 위치에서 실행 가능한 파일을 사용할 때 임의 코드가 실행될 수 있어요.

비호환 변경 (Incompatible Changes)

reset EXPR이 이제 스칼라에 set-magic 호출

이전에는 reset EXPR이 스칼라 변수를 지울 때 set magic을 호출하지 않았어요. 즉 $^W 같은 경우 기저 내부 상태로 변경이 전파되지 않았고, $1 같은 경우 기저 magic이 예외를 던질 때 예외가 발생하지 않았어요. 이제 효과가 있거나 예외를 던질 수 있어요. reset EXPR은 배열/해시 수정 시에는 이미 set magic을 호출했어요. m?pattern? 같은 일회 매칭 검색을 리셋하는 일반 reset에는 영향 없음. [GH #20763]

알려지지 않은 패키지의 import 메서드 호출이 경고 발생

역사적으로 정의되지 않은 클래스를 포함한 어떤 클래스의 import/unimport 메서드를 인자와 함께 호출해도 오류가 없었어요. 5.38에서는 이 코드가 오류를 던지지 않아요:

Class::That::Does::Not::Exist->import("foo");

5.39.1부터 이는 폐기되어 경고를 발행해요. 인자 없이 호출하면 계속 조용히 성공·무동작해요. 모든 클래스가 UNIVERSAL로부터 암묵적으로 상속하는데, UNIVERSAL이 이제 import 메서드를 정의하기 때문이에요. 이 변경은 대소문자 구분 없는 파일시스템에서 use 문의 대소문자 오타를 더 쉽게 감지하게 해줘요. 예: Windows에서 use STRICT 'refs';가 조용히 아무것도 하지 않던 것을 감지. 자신의 import를 제공하지 않는 패키지에 인자를 넘기는 경우도 감지해요.

return이 더 이상 indirect object를 허용하지 않음

return 연산자 문법이 이제 indirect object를 거부해요. 대부분 컴파일·실행되긴 했지만 문서화되지 않았고 혼란스러운 결과를 만들 수 있었어요:

sub sum_positive {
    return sum grep $_ > 0, @_;
    # 예기치 않게 다음과 같이 파싱됨:
    #   return *sum, grep $_ > 0, @_;
}
say for sum_positive(-1, 2, 3)  # *main::sum 2 3 출력

[GH #21716]

no feature "bareword_filehandles" 아래 메서드 호출에서 클래스 bareword가 더 이상 파일 핸들로 해석되지 않음

이전에는 FH->binmode;가 FH를 핸들로 해석하려 했지만, 이제 클래스로 해석하려 하여 런타임 오류를 일으켜요. STDOUT->flush 같은 표준 핸들은 계속 핸들로 해석돼요. perl이 bareword를 클래스로 한 번 해석하면 계속 그렇게 해요. [GH #19426]

폐기 (Deprecations)

  • 밖의 스코프에서 안의 스코프로 goto로 점프하는 것은 폐기되고 Perl 5.42에서 완전히 제거될 예정. [GH #21601]

성능 개선 (Performance Enhancements)

  • 부정(negation) OP들이 일반 TARGMY 최적화를 지원하도록 수정됐어요. [GH #21442]

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

새 모듈과 프래그마

  • Term::Table 0.018 — Test2::Suite의 의존성.
  • Test2::Suite 0.000162 — 단위 테스트 작성용 포괄적 테스트 도구 모음. Test::More 등의 후속작. 코어 포함으로 추가 의존성 없이 CPAN 모듈 테스트 작성 가능.

업데이트된 모듈과 프래그마

  • Archive::Tar 2.40→3.02_001, attributes 0.35→0.36, autodie 2.36→2.37, B 1.88→1.89, B::Deparse 1.74→1.76, Benchmark 1.24→1.25, bignum 0.66→0.67.
  • builtin 0.008→0.014 — 이제 버전 bundle을 인자로 받아 해당 버전에서 안정적인 함수들을 import (use builtin ':5.40';). PPC 0006에 따라 load_module() builtin 추가.
  • bytes 1.08→1.09, Compress::Raw::Bzip2/Zlib 2.204_001→2.212, CPAN::Meta::Requirements 2.140→2.143, Data::Dumper 2.188→2.189, DB_File 1.858→1.859, Devel::Peek 1.33→1.34, Devel::PPPort 3.71→3.72, diagnostics 1.39→1.40, DynaLoader 1.54→1.56, Encode 3.19→3.21, Errno 1.37→1.38, experimental 0.031→0.032, Exporter 5.77→5.78.
  • ExtUtils::CBuilder 0.280238→0.280240, ExtUtils::Manifest 1.73→1.75, ExtUtils::Miniperl 1.13→1.14, Fcntl 1.15→1.18 (Linux O_TMPFILE 지원, 문서 확대), feature 1.82→1.89 (:all bundle 문서화), fields 2.24→2.25, File::Compare 1.1007→1.1008, File::Find 1.43→1.44, File::Glob 1.40→1.42, File::Spec 3.89→3.90, File::stat 1.13→1.14, FindBin 1.53→1.54.
  • Getopt::Long 2.54→2.57, Getopt::Std 1.13→1.14 (문서/테스트만), Hash::Util 0.30→0.32, Hash::Util::FieldHash 1.26→1.27, HTTP::Tiny 0.086→0.088, I18N::Langinfo 0.22→0.24 (Linux 추가 로케일 카테고리 처리, ALT_DIGITS 수정).
  • IO 1.52→1.55 (Windows에서 IO::Handle/blocking 수정 — IO 1.32 이후 비기능), IO-Compress 2.204→2.212, IO::Socket::IP 0.41_01→0.42, IO::Zlib 1.14→1.15, locale 1.10→1.12, Math::BigInt 1.999837→2.003002, Math::BigInt::FastCalc 0.5013→0.5018, Module::CoreList 5.20230520→5.20240609, Module::Metadata 1.000037→1.000038, mro 1.28→1.29, NDBM_File 1.16→1.17, Opcode 1.64→1.65.
  • perl5db.pl 1.77→1.78 (l 명령 인자 파싱 개선), perlfaq 5.20210520→5.20240218, PerlIO::encoding 0.30→0.31, PerlIO::scalar 0.31→0.32, PerlIO::via 0.18→0.19, Pod::Checker 1.75→1.77, Pod::Html 1.34→1.35, Pod::Simple 3.43→3.45, podlators 5.01→5.01_02, POSIX 2.13→2.20 (mktime가 32비트 플랫폼에서 32비트보다 큰 time_t 지원, T_SIGNO/T_FD typemap 수정, Mode_t/pid_t/Uid_t/Gid_t/Time_t를 정수형으로 갱신).

참고: 원문의 나머지 섹션 (문서화, 진단, 구성·컴파일, 플랫폼, 내부 변경, 버그 수정, 부고, 감사) 은 원 소스의 tail 부분으로, 이 문서 작성 시점의 소스 캡처 제약으로 일부만 반영되었을 수 있어요. 전체 목록은 원문 perl5400delta를 참고하세요.