Nach 11 Monaten Entwicklung wurde die neue stabile Version der Programmiersprache Perl — 5.40 veröffentlicht. Bei der Vorbereitung dieser Version wurden etwa 160.000 Zeilen Code (ohne Dokumentation und automatisch generierten Code — 110.000) geändert, und es waren 1500 Dateien betroffen, an deren Entwicklung 75 Entwickler beteiligt waren.
Die Version 5.40 wurde gemäß dem vor elf Jahren festgelegten unveränderlichen Entwicklungszeitplan veröffentlicht, der eine jährliche Veröffentlichung neuer stabiler Versionen und alle drei Monate Korrekturen vorsieht. Etwa einen Monat später wird die erste Korrekturversion Perl 5.40.1 erwartet, die die bedeutendsten Fehler behebt, die während der Implementierung von Perl 5.40.0 festgestellt wurden. Mit der Veröffentlichung von Perl 5.40 wird die Unterstützung für die Version 5.36 eingestellt. Updates für diese Version können zukünftig nur noch bei kritischen Sicherheitsproblemen veröffentlicht werden. Am 20. Juni beginnt der Entwicklungsprozess für die experimentelle Version 5.41, auf deren Grundlage im Mai oder Juni 2025 die stabile Version Perl 5.42 erstellt wird, es sei denn, es wird beschlossen, zur Nummerierung 7.x überzugehen.
Wichtige Änderungen:
- Die Möglichkeiten in Verbindung mit der in der vorherigen Version eingeführten experimentellen Syntax zur Klassenerstellung wurden erweitert. Ein neues Schlüsselwort «__CLASS__» wurde hinzugefügt, das bei Aufruf aus Methoden, ADJUST-Blöcken oder bei der Initialisierung von Feldern den Namen der aktuellen Klasse zurückgibt, ähnlich wie das Schlüsselwort __PACKAGE__ den Namen des Pakets zurückgibt. Im Gegensatz zum Ausdruck ref($self) kann das Schlüsselwort __CLASS__ bei der Initialisierung von Feldern verwendet werden, um auf Methoden der Klasse vor Abschluss der Erstellung einer Instanz zuzugreifen. Für die Basisklasse ist der Wert von __CLASS__ identisch mit dem Wert von __PACKAGE__, unterscheidet sich jedoch bei der Erstellung von Unterklassen.
use feature 'class';
class Example1 {
field $f = __CLASS__->default_f;
sub default_f { 10 }
} - Für innerhalb der Klasse definierten Felder wurde das Attribut «:reader» implementiert, das zur automatischen Erstellung einer Methode verwendet wird, die den Wert der Variablen aus dem Feld in der aktuellen Instanz der Klasse zurückgibt.
Zum Beispiel ist die Angabe «:reader» nach der Felddefinition «field $s;» äquivalent zur Erstellung der Methode «method s () { return $s; }». Bei Bedarf kann ein abweichender Methodennamen durch eine Konstruktion wie «field $name :reader(get_name);» festgelegt werden. - Die stabile Syntax für die Ausnahmebehandlung durch try/catch wurde eingeführt, die anstelle von nicht offensichtlichen Manipulationen mit „eval“ verwendet werden kann. Der „try“-Block enthält den ausführbaren Code, während der „catch“-Block den Code zur Verarbeitung von Ausnahmen umfasst, die während der Ausführung des ersten Blocks auftreten können. Im „catch“ wird eine Variable definiert, die die beim Erzeugen der Ausnahme übergebenen Daten enthält (zum Beispiel wird bei einem Ausnahmefehler beim Aufruf von „die“ der als Argument angegebene String übergeben). Innerhalb der Blöcke „try“ und „catch“ sind Sprungbefehle erlaubt, einschließlich return, goto, next, last und redo.
try {
my $x = call_a_function();
$x < 100 or die "Zu groß"; send_output($x); } catch ($e) { warn "Wert konnte nicht ausgegeben werden; $e"; } print "Fertig\n"; - Die Syntax "for my (VAR, VAR) (LIST)" und "foreach my (VAR, VAR) (LIST)" wurde stabilisiert und wird verwendet, um Listen zu durchlaufen und dabei mehrere Werte in einer einzigen Iteration zu extrahieren. Zum Beispiel kann jetzt angegeben werden:
foreach my ($key, $value) (%hash) { … }
for my ($left, $right, $gripping) (@moties) { … } - Das stabile Modul builtin wurde angekündigt, das immer verfügbare Funktionen enthält, die in den Interpreter integriert sind. Derzeit bietet das Modul die Funktionen true, false, weaken, unweaken, is_weak, blessed, refaddr, reftype, ceil, floor, is_tainted, trim und indexed an.
- Neue experimentelle eingebaute Funktionen inf und nan wurden hinzugefügt, die im Namensraum „builtin::“ verfügbar sind („builtin::inf“ und „builtin::nan“). Diese Funktionen können als Konstanten verwendet werden, die Unendlichkeit und nicht-numerische Werte definieren.
- Ein neuer logischer Operator „^^“ wurde hinzugefügt, der der XOR-Operation entspricht und den bitweisen Operator „^“ ergänzt (in Perl gibt es drei grundlegende bitweise Operatoren „&“, „|“ und „^“, die den Operationen AND, OR und XOR entsprechen, aber für logische Operationen waren bisher nur die Varianten AND („&&“) und OR („||“) verfügbar). Der logische Ausdruck „$x ^^ $y“ gibt TRUE zurück, wenn entweder „x“ oder „y“ TRUE sind, jedoch nicht gleichzeitig.
- Die Unterstützung für Simulationen von Versionen unter 5.11 wurde eingestellt. Die Verwendung der Direktive „use versionsnummer“, die zusätzliche Funktionen deaktiviert, die nach der angegebenen Version im Interpreter hinzugefügt wurden, mit einer Versionsnummer unter 5.11 (zum Beispiel „use v5.8“) führt nun zu einer Fehlermeldung anstelle einer Warnung. Ähnlich wurde eine Warnung hinzugefügt, wenn in „use“ eine Version unter 5.39 verwendet wird (Warnungen werden in der Version 5.44 in Fehler ersetzt).
- Es ist erlaubt, ein Leerzeichen zwischen der Befehlszeilenoption „-M“ und dem Modulnamen, wie „perl -M Data::Dumper=Dumper -E ‘say Dumper [1,2,3]'“ zu verwenden (früher musste man „perl -MData::Dumper…“ schreiben).
- Die Verwendung des Operators „goto“, um von einem äußeren Geltungsbereich in einen inneren zu wechseln, wurde als veraltet erklärt. Die Unterstützung dieser Funktion wird in der Perl-Version 5.42 eingestellt.
- Die Module Term::Table und Test2::Suite, die zur Erstellung von Unit-Tests dienen, wurden in den Hauptinhalt aufgenommen. Die Versionen der Module Archive::Tar, Compress::Raw::Bzip2, Compress::Raw::Zlib, Data::Dumper,
DB_File, File::Compare, File::Find, Getopt::Long, Hash::Util, HTTP::Tiny, IO, Math::BigInt, PerlIO::encoding, Tie::File, Time::HiRes usw. wurden aktualisiert. - Die Unterstützung für das Betriebssystem Serenity OS wurde hinzugefügt.
- Zwei Sicherheitsanfälligkeiten wurden behoben:
- CVE-2023-47038 — Pufferüberlauf durch Verarbeitung von fehlerhaften, benutzerspezifizierten Unicode-Eigenschaften. Das Problem kann zu einem Pufferüberlauf von 1 Byte bei der Verarbeitung speziell gestalteter regulärer Ausdrücke führen.
- CVE-2023-47039 — Möglichkeit, eine ausführbare Datei auf der Windows-Plattform zu ersetzen, da cmd.exe in Pfaden unter Verwendung der Umgebungsvariable PATH gesucht wird, wobei das aktuelle Arbeitsverzeichnis vorrangig gegenüber dem Systemverzeichnis mit der ausführbaren Datei cmd.exe ist.
Quelle: opennet.ru
