目錄

名稱

perl581delta - perl v5.8.1 的新功能

描述

本文描述了 5.8.0 版本和 5.8.1 版本之間的差異。

如果您從之前的版本升級,例如 5.6.1,請首先閱讀 perl58delta,該文件描述了 5.6.0 和 5.8.0 之間的差異。

如果您對 5.6.1 有疑問,它在修復錯誤方面與開發版本 5.7.1 幾乎相同。感到困惑?這個時間線希望能幫助一點:它列出了新的主要版本、它們的維護版本和開發版本。

New     Maintenance  Development

5.6.0                             2000-Mar-22
                     5.7.0        2000-Sep-02
        5.6.1                     2001-Apr-08
                     5.7.1        2001-Apr-09
                     5.7.2        2001-Jul-13
                     5.7.3        2002-Mar-05
5.8.0                             2002-Jul-18
        5.8.1                     2003-Sep-25

不相容的更改

哈希隨機化

主要是出於安全原因,哈希的「隨機排序」已經變得更加隨機。以前,雖然 keys()、values() 和 each() 的哈希元素的順序基本上是隨機的,但仍然是可重複的。然而,現在,Perl 的不同運行之間的順序會有所不同。

Perl 從未保證過哈希鍵的任何順序,在 Perl 5 的生命周期中,哈希鍵的順序已經幾次改變。而且,哈希鍵的順序一直受到插入順序的影響。

增加的隨機性可能會影響應用程序。

一種可能的情況是,應用程序的輸出包含了哈希數據。例如,如果您使用 Data::Dumper 模塊將數據轉儲到不同的文件中,然後比較文件以查看數據是否已更改,現在將會出現假陽性,因為轉儲哈希的順序將會變化。一般來說,解決方法是對鍵(或值)進行排序;特別是對於 Data::Dumper,可以使用 Sortkeys

更微妙的問題是對「全域毀滅」順序的依賴。這是在執行結束時發生的事情:Perl 毀滅所有的資料結構,包括使用者資料。如果您的解構子(DESTROY子例程)假定了全域毀滅的任何特定順序,可能會遇到問題。例如,在一個物件的解構子中,您不能假設其他任何類別的物件仍然可用,除非您保留了對它們的引用。如果環境變數 PERL_DESTRUCT_LEVEL 設置為非零值,或者如果 Perl 正在退出一個衍生的執行緒,它也將毀滅不再使用的普通參考和符號表。您無法在以這種方式收集的類上調用類方法或普通函數。

哈希隨機化肯定會揭示某些特定順序的哈希元素的隱藏假設,以及明確的錯誤:它揭示了 Perl 核心和核心模塊中的一些錯誤。

要在運行時禁用哈希隨機化,請在執行 Perl 之前將環境變數 PERL_HASH_SEED 設置為 0(零)(有關更多信息,請參見"perlrun" 中的 "PERL_HASH_SEED"),或者要在編譯時完全禁用此功能,請使用 -DNO_HASH_SEED 進行編譯(請參見 INSTALL)。

有關此更改背後原始的理由,請參閱 "perlsec" 中的 "Algorithmic Complexity Attacks"

UTF-8 On Filehandles No Longer Activated By Locale

在 Perl 5.8.0 中,所有文件處理器,包括標準文件處理器,都會隱式設置為 Unicode UTF-8,如果地區設置指示使用 UTF-8。這個功能造成了太多問題,因此關閉了這個功能並進行了重新設計:請參見 "Core Enhancements"

單數字 v-strings 在「=>」之前不再是 v-strings

版本字串或 v-strings(參見 "perldata" 中的 "Version Strings")功能是在 Perl 5.6.0 中引入的,它一直是一個造成某些混淆的來源--特別是當使用者不想使用它時,但 Perl 認為它知道得更好。尤其棘手的是,在「=>」之前,版本字串(一個由數字後跟 "v" 組成的字串)被解釋為 v-string 而不是字串文字。換句話說

%h = ( v65 => 42 );

從 Perl 5.6.0 開始意味著

%h = ( 'A' => 42 );

(至少在ASCII後裔的平台上) Perl 5.8.1 恢復了更自然的解釋

%h = ( 'v65' => 42 );

多數字 v-strings,如 v65.66 和 65.66.67,在 Perl 5.8 中仍然是 v-strings。

(Win32) -C 開關已被重新定義

-C 開關以不相容的方式更改。此開關的舊語義僅在 Win32 中才有意義,並且僅在 5.6.x 版本的 "use utf8" 宇宙中有意義,在 5.8.0 版本的 Unicode 實現中不合理。由於此開關無法被任何人使用,因此它已被重新定義。在未來版本中,此開關在 5.6.x 版本中啟用的行為可能會以透明的、數據依賴的方式得到支持。

有關此開關的新生命,請參閱 "UTF-8 在 UTF-8 地域設置下不再是默認值",以及 perlrun 中的 "-C"

(Win32) cmd.exe 的 /d 開關

Perl 5.8.1 在內部運行 cmd.exe shell 時使用 /d 開關,用於 system()、反引號和打開到外部程序的管道。額外的開關禁用了從註冊表中執行 AutoRun 命令,這通常在運行外部程序時被認為是不希望的。如果您希望保持與舊行為的兼容性,請在您的環境中設置 PERL5SHELL 為 cmd /x/c

核心增強功能

UTF-8 在 UTF-8 地域設置下不再是默認值

在 Perl 5.8.0 中引入了許多 Unicode 功能。其中一個發現比有益更為惱人:如果用戶的區域設置指示使用 UTF-8,則文件處理程序,包括標準文件處理程序,將自動(並且默默地)進行“UTF-8化”。

例如,如果您的區域設置為 en_US.UTF-8,則您的 STDIN 和 STDOUT 將自動變成“UTF-8”,換句話說,會進行隱式的 binmode(..., ":utf8")。這意味著嘗試打印 chr(0xff) 將會打印出字節 0xc3 0xbf。這幾乎不是您的初衷,除非您意識到 Perl 5.8.0 的此功能。問題在於絕大多數人都不知道:例如,在 RedHat 的 8 和 9 版本中,默認的區域設置是 UTF-8,因此所有 RedHat 用戶都獲得了 UTF-8 文件處理程序,無論他們是否需要。這一痛苦加劇了 Perl 5.8.0 的 Unicode 實現(仍然)存在嚴重錯誤,特別是與 s/// 和 tr/// 使用相關的錯誤。(在 5.8.1 中已經修復了這些錯誤)

因此,決定撤消該功能並將其從隱式的默認變成顯式的有意識選項。現在,新的 Perl 命令行選項 -C 及其對應的環境變量 PERL_UNICODE 可以用於控制 Perl 和 Unicode 在接口(如 I/O 和命令行參數)上的交互作用。有關更多信息,請參閱 perlrun 中的 "-C"perlrun 中的 "PERL_UNICODE"

再次提供不安全的信號

在 Perl 5.8.0 中引入了所謂的“安全信號”。這意味著 Perl 不再立即處理信號,而是在“操作碼之間”處理信號,這樣做是安全的。早期的立即處理很容易破壞 Perl 的內部狀態,導致神秘的崩潰。

然而,新的更安全模式也有問題。因為現在操作碼,Perl 執行的基本單元,永遠不會被中斷,而是讓其運行完成,某些可能需要很長時間的操作現在確實需要很長時間。例如,某些網絡操作具有自己的阻塞和超時機制,能夠立即中斷它們將是很好的。

因此,perl 5.8.1 引入了一個“後門”,恢復了 5.8.0(實際上是 5.7.3 之前)之前的信號行為。只需將環境變量 PERL_SIGNALS 設置為 unsafe,就可以恢復舊的立即(且不安全)的信號處理行為。參見 perlrun 中的“PERL_SIGNALS”perlipc 中的“Deferred Signals (Safe Signals)”

在完全不相關的新聞中,您現在可以使用 POSIX::SigAction 來使用安全信號。參見 POSIX 中的“POSIX::SigAction”

帶有負數陣列索引的綁定陣列

以前,在綁定陣列類中傳遞給 FETCHSTOREEXISTSDELETE 方法的索引始終是非負數。如果實際參數為負數,Perl 會隱式調用 FETCHSIZE,然後將結果添加到索引中,然後將結果傳遞給綁定陣列方法。這種行為現在是可選的。如果綁定陣列類包含一個名為 $NEGATIVE_INDICES 的包變量,並將其設置為真值,則負值將不變地傳遞給 FETCHSTOREEXISTSDELETE

本地 ${$x}

現在的語法

local ${$x}
local @{$x}
local %{$x}

現在對變量進行本地化,前提是 $x 是一個有效的變量名。

Unicode 字符數據庫 4.0.0

Perl 5.8 中包含的 Unicode 字符數據庫副本已從 3.2.0 更新為 4.0.0。這意味著,例如,Unicode 字符屬性與 Unicode 4.0.0 中的一致。

不建議使用警告

有一個新的特性不建議使用。Perl 5.8.0 忘記添加了一些不建議使用的警告,現在已經添加了這些警告。最後,提醒即將移除的特性。

(提醒)偽哈希已經不建議使用(真的)

偽哈希在 Perl 5.8.0 中已被棄用,並將在 Perl 5.10.0 中移除,詳情請參閱 perl58delta。每次嘗試訪問偽哈希都將觸發警告 偽哈希已被棄用。如果您真的想繼續使用偽哈希但不想看到棄用警告,請使用

no warnings 'deprecated';

或者您可以繼續使用 fields pragma,但請不要再期望數據結構是偽哈希。

(提醒) 5.005-style 線程已被棄用(確實)

5.005-style 線程(通過 use Thread; 啟用)已在 Perl 5.8.0 中被棄用,將在 Perl 5.8 後被移除,詳情請參閱 perl58delta。每次創建 5.005-style 線程將觸發警告 5.005 threads are deprecated。如果您真的想繼續使用 5.005 線程但不想看到棄用警告,請使用

no warnings 'deprecated';

(提醒) 變量 $* 已被棄用(確實)

控制多行匹配的 $* 變量已被棄用,將在 5.8 之後被移除。這個變量已被棄用很長時間,並給出了棄用警告 Use of $* is deprecated,現在這個變量將最終被移除。這個功能已被模式匹配中的 /s/m 修飾符所取代。如果您真的想繼續使用 $* 變量但不想看到棄用警告,請使用

no warnings 'deprecated';

雜項增強功能

無值上下文中的 map 現在不再佔用資源。 map 現在已經具有上下文感知能力,如果在無值上下文中調用,將不會構造列表。

如果服務器在向其打印時關閉套接字,客戶端現在會收到 SIGPIPE。雖然這個新功能並不是計劃中的,但它自然地出現在 PerlIO 更改中,應該被視為一個意外的功能。

PerlIO::get_layers(FH) 返回在文件處理程序上活動的 PerlIO 層的名稱。

PerlIO::via 層現在可以有一個可選的 UTF8 方法,以指示該層是否想要 "auto-:utf8" 流。

utf8::is_utf8() 已添加為一種快速測試純量是否在內部以 UTF-8(Unicode)編碼的方法。

模組與Pragmata

更新的模組與Pragmata

自 Perl 5.8.0 以來已更新的模組與Pragmata 如下:

base
B::Bytecode

現在的狀態比以前好多了。仍然不完美,但也許值得一試。

B::Concise
B::Deparse
Benchmark

一個可選功能,:hireswallclock,現在允許高解析度的掛鐘時間(使用 Time::HiRes)。

ByteLoader

參見 B::Bytecode。

bytes

現在有 bytes::substr。

CGI
charnames

現在可以自訂字符名稱別名。

CPAN

現在有一個簡單的 CPAN.pm 模組的命令行前端叫做 cpan

Data::Dumper

一個新選項,Pair,允許選擇哈希鍵和值之間的分隔符。

DB_File
Devel::PPPort
Digest::MD5
Encode

編碼 Pragma 功能的重大更新(tr/// 和 DATA filehandle、格式)。

如果一個 filehandle 被標記為具有編碼,則輸入時已經檢測到無法映射的字符,而不是在稍後(使用損壞的數據時)。

ISO 8859-6 轉換表已經修正(0x30..0x39錯誤地映射到 U+0660..U+0669,而不是 U+0030..U+0039)。 GSM 03.38 轉換未正確處理轉義序列。新增了 UTF-7 編碼(使 Encode 與 Unicode::String 功能完整)。

fields
libnet
Math::BigInt

自 v1.60 以來修復了許多錯誤,該版本包含在 Perl v5.8.0 中。特別值得注意的是 Calc 中的一個錯誤,該錯誤導致一些大值的 div 和 mod 失敗,以及對壞輸入的處理的修復。

添加了一些新功能,例如 broot() 方法,現在可以將參數傳遞給 config() 在運行時更改一些設置,現在可以捕獲 NaN 和 infinity 的創建。

通常,一些優化會使數學整體上快一點。在某些情況下,實際上快了很多。特別是像 Math::BigInt::GMP 這樣的替代庫受益於此。此外,許多相當笨重的例程(如 fsqrt() 和 flog())現在快得多了。

MIME::Base64
NEXT

Diamond inheritance now works.

Net::Ping
PerlIO::scalar

Reading from non-string scalars (like the special variables, see perlvar) now works.

podlators
Pod::LaTeX
PodParsers
Pod::Perldoc

Complete rewrite. As a side-effect, no longer refuses to startup when run by root.

Scalar::Util

New utilities: refaddr, isvstring, looks_like_number, set_prototype.

Storable

Can now store code references (via B::Deparse, so not foolproof).

strict

Earlier versions of the strict pragma did not check the parameters implicitly passed to its "import" (use) and "unimport" (no) routine. This caused the false idiom such as

use strict qw(@ISA);
@ISA = qw(Foo);

This however (probably) raised the false expectation that the strict refs, vars and subs were being enforced (and that @ISA was somehow "declared"). But the strict refs, vars, and subs are not enforced when using this false idiom.

Starting from Perl 5.8.1, the above will cause an error to be raised. This may cause programs which used to execute seemingly correctly without warnings and errors to fail when run under 5.8.1. This happens because

use strict qw(@ISA);

will now fail with the error

Unknown 'strict' tag(s) '@ISA'

The remedy to this problem is to replace this code with the correct idiom

use strict;
use vars qw(@ISA);
@ISA = qw(Foo);
Term::ANSIcolor
Test::Harness

Now much more picky about extra or missing output from test scripts.

Test::More
Test::Simple
Text::Balanced
Time::HiRes

Use of nanosleep(), if available, allows mixing subsecond sleeps with alarms.

threads

Several fixes, for example for join() problems and memory leaks. In some platforms (like Linux) that use glibc the minimum memory footprint of one ithread has been reduced by several hundred kilobytes.

threads::shared

許多記憶體洩漏問題已經修復。

Unicode::Collate
Unicode::Normalize
Win32::GetFolderPath
Win32::GetOSVersion

現在提供額外的資訊。

Utility Changes

現在 h2xs 實用程式產生更現代化的佈局:Foo-Bar/lib/Foo/Bar.pm 而不是 Foo/Bar/Bar.pm。此外,範本測試現在稱為 t/Foo-Bar.t 而不是 t/1.t

Perl 偵錯器 (lib/perl5db.pl) 現在已經廣泛地文件化,並且在文件化過程中發現的錯誤已經修復。

perldoc 已經從頭重寫,以更加堅固和功能豐富。

perlcc -B 現在至少有些許改善,而 perlcc -c 則更加破損。(整個 Perl 編譯套件仍然處於實驗階段。)

New Documentation

新增了 perl573delta 以列出 (現在相當過時的) 開發版本 5.7.2 和 5.7.3 之間的差異。

新增了 perl58delta:它是 5.8.0 的 perldelta,詳細介紹了 5.6.0 和 5.8.0 之間的差異。

新增了 perlartistic:它是 Artistic License 的 pod 格式,使模組更容易參考它。

新增了 perlcheat:它是 Perl 快速參考表。

新增了 perlgpl:它是 GNU 通用公共許可證的 pod 格式,使模組更容易參考它。

新增了 perlmacosx 以介紹在 Mac OS X 中安裝和使用 Perl。

新增了 perlos400 以介紹在 OS/400 PASE 中安裝和使用 Perl。

新增了 perlreref:它是正則表達式快速參考。

Installation and Configuration Improvements

Unix 標準的 Perl 位置,/usr/bin/perl,現在不再預設覆蓋如果存在的話。這個變化非常明智,因為許多 Unix 供應商已經提供了 /usr/bin/perl,但同時許多系統工具可能依賴於該版本的 Perl,所以最好不要覆蓋它。

現在可以為站點和供應商的手冊和 HTML 頁面以及站點和供應商的腳本指定安裝目錄。詳見 INSTALL

現在可以通過為 make install 指定 DESTDIR 變量來為 Perl 安裝指定目的地目錄。 (此功能與先前的 Configure -Dinstallprefix=... 稍有不同。)詳見 INSTALL

gcc 3.x 版本引入了一個新的警告,導致 Perl 編譯期間產生大量噪音:gcc -Ialreadyknowndirectory(警告:更改搜索順序)。 在編譯之前,Configure 現在會過濾掉此類目錄,從而避免了此警告。

現在可以通過使用 Configure 標誌 -Dnoextensions=...-Donlyextensions=... 構建 Perl 核心模塊的子集。詳見 INSTALL

特定平台的增強功能

在 Cygwin 中,Perl 現在可以使用線程進行構建(Configure -Duseithreads)。 這適用於 Cygwin 1.3.22 和 Cygwin 1.5.3。

在較新的 FreeBSD 發行版中,由於嘗試使用 malloc.h,Perl 5.8.0 編譯失敗,而在 FreeBSD 中,malloc.h 只是一個虛擬文件,甚至嘗試使用它都會導致致命錯誤。 現在不再使用 malloc.h

Perl 現在已知也可在日立 HI-UXMPP 中構建。

Perl 現在已知再次可以在 LynxOS 中構建。

Mac OS X 現在在安裝目錄名稱中嵌入了 Perl 版本號,以便更輕鬆地升級用戶編譯的 Perl,並且安裝目錄通常更標準。 換句話說,默認安裝不再破壞蘋果提供的 Perl。 另一方面,使用 Configure -Dprefix=/usr 您現在可以真正替換蘋果提供的 Perl(請小心)。

Mac OS X 現在默認靜態構建 Perl。 這個變更主要是為了更快的啟動時間。 蘋果提供的 Perl 仍然是動態鏈接和共享的,您可以通過 Configure -Duseshrplib 启用自己的 Perl 構建的共享性。

Perl 已經移植到 IBM 的 OS/400 PASE 環境。 為 PASE 構建 Perl 的最佳方法是使用 AIX 主機作為交叉編譯環境。 詳見 README.os400。

現在添加了另一個交叉編譯選項:Perl 現在可以在 OpenZaurus 上構建,這是一個基於 Mandrake + Embedix 的 Linux 發行版,用於 Sharp Zaurus PDA。 詳見 Cross/README 文件。

Tru64 在使用 gcc 3 時將 toke.c 的優化降為 -O2,因為默認情況下使用 -O3 會導致巨大的內存使用。

Tru64 現在可以使用更新的 Berkeley DB 構建 Perl。

在 WinCE 上構建 Perl 得到了很大的增強,詳見 README.ceREADME.perlce

已選擇的錯誤修復

閉包、eval 和詞彙

在匿名子程序、詞彙和閉包方面有許多修復。儘管這意味著 Perl 現在更加「正確」,但可能會導致一些現有的依賴於錯誤行為的程式碼中斷。實際上,除非您的程式碼包含非常複雜的匿名子程序、evals 和詞彙的嵌套,否則這種情況不太可能發生。

通用修復

如果輸入檔案處理物件標記為 :utf8,並且 Perl 在執行 <FH> 時發現非法的 UTF-8 輸入,如果啟用了警告,則會立即發出警告 - 而不是保持沉默,並在稍後 Perl 意識到數據錯誤時變得不高興。(:encoding(utf8) 層也以同樣的方式工作。)

binmode(SOCKET, ":utf8") 只在輸入端起作用,而不是在輸出端起作用。現在它兩者都有效。

對於線程化的 Perl,某些系統資料庫函數(如 getpwent() 和 getgrent())現在會動態擴展其結果緩衝區,而不是失敗。這意味著在具有大量使用者和群組的站點,這些函數不再因僅返回部分結果而失敗。

Perl 5.8.0 不小心破壞了用戶定義其自己的大寫<->小寫 Unicode 映射的功能(正如 Camel 所宣傳的那樣)。此功能已修復,並且文檔化得更好。

在 5.8.0 中,此行為

$some_unicode .= <FH>;

無法正確工作,而是導致數據損壞。這個問題現在已經修復。

像 FETCH 等的綁定方法現在可以安全地訪問綁定值,即導致對 FETCH 等的遞歸調用。但請記住要打破遞歸。

在啟動時,Perl 會阻止 SIGFPE 信號,因為 Perl 對此無能為力。之前,這種阻止也對從 Perl 內執行的程序有效。現在,Perl 在運行外部程序之前會恢復原始的 SIGFPE 處理程序,無論它是什麼。

Perl 腳本中的行號現在可以大於 65536,或 2**16。(Perl 腳本一直能夠大於該值,只是報告錯誤和警告的行號已「循環」。)儘管這麼大的腳本通常表示需要重新思考您的代碼,但這樣的 Perl 腳本確實存在,例如作為生成代碼的結果。現在,行號可以一直到 4294967296,或 2**32。

特定平台的修復

Linux

  • 再次可以設置 $0(具有某些 Perl 無法解決的限制:請參閱 perlvar 中的 "$0"

HP-UX

  • 現在設置$0可正常工作。

VMS

  • 現在的配置測試是否存在poll(),如果檢測到,IO::Poll現在將使用供應商提供的函數。

  • 在 Perl 啟動時可能會發生一個罕見的存取違例,如果 Perl 映像以特權安裝,或者如果進程的權利清單中設置了具有子系統屬性的標識符,則可能會發生這種情況。 這些情況中的任何一種都將觸發包含指針錯誤的污點代碼。已修復了錯誤的指針算術。

  • %ENV 哈希中值(而不是鍵)的長度限制已從 255 字節提高到 32640 字節(除非 PERL_ENV_TABLES 設置覆蓋了對 %ENV 使用邏輯名的默認使用)。 如果需要從 Perl 外部訪問這些長值,請注意它們是使用搜索列表邏輯名實現的,每個 255 字節片段(最多 128 個)都是搜索列表中的一個元素。 在 Perl 內部查找 %ENV 時,這些元素會組合成單個值。 通過 $ENV{'foo;N'} 語法(其中 N 為搜索列表索引)訪問搜索列表邏輯名的各個元素的現有 VMS 特定能力保持不變。

  • 管道實現現在使用本地而不是全局 DCL 符號進行進程間通信。

  • 當導航到與邏輯名發生衝突的相對目錄時,File::Find 可能會混淆。 通過將目錄語法添加到相對路徑名中,已糾正此問題,從而防止邏輯名轉換。

Win32

  • 已修復了 fork() 模擬中的內存洩漏。

  • 在 5.8.0 中,ioctl() 內置函數的返回值意外地被破壞。 已糾正此問題。

  • 在阻塞操作期間由 Perl 執行的內部消息循環有時會干擾外部 Perl 消息。 當 Perl 在可以生成 Windows 消息的環境中執行時,這通常會導致阻塞操作提前終止或返回不正確的結果。 已糾正此問題。

  • 管道和套接字現在自動處於二進制模式。

  • 在存在底層調用錯誤時,select() 的四個參數形式沒有正確保存 $!(errno)。 現在已經修復了這個問題。

  • 已修復了“CR CR LF”問題,binmode(FH,“:crlf”) 現在有效地成為一個無操作。

新增或更改的診斷

所有與 pack() 和 unpack() 相關的警告都變得更具信息量和一致性。

更改為 "A thread exited while %d threads were running"

舊版本

A thread exited while %d other threads were still running

因為 "其他" 還包括給出警告的線程,所以舊版本具有誤導性。

刪除 "Attempt to clear a restricted hash"

清除受限哈希表不是非法的,因此刪除了該警告。

新增 "Illegal declaration of anonymous subroutine"

您必須為 sub 指定代碼塊。

更改為 "Invalid range "%s" in transliteration operator"

舊版本

Invalid [] range "%s" in transliteration operator

是錯誤的,因為 tr/// 中沒有 "[] 範圍"。

新增 "Missing control char name in \c"

自我解釋。

新增 "Newline in left-justified string for %s"

填充空格將出現在換行符之後,這可能不是您想要的。

新增 "Possible precedence problem on bitwise %c operator"

如果您認為這

$x & $y == 0

測試 $x 和 $y 的位元 AND 是否為零,則會喜歡這個警告。

新增 "Pseudo-hashes are deprecated"

這個警告應該已經在 5.8.0 中存在,因為它們已經被棄用。

新增 "read() on %s filehandle %s"

您不能從已關閉或未打開的文件處理器中進行 read()(或 sysread())。

新增 "5.005 threads are deprecated"

這個警告應該已經在 5.8.0 中存在,因為它們已經被棄用。

新增 "Tied variable freed while still in use"

某些因素導致一個實時綁定的變量被斷開,Perl 通過安全退出來保護自己。

新功能 "To%s: 非法映射 '%s'"

指定了一個非法的用戶定義 Unicode 大小寫映射。

新功能 "在迭代中使用被釋放的值"

有東西修改了正在遍歷的值。這不是好的現象。

內部更改

這些新功能僅對您有影響,如果您要寫 XS 代碼,或者想了解或者破解 Perl 內部(使用 Devel::Peek 或任何 B:: 模塊計算),或者喜歡使用 -D 選項運行 Perl。

perlembed 的嵌入示例已經過審查,以確保其為最新且一致:例如,正確使用 PERL_SYS_INIT3() 和 PERL_SYS_TERM()。

由 Dave Mitchell 進行了對詞法變量負責的代碼(即負責詞法變量的代碼)的大量改寫。

由 John Peacock 對 v-strings 進行了大量工作。

UTF-8 長度和位置緩存:為了加速 Unicode(UTF-8)標量的處理,引入了一個緩存。如果一個擴展繞過了官方 API 直接修改了 SV 的 PV,可能會出現問題:UTF-8 緩存不會像應該的那樣清除。

在 Perl 5.8.0 中被廢棄的 API,如 sv_2pv、sv_catpvn、sv_catsv、sv_setsv,現在再次可用。

某些 Perl 核心 C API,如 cxinc 和 regatom,對於 Perl 核心以外的代碼已不再可用。這是有意的。它們本來就不應該以更短的名稱提供,如果您的應用程序依賴於它們,您應該(感到羞愧並)聯繫 perl5-porters 討論什麼是正確的 API。

某些 Perl 核心 C API(例如 Perl_list)現在需要加上 Perl_ 前綴才能使用。如果您的 XS 模塊因為找不到某些函數而停止工作,在許多情況下,一個簡單的修復方法是將函數和線程上下文 aTHX_ 作為函數調用的第一個參數添加上 Perl_ 前綴。這也應該一直是正確的做法:讓沒有 Perl_ 前綴的形式從核心洩漏是一個意外。為了更清晰地嵌入,您還可以通過在編譯時定義 cpp 宏 PERL_NO_SHORT_NAMES 強制對所有 API 執行此操作。

已新增 Perl_save_bool()。

正則表達式對象(使用 qr 創建的對象)現在具有 S-magic 而不是 R-magic。這修復了形式為 /...(??{...;$x})/ 的正則表達式不再忽略對 $x 所做的更改。S-magic 避免了丟棄緩存優化並使 (??{...}) 構造變得極其緩慢(並因此變得無用)。另請參閱perlguts 中的“魔法變量”。Regexp::Copy 受到此更改的影響。

Perl 內部調試宏 DEBUG() 和 DEB() 已重命名為 PERL_DEBUG() 和 PERL_DEB(),以避免命名空間衝突。

移除了 -DL(泄漏測試多年來一直存在問題且不受支持,請使用替代調試 malloc 或像 valgrind 和 Purify 這樣的工具)。

新增了詳細修飾符 v,用於 -DXv-Dsv,請參見perlrun

新增測試

在 Perl 5.8.0 中,約有 69000 個單獨的測試分佈在約 700 個測試文件中,在 Perl 5.8.1 中,約有 77000 個單獨的測試分佈在約 780 個測試文件中。具體數字取決於 Perl 配置和操作系統平台。

已知問題

“不兼容更改”中提到的哈希隨機化確實存在問題:它將喚醒潛在的錯誤假設並檢驗不良假設。

如果您想要在 Perl 5.8.1 中使用 mod_perl 2.x,您將需要 mod_perl-1.99_10 或更高版本。較早版本的 mod_perl 2.x 不與隨機哈希兼容。(mod_perl 1.x 運行正常。)您還需要 Apache::Test 1.04 或更高版本。

許多較少見的平台在 perl 5.8.0 上運行良好或非常接近完美,但由於其維護者最近因其他事務而忙碌,因此已被稍微忽略,因此在這些平台上將會出現更多故障。此類平台包括 Mac OS Classic、IBM z/OS(和其他 EBCDIC 平台)以及 NetWare。最常見的 Perl 平台(Unix 和類 Unix、Microsoft 平台以及 VMS)擁有足夠大的測試和專家人口,因此運行良好。

在標量上下文中綁定的哈希

目前,在標量上下文中,綁定的哈希不會返回任何有用的值,例如當作布爾測試時

if (%tied_hash) { ... }

目前的荒謬行為總是返回 false,無論哈希是否為空或具有元素。

其根本原因在於綁定哈希的實現者沒有介面來實現哈希在標量上下文中的行為。

Net::Ping 450_service 和 510_ping_udp 失敗

如果您的網絡設置不尋常,則 lib/Net/Ping/t/450_service.t 的子測試 9 和 18,以及 lib/Net/Ping/t/510_ping_udp.t 的子測試 2 可能會失敗。例如,在後者情況下,測試嘗試將 UDP ping 發送到 IP 地址 127.0.0.1。

B::C

生成 C 的編譯器後端 B::C(前端為 perlcc -c)由於大量的變量變化而變得更加失效。(好消息是 B::Bytecode 和 ByteLoader 比以前更好了。)

平台特定問題

EBCDIC 平台

IBM z/OS 和其他 EBCDIC 平台在 Unicode 支持方面仍然存在問題。許多 Unicode 測試都被跳過了,但它們實際上應該被修復。

Cygwin 1.5 問題

在 Cygwin 1.5 中,io/tellop/sysio 測試因某些尚不清楚的原因而失敗。在 1.5.5 中,除非將環境變量 PERLIO 設置為 "perlio"(這也使得 io/tell 的失敗消失),否則線程測試 stress_cv、stress_re 和 stress_string 都會失敗。

Perl 5.8.1 與 Cygwin 1.3 建立和運行良好:使用 (uname -a) CYGWIN_NT-5.0 ... 1.3.22(0.78/3/2) 2003-03-18 09:20 i686 ... 達到了 100% 的 "make test",使用 Configure -des -Duseithreads

HP-UX:HP cc 關於 sendfile 和 sendpath 的警告

在某些 HP C 編譯器版本(例如 B.11.11.02)中,您將收到許多像這樣的警告(為了更易於閱讀而折行)。

cc: "/usr/include/sys/socket.h", line 504: warning 562:
  Redeclaration of "sendfile" with a different storage class specifier:
    "sendfile" will have internal linkage.
cc: "/usr/include/sys/socket.h", line 505: warning 562:
  Redeclaration of "sendpath" with a different storage class specifier:
    "sendpath" will have internal linkage.

這些警告既會在 Perl 的構建過程中出現,也會在調用 C 編譯器的某些 lib/ExtUtils 測試期間出現。但是,這個警告並不嚴重,可以忽略不計。

IRIX:t/uni/tr_7jis.t 誤報失敗

已知測試 t/uni/tr_7jis.t 在某些 IRIX 版本(至少是 IRIX 6.5 和 MIPSpro Compilers 版本 7.3.1.1m)中在 'make test' 或測試哈尼斯期間報告失敗,但如果手動運行測試,則測試完全通過。

Mac OS X:no usemymalloc

Perl malloc(-Dusemymalloc)在Mac OS X上根本無法運作。不過,這並不嚴重,因為本地malloc運作正常。

Tru64:無法使用GNU cc(gcc)進行多執行緒建置

在最新的Tru64版本(例如v5.1B或更高版本)中,gcc無法用於編譯帶有執行緒的Perl(-Duseithreads),因為系統的<pthread.h>檔案不知道gcc。

Win32:sysopen,sysread,syswrite

自5.8.0版本起,sysopen()/ sysread()/ syswrite()在"文本"模式方面的行為不再像5.6.1及之前版本那樣。這些內置現在始終以"二進制"模式操作(即使sysopen()被傳遞了O_TEXT標誌,或者文件處理器上使用了binmode())。請注意,這個問題應該僅在磁盤文件上有所不同,因為在Windows端口中,套接字和管道始終處於"二進制"模式。由於目前將此行為視為錯誤,因此在將來的版本中可能會重新引入兼容的行為。在那之前,sysopen()、sysread()和syswrite()的使用不支持"文本"模式操作。

未來方向

以下事情可能在未來發生。具有這些特性的第一個公開發行版將是開發者發行版Perl 5.9.x,最終釋出Perl 5.10.0版。這些是我們目前的最佳猜測:我們保留重新思考的權利。

  • PerlIO將成為默認值。目前(在Perl 5.8.x中),如果Perl認為可以使用某些技巧使stdio運行非常快速,則仍然使用stdio庫。對於未來的版本,我們的目標是使PerlIO運行速度更快。

  • 將提供一項名為assertions的新功能。這意味著可以在代碼中加入被稱為斷言的代碼:通常它們會被優化掉,但可以使用-A選項啟用它們。

  • 將提供一個新運算符//(定義-或)。這意味著可以說

    $a // $b

    而不是

    defined $a ? $a : $b

    $c //= $d;

    而不是

    $c = $d unless defined $c;

    運算子將具有與 || 相同的優先順序和關聯性。針對 Perl 5.8.1 源碼的源代碼補丁將在 CPAN 上提供,路徑為 authors/id/H/HM/HMBRAND/dor-5.8.1.diff

  • unpack() 將默認為解包 $_

  • 將研究各種寫時拷貝技術,以加快 Perl 的速度。

  • CPANPLUS、Inline 和 Module::Build 將成為核心模塊。

  • 將引入寫真正的區域範圍的指示詞的能力。

  • 將繼續進行字節編譯器和字節加載器的工作。

  • 目前的 v-strings 預定將被棄用。當與 userequire$VERSION 一起使用時,無 v 字串形式(1.2.3)將變成“版本對象”。$^V 也將成為“版本對象”,因此 printf("%vd",...) 構造將不再需要。v-ful 版本(v1.2.3)將變為過時。字符串和 v-strings 的等效性(例如目前的 5.8.0 等於 "\5\8\0")將消失。然而,對於 v-strings 可能不會出現棄用警告:這很難檢測到 v-strings 何時安全使用,何時不安全。

  • 將移除 5.005 Threads

  • 將移除 $* 變量(它很久以前就被棄用了)

  • 將移除 Pseudohashes

報告錯誤

如果您發現了您認為是一個錯誤,您可以檢查最近發表在 comp.lang.perl.misc 新聞組和 perl 錯誤數據庫(http://bugs.perl.org/)的文章。在 http://www.perl.com/ 也許還有信息,這是 Perl 的主頁。

如果您認為您有一個未報告的錯誤,請運行隨您的版本一起提供的 perlbug 程序。請確保將您的錯誤縮小到一個小但足夠的測試案例。您的錯誤報告將連同 perl -V 的輸出一起發送到 perlbug@perl.org 由 Perl 移植團隊分析。您可以在 http://bugs.perl.org/ 瀏覽和搜索 Perl 5 的錯誤。

參見

請參閱 Changes 文件以獲取詳細的更改信息。

請參閱 INSTALL 文件以了解如何構建 Perl。

請參閱 README 文件以獲取一般信息。

版權資訊的藝術和複製檔案。