Perl 5.34.0 변경 사항
Perl 5.34.0 변경 사항 (perl5340delta)
이 문서는 Perl 5.32.0 릴리스와 5.34.0 릴리스 사이의 차이를 설명해요.
5.30.0 같은 더 오래된 릴리스에서 업그레이드하는 경우, 5.30.0과 5.32.0 사이의 차이를 설명하는 perl5320delta를 먼저 읽어 보세요.
핵심 개선 사항 (Core Enhancements)
실험적 try/catch 문법
try/catch 표기를 제공하는 초기 실험적 시도가 추가됐어요.
use feature 'try';
try {
a_function();
}
catch ($e) {
warn "An error occurred: $e";
}
자세한 내용은 perlsyn의 "Try Catch Exception Handling"을 참고하세요.
qr/{,n}/ 이제 허용
정규식 수량자에 빈 하한(lower bound)이 이제 허용돼요. m/x{,3}/는 m/x{0,3}/을 의미해요.
중괄호 안·인접에서 공백 자유롭게 허용
(double-quotish 문맥과 정규식 패턴에서) \x{ FFFC }처럼 쓸 수 있게 됐어요. \b{}, \g{}, \k{}, \N{}, \o{}, \x{} 및 정규식 수량자 {m,n}에 적용돼요. \p{}/\P{}는 기존의 더 느슨한 규칙을 유지해요. 이 능력은 /x 수식어 유무와 무관하게 적용돼요. 또한 중괄호 수량자의 쉼표 앞뒤에 공백(탭·스페이스)이 허용돼요, 예: qr/a{ 5, 7 }/.
새 8진 문법 0o<숫자>
0o123_456처럼 0o 접두사로 8진 리터럴을 지정할 수 있게 됐어요. 기존 16진 0x<숫자>, 2진 0b<숫자>와 평행해요. 내장 oct() 함수도 이 새 문법을 받아들여요. (perldata의 "Scalar value constructors", perlfunc의 oct EXPR 참고)
성능 개선 (Performance Enhancements)
- RegEx 메모리 누수 수정. [GH #18604]
모듈과 프래그마 (Modules and Pragmata)
새 모듈과 프래그마
- ExtUtils::PL2Bat 0.004가 Perl 코어에 추가됐어요.
pl2bat스크립트의 일반화이며, 포크된 코드를 하나의 구현+테스트로 통합해요.
업데이트된 모듈과 프래그마
feature가 1.58→1.64. 기본적으로 켜진bareword_filehandlesfeature와, 기본 켜짐이지만 다차원 배열 에뮬레이션을 끌 수 있는 새multidimensionalfeature가 추가됐어요.IO가 1.43→1.46.IO::Socket이$@외에$IO::Socket::errstr에도 오류 메시지를 저장.error/clearerr메서드가 입출력 양쪽 스트림을 처리.IO::Handle의 정규 파일 핸들 spurios 오류 수정.Devel::PPPort가 3.57→3.62. 새PERL_VERSION_*비교 매크로 사용 가능.GDBM_File이 1.18→1.19. 새 GDBM 버전용 새 함수·호환성.Win32이 0.53→0.57.Win32::IsSymlinkCreationAllowed(),Win32::IsDeveloperModeEnabled(),Win32::GetProcessPrivileges()추가, Windows 2000 이전 코드 제거.POSIX가 1.94→1.97.POSIX::signbit()동작 개선.asctime결과가 항상 영어임을 문서화.
그 외 다수 모듈이 버전 업그레이드 (Archive::Tar, autodie, Carp, CPAN, Data::Dumper, Encode, ExtUtils::MakeMaker 7.62, Filter::Util::Call, JSON::PP, libnet 3.13, Module::CoreList, PerIO::encoding, Pod::Usage 2.01, Storable 3.23, Test::Simple, threads, Unicode::Collate, version 등).
문서화 (Documentation)
새 문서
- perldocstyle: Perl에 포함된 문서의 저작·유지보수 가이드.
- perlgov: Perl의 새 거버넌스 모델의 목표, 범위, 체계, 규칙을 설명.
perlpolicy등 다른 pod 파일도 반영해 수정.
기존 문서 변경
perlapi/perlguts/perlxs/perlxstut가SvPV보다SvPVbyte를 선호.- "Pumpking" 언급이 더 정확한 용어 또는 "Steering Council"로 교체.
- Perl Steering Council이 보안 이슈의 기본 연락처.
perlguts:SvPV호출 시SvUTF8확인 필요성 상세 설명, "How do I pass a Perl string to a C library?" 섹션 추가,my_rpeep예시 수정.perlsyn:caller()가try{}블록을 보지 못함을 문서화,for루프 초기화 중my선언 예시.perlfunc:my()/state()가 같은 스코프에서 렉시컬 재선언 주의 경고,localtime결과가 항상 영어임 명시,msgsnd()에서 없는 length 필드 문서 제거,split()예시 단순화.perlop:<>(다이아몬드)와<<>>(더블 다이아몬드) 명칭 명시, 범위 연산자 동작 변경 문서화.perlunifaq: 인코딩되지 않은 문자열 처리 설명 수정.
진단 (Diagnostics)
새 진단
새 오류:
- "Bareword filehandle "%s" not allowed under 'no feature "bareword_filehandles"'" — 새
bareword_filehandlesfeature와 함께. - "Multidimensional hash lookup is disabled" — 새
multidimensionalfeature와 함께.
새 경고:
- "Wide character in setenv key (encoding to utf8)" —
%ENV을 통해 환경 변수 키에 wide character를 넣으려 하면 발생.
기존 진단 변경
- 사용자 정의 프로퍼티 관련 오류들 보강: "Error %s in expansion of %s", "Infinite recursion in user-defined property", "Timeout waiting for another thread to define \p{%s}", "Unknown user-defined property name \p{%s}".
- 서브루틴 인자 개수 불일치 오류("Too few/many arguments for subroutine '%s'")가 이제 주어진/기대 개수 포함.
- "Lost precision when %s %f by 1"이 이제 양수·음수 모두에서 발행.
\K관련 오류가 중첩 lookaround에서 잘못 나오던 문제 수정.- "Use of uninitialized value%s"가 이제 배열/해시 인덱스 포함 가능.
유틸리티 변경 (Utility Changes)
perl5db.pl (디버거)
- 새 옵션
HistItemMinLength: 히스토리에 저장되는 최소 명령 길이 제어 (전통적으로 2로 고정). i $var,l $var명령이 렉시컬 변수에서 다시 동작.
구성과 컴파일 (Configuration and Compilation)
- incpath이 libpth로 새는 것 방지, realpath 사용, 실제 존재하는 경로만 포함.
stadtx해시 지원 완전 제거. 이전에는PERL_HASH_FUNC_STADTX로 요청 가능했고 64비트 빌드 기본이었지만, 더 엄격히 검토된 SipHash로 대체.- libc의 버그 있는
gcvt/qgcvt함수 탐지 probe 추가. [GH #18170] -Dusedefaultstrict구성 옵션으로strict를 기본 켬으로 빌드 가능.-e/-E로 실행 시엔 적용되지 않음. 개발용 진단 메커니즘으로 기본은 꺼짐.- 지원 Bison 버전 2.4~3.7.
- 새 64비트 Intel C/C++ 컴파일러 인식, 올바른 플래그 설정.
va_copy검사 시 SIGBUS 트랩.
테스트 (Testing)
t/opbasic/arith.t의 Config 의존 테스트를t/op/arith2.t로 분리.- regexp 최적화 테스트 하네스
t/re/opt.t추가. - CPAN 배포에서
@INC의 dot 필요 workaround 제거. [GH #18394] - 병렬 테스트 시
PERL_TEST_HARNESS_ASAP=1설정으로 더 일찍 끝내되 논리적 순서는 느슨해짐.
플랫폼 지원 (Platform Support)
새 플랫폼
- 9front: plan9 포크인 i386 9front 시스템에서 빌드 허용.
갱신 플랫폼
- Plan9: i386 플랫폼 지원 개선.
- MacOS (Darwin): hints 파일이 10 이상 미래 버전 처리.
중단 플랫폼
- Symbian: 모바일 OS용 코드 제거 (포트는 2009년 7월, 플랫폼 자체는 2012년 10월 마지막 업데이트).
플랫폼별 참고
- DragonFlyBSD:
tc*()/ctime버그 workaround 테스트 갱신. - Mac OS X: Big Sur에서 없는 시스템 라이브러리 파일을
dlopenfallback으로 처리. - Windows: 65001(UTF-8) 코드페이지 콘솔에서 비ASCII 읽기 버그 workaround. mingw 빌드 복구.
Makefile.mk/dmake 지원 제거(nmake, GNU make 유지).USE_QUADMATH로 빌드 가능.symlink()/readlink()지원,lstat()가 더 이상stat()의 별칭이 아님. stat()가 이제dev/ino/nlink필드 채움.-r/-w가 STDIN/STDOUT/STDERR에서 true. stat/lstat 시간이 DST 조정에서 올바름.-x가 파일명과 일치.-e '"'버그 수정. MSVC/gcc 빌드 동일 manifest 사용. - z/OS:
LC_SYNTAX,LC_TOD로케일 카테고리 인식.
내부 변경 (Internal Changes)
-Dusequadmath빌드에서 double/long double 파라미터의 형식화 출력 처리 수정.PerlIO_printf(),croak(),warn(),sv_catpvf()등이 이제 double, long double, NV를 올바르게 수용.- 비트 시프트 연산의 오른쪽 피연산자(시프트량)가 IV에서 int로 암묵 캐스팅되며 발생하던 잘못된 결과 수정. INT_MIN 비트 시프트도 올바르게 처리.
cop_hints_exists_{pv,pvn,pvs,sv}함수 집합 추가 — mortal copy 없이 특정 cop의 hints 해시에 키 존재 확인.- XS/C 디버깅용
DEBUG_PRE_STMTS/DEBUG_POST_STMTS매크로 보조 추가. REFCOUNTED_HE_EXISTS를 코어 밖에서도 사용 가능하게.- 모든
SvTRUE계열 함수가 이제 인자를 정확히 한 번 평가. - 패턴
A*B(A,B 임의)에서 A 구간 매칭 tight loop가 UTF-8 지원으로 갱신. re모듈에 컴파일된 regexp의 최적화 데이터를 해시ref로 반환하는 새 함수optimization추가.PERL_GLOBAL_STRUCT컴파일 옵션 제거,dVAR매크로 불필요(호환성 위해 no-op으로 유지).- 새 savestack 타입
SAVEt_HINTS_HH추가 — 이전SAVEt_HINTS동작 정리. - 새 API 함수
av_count추가 — 배열 요소 수를 명확한 이름으로. semctl()/msgctl()/shmctl()이IPC_STAT/GETALL에서ARG의 UTF-8 플래그 리셋,IPC_SET/SETALL에서 downgrade 시도(실패 시 예외).semop()/msgsnd()/shmwrite()가 파라미터를 바이트로 downgrade.msgrcv()가VAR의 UTF-8 플래그 리셋.
주요 버그 수정 (Selected Bug Fixes)
%ENV설정 시 키의 업그레이드된 문자열을 올바르게 처리 (값처럼 downgrade 시도 → 실패 시 경고 후 utf8 사용).- regcomp.c 메모리 누수 수정. [GH #18604]
- pack/unpack 포맷
D가 long double 있는 모든 플랫폼(quadmath 포함)에서 지원. - 불완전한 op 트리 상수 접기 스킵 (chain 비교 op 트리의 상수 접기 크래시 수정). [GH #18380, #17917]
%g형식화가 Ubuntu-18.04에서 libcgcvt/qgcvt버그로 잘못 잘리던 문제 — 새 Configure probe로 대응, MINGW는USE_MINGW_ANSI_STDIO기본 사용.use utf8활성 상태에서my $_선언을 컴파일 오류로 (5.24 이후 제거된 렉시컬 topic 실험). [GH #18449]- regexec.c assertion 실패 수정 (버퍼에 너무 많은 문자 복사 시). [GH #18451]
- 스택된 파일 테스트 연산자에서 매직이 올바르게 호출. [GH #18293]
@ary = split(...)최적화가 더 이상 대상 배열을 값 스택으로 전환하지 않음. [GH #18232]- 재귀 서브패턴을 가진 일부 regexp가 잘못 매칭되던 버그 수정. [GH #18096]
- Win32에서
waitpid(-1, WNOHANG)의 매우 큰 타임아웃 문제 수정. [GH #16529] BOOTXSUB에서MARK/items가 올바르게 초기화.- 왼쪽에
undef있는 일부 리스트 할당이 과최적화되어 잘못된 결과 — 수정. [GH #16685, #17816]
알려진 문제 (Known Problems)
없음.
이전 릴리스 정오표 (Errata From Previous Releases)
없음.
부고 (Obituary)
Kent Fredric (KENTNL)가 2021년 2월에 세상을 떠났어요. 뉴질랜드 출신, 자칭 "huge geek"였으며 178개 CPAN 배포의 저자/메인테이너, Gentoo Linux 배포판의 Perl 메인테이너, Perl 코어 배포 기여자였어요.
감사 (Acknowledgements)
Perl 5.34.0은 5.32.0 이후 약 11개월의 개발로, 78명의 저자가 2,100개 파일에 약 280,000줄의 변경을 포함해요. 자동 생성 파일·문서·릴리스 도구 제외 시 1,300개 .pm/.t/.c/.h 파일에 약 150,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 파일.