perl5100delta - Perl 5.10.0 的新功能
本文描述了 5.8.8 版本和 5.10.0 版本之间的差异。
5.10.0 版本中的许多 bug 修复在 5.8.X 维护版本中已经出现过;它们在此不会重复,而是在名为 perl58[1-8]?delta 的 man 页面集合中记录。
特性 pragma 用于启用新的语法,这些语法会破坏 Perl 与旧版本语言的向后兼容性。它是一个词法 pragma,就像 strict 或 warnings 一样。
目前提供以下新功能:switch
(新增 switch 陳述式)、say
(新增 say
內建函式)和state
(新增 state
關鍵字,用於宣告「靜態」變數)。這些功能在本文件的各自章節中有描述。
當您要求版本大於或等於 5.9.5 的最小 Perl 版本(使用 use VERSION
構造)時,feature
命令也會被隱式加載。詳細內容請參閱feature。
-E 等同於 -e,但它隱式啟用所有可選功能(例如use feature ":5.10"
)。
實現了一個新的運算子//
(defined-or)。以下表達式
$a // $b
僅相當於
defined $a ? $a : $b
以及語句
$c //= $d;
現在可以使用
$c = $d unless defined $c;
//
運算子的優先順序和關聯性與||
相同。特別注意已採取特別謹慎的措施,確保此運算子符合您的意思,同時不會破壞舊代碼,但某些涉及空正則表達式的邊緣情況可能會解析不同。詳細內容請參閱perlop。
Perl 5 現在具有 switch 陳述式。當啟用 use feature 'switch'
時,它可用。此功能引入了三個新關鍵字:given
、when
和 default
given ($foo) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
對於 Perl 如何將 switch 變數與 when
條件匹配的更完整描述,請參閱perlsyn 中的「Switch statements」。
此類匹配稱為智能匹配,並且還可以在 switch 陳述式之外使用它,通過新的~~
運算子。詳細內容請參閱perlsyn 中的「Smart matching in detail」。
此功能由 Robin Houston 貢獻。
現在可以無需使用(??{})
構造來編寫遞歸模式。這種新方法更有效,並且在許多情況下更易讀。
現在每個捕獲括號都可以被視為可以使用(?PARNO)
語法(PARNO
代表「括號號碼」)進入的獨立模式。例如,以下模式將匹配嵌套的平衡角括號
/
^ # start of line
( # start capture buffer 1
< # match an opening angle bracket
(?: # match one of:
(?> # don't backtrack over the inside of this group
[^<>]+ # one or more non angle brackets
) # end non backtracking group
| # ... or ...
(?1) # recurse to bracket 1 and try it again
)* # 0 or more times.
> # match a closing angle bracket
) # end capture buffer one
$ # end of line
/x
PCRE 用戶應注意,Perl 的遞歸正則表達式功能允許回溯到遞歸模式,而在 PCRE 中,遞歸是原子的或「具有佔有性」的。就像上面的例子中,您可以添加(?>)
以選擇性地控制這一點。 (Yves Orton)
現在可以在模式中為捕獲括號命名,並通過名稱引用捕獲的內容。命名語法是 (?<NAME>....)
。可以使用 \k<NAME>
語法向命名緩衝區反向引用。在代碼中,新的神奇哈希 %+
和 %-
可用於訪問捕獲緩衝區的內容。
因此,要將所有重複的字符替換為單個副本,可以這樣寫
s/(?<letter>.)\k<letter>/$+{letter}/g
僅具有已定義內容的緩衝區將在 %+
哈希中“可見”,因此可以進行如下操作
foreach my $name (keys %+) {
print "content of buffer '$name' is $+{$name}\n";
}
%-
哈希稍微更完整,因為它將包含類似命名的所有捕獲緩衝區的值的數組引用,如果有多個的話。
%+
和 %-
作為綁定哈希實現,通過新模塊 Tie::Hash::NamedCapture
。
接觸過 .NET 正則表達式引擎的用戶將發現,perl 實現不同之處在於緩衝區的數字順序是連續的,而不是“未命名的首先,然後是命名的”。因此,在模式中
/(A)(?<B>B)(C)(?<D>D)/
$1 將是 'A',$2 將是 'B',$3 將是 'C',$4 將是 'D',而不是 $1 是 'A',$2 是 'C',$3 是 'B',$4 是 'D',這是 .NET 程序員期望的。這被認為是一個特性。 :-) (Yves Orton)
Perl 現在支持“佔有量詞”的語法,這是“原子匹配”模式的一部分。基本上,佔有量詞匹配盡可能多的內容,永遠不會回溯。因此,它可以用來控制回溯。語法類似於非貪婪匹配,但不是使用 '?' 作為修飾符,而是使用 '+'。因此,?+
、*+
、++
、{min,max}+
現在都是合法的量詞。 (Yves Orton)
正則表達式引擎現在支持一些特殊目的的回溯控制動詞:(*THEN)、(*PRUNE)、(*MARK)、(*SKIP)、(*COMMIT)、(*FAIL) 和 (*ACCEPT)。詳情請參見 perlre。 (Yves Orton)
一個新的語法 \g{N}
或 \gN
,其中 "N" 是十進制整數,允許一種更安全的反向引用表示法,同時也允許相對反向引用。這應該使得生成並嵌入包含反向引用的模式更容易。詳情請參見 perlre 中的“捕獲緩衝區”。 (Yves Orton)
\K
轉義Jeff Pinyan 的模塊 Regexp::Keep 的功能已添加到核心。在正則表達式中,您現在可以使用特殊轉義 \K
來執行類似浮動長度的正向後行查找。它在替換中也很有用,如
s/(foo)bar/$1/g
現在可以轉換為
s/foo\Kbar//g
更加高效率。(Yves Orton)
正則表達式現在識別 \v
和 \h
轉義符號,分別用於匹配垂直和水平空白。 \V
和 \H
分別匹配它們的補集。
\R
匹配通用的換行,即垂直空白,加上多字符序列 "\x0D\x0A"
。
正則表達式現在有一個新標誌 /p
。 使用此標誌使引擎保留匹配子串之前的部分的副本到新的特殊變量 ${^PREMATCH}
,將匹配子串之後的部分保留到 ${^POSTMATCH}
,將匹配的子串本身保留到 ${^MATCH}
。
Perl 仍然可以將這些子串存儲到特殊變量 $`
、$'
、$&
中,但在程序中任何地方使用這些變量都會對所有正則表達式匹配增加一個懲罰,而如果使用 /p
標誌和新的特殊變量,則只有在使用該標誌的正則表達式中才會產生費用。
say()
say() 是一個新的內建函數,在啟用 use feature 'say'
時才可用,它類似於 print(),但隱式地將換行附加到輸出的字符串。參見 perlfunc 中的 "say"。(Robin Houston)
$_
默認變量 $_
現在可以被詞法化,方法是像任何其他詞法變量一樣聲明它,只需簡單地
my $_;
默認在 $_
上的操作將在存在時使用詞法範圍版本的 $_
,而不是全局的 $_
。
在 map
或 grep
塊中,如果 $_
先前被 my'ed,那麼塊內的 $_
也是詞法的(並且作用域限定為該塊)。
在將 $_
詞法化的作用域中,您仍然可以通過使用 $::_
或更簡單地使用 our $_
覆蓋詞法聲明來訪問全局版本的 $_
。(Rafael Garcia-Suarez)
_
原型已新增一個新的原型字符。 _
等同於 $
,但如果沒有提供對應的參數,則默認為 $_
($
和 _
都表示一個標量)。由於參數是可選的,因此您只能在原型的末尾或分號之前使用它。
這將帶來一個小的不相容後果:原型()函數已調整為在適當的情況下對某些內置函數返回 _
(例如,prototype('CORE::rmdir')
)。 (Rafael Garcia-Suarez)
UNITCHECK
,除了 BEGIN
、CHECK
、INIT
和 END
外,還引入了一個新的特殊代碼塊。
CHECK
和 INIT
塊,雖然對於一些專用目的很有用,但始終在編譯和主程序執行之間的過渡時執行,因此當代碼在運行時加載時是無用的。 另一方面,UNITCHECK
塊在定義它們的單元編譯後立即執行。有關更多信息,請參見 perlmod。(Alex Gough)
mro
新增了一個新的 Pragma,mro
(用於方法解析順序)。它允許按類別基礎切換 perl 用於在多重繼承層次結構中查找繼承方法的算法。默認 MRO 未更改(DFS,深度優先搜索)。還有另一個 MRO 可用:C3 算法。有關更多信息,請參見 mro。(Brandon Black)
請注意,由於類層次結構搜索實現的更改,以前用於取消定義 *ISA
glob 的代碼很可能會中斷。 無論如何,取消定義 *ISA
會導致 @ISA 陣列上的魔術消失,本來就不應該這樣做。 此外,緩存 *::ISA::CACHE::
不再存在; 要強制重置 @ISA 緩存,現在需要使用 mro
API,或更簡單地將其賦值給 @ISA(例如,@ISA = @ISA
)。
在長檔名含有超出 ANSI 編碼頁面的字元時,readdir() 函式可能會返回「短檔名」。同樣地,Cwd::cwd() 可能會返回短目錄名,glob() 也可能返回短名稱。在 NTFS 檔案系統中,這些短名稱始終可以用 ANSI 編碼頁面表示。對於所有其他檔案系統驅動程式,這不一定成立;例如,FAT 檔案系統將短檔名存儲在 OEM 編碼頁面中,因此在 FAT 卷上的某些檔案仍然無法通過 ANSI API 存取。
同樣地,$^X、@INC 和 $ENV{PATH} 在啟動時會被預處理,以確保所有路徑在 ANSI 編碼頁面中有效(如果可能)。
Win32::GetLongPathName() 函式現在返回 UTF-8 編碼的正確長檔名,而不是使用替換字元將名稱強制轉換為 ANSI 編碼頁面。新的 Win32::GetANSIPathName() 函式可用於將長路徑名稱轉換為短路徑名稱,只有在長路徑無法在 ANSI 編碼頁面中表示時才能使用。
Win32 模組中的許多其他函式已經改進,以接受 UTF-8 編碼的參數。詳細請參閱Win32。
內建函式 readpipe() 現在可覆寫。覆寫它還允許覆寫其運算子對應物,qx//
(又名 ``
)。此外,如果沒有提供參數,它現在會默認為 $_
。(Rafael Garcia-Suarez)
如果沒有提供參數,readline() 現在默認為 *ARGV
。(Rafael Garcia-Suarez)
引入了一個新的變數類型。狀態變數類似於my
變數,但使用state
關鍵字而不是my
來聲明。它們只在其詞法範圍中可見,但其值是持久的:與my
變數不同,它們在作用域進入時不是未定義的,而是保留其先前的值。(Rafael Garcia-Suarez, Nicholas Clark)
要使用狀態變數,需要通過使用
use feature 'state';
或在一行命令中使用-E
命令行開關來啟用它們。請參閱"perlsub 中的持久私有變數"。
作為一種新的語法糖,現在可以堆疊檔案測試運算子了。您現在可以連續寫 -f -w -x $file
來表示 -x $file && -w _ && -f _
。參見 perlfunc 中的 "-X"。
UNIVERSAL 類別有一個新方法,名為 DOES()。它已被添加以解決 isa() 方法的語義問題。isa() 檢查繼承,而 DOES() 則被設計成在模組作者使用其他類別之間的關係時(除了繼承之外)被覆寫。(chromatic)
參見 UNIVERSAL 中的 "$obj->DOES( ROLE )"。
格式已經在幾個方面得到改進。一個新的字段,^*
,可用於變寬的、每次一行的文本。現在,圖片行中的空字符將被正確處理。一起使用 @#
和 ~~
現在將產生編譯時錯誤,因為這些格式字段是不相容的。perlform 已得到改進,並修復了各種錯誤。
有兩個新的字節順序修飾符,>
(大端)和 <
(小端),可以附加到大多數 pack() 和 unpack() 模板字符和組中,以強制對該類型或組使用特定的字節順序。有關詳細信息,請參見 perlfunc 中的 "pack" 和 perlpacktut。
no VERSION
現在可以使用 no
後跟版本號來指定您想使用比指定版本更舊的 perl 版本。
如果系統支持,現在 chdir、chmod 和 chown 也可以作用於檔案處理程序,而不僅僅是檔案名稱,這要歸功於 Gisle Aas 提供的一個補丁。
$(
和 $)
現在按照 OS 返回它們的順序返回群組,感謝 Gisle Aas。這在之前是不這樣的。
現在可以使用遞迴子例程來進行排序,這要歸功於 Robin Houston。
常量折疊例程現在被包裹在一個異常處理程序中,如果折疊引發異常(例如嘗試計算 0/0),perl 現在將保留當前的優化樹,而不是中止整個程序。沒有這個變化,如果程序具有生成異常的表達式,則即使這些表達式在運行時永遠不會被達到的代碼中,程序也不會編譯。(Nicholas Clark,Dave Mitchell)
通過在鉤子的文件處理打開並返回的文件處理之上添加來源過濾器,可以增強 @INC 中的子程序鉤子機制。這個功能早就計劃好了,但直到現在才真正開始運作。詳情請參閱 perlfunc 中的 "require"。(Nicholas Clark)
${^RE_DEBUG_FLAGS}
該變量控制著在運行時以 use re "debug"
模式下正則表達式引擎中的調試標誌。詳情請參閱 re。
${^CHILD_ERROR_NATIVE}
該變量提供了由最後一個管道關閉、反引號命令、成功調用 wait() 或 waitpid(),或系統操作符返回的本機狀態。詳情請參閱 perlvar。(Gisle Aas 貢獻)
${^RE_TRIE_MAXBUF}
請參閱 "文字串替換的 Trie 優化"。
${^WIN32_SLOPPY_STAT}
請參閱 "Windows 上的疏忽 stat"。
unpack()
現在默認解包 $_
變數。
mkdir()
現在默認使用 $_
。
內部轉儲輸出已經改進,因此非可打印字符如換行符和退格符以 \x
表示,而不是以八進制表示。
不能再在 #!
行上使用 -C 選項。它在那裡無法工作,因為標準流已經在 perl 解釋器執行的這一點上設置好了。您可以使用 binmode() 來獲得所需的行為。
Perl 5 中包含的 Unicode 字符數據庫副本已更新到版本 5.0.0。
MAD,即雜項屬性裝飾,是一個尚在開發中的工作,用於將 Perl 5 轉換為 Perl 6。要啟用它,需要將參數 -Dmad
傳遞給 Configure。獲得的 perl 與普通的 perl 5.10 不兼容,並且有空間和速度的懲罰;此外,並非所有回歸測試都能通過。(Larry Wall,Nicholas Clark)
在 Windows 平台上,kill(-9, $pid)
現在會終止一個進程樹。(在 Unix 上,這會向同一進程組中的所有進程發送信號。)
有關於 UTF-8 編碼數據的 pack() 和 unpack() 的語義已經更改。現在處理默認按字符而不是按字節進行底層編碼。值得注意的是,以前使用像 pack("a*", $string)
這樣的代碼來查看字符串的編碼的代碼現在將簡單地返回原始的 $string。在處理過程中,已打包的字符串也可以升級,當您存儲了升級的字符時。您可以通過使用 use bytes
來獲得舊的行為。
為了與 pack() 保持一致,在 unpack() 模板中,C0
表示數據應該按字符模式處理,即逐個字符處理;相反,在 unpack() 中,U0
表示 UTF-8 模式,其中打包的字符串以其 UTF-8 編碼的 Unicode 形式按字節逐字節處理。這與 perl 5.8.X 相反,但現在在 pack() 和 unpack() 之間保持一致。
此外,C0
和 U0
也可以在 pack() 模板中使用,分別指定字符和字節模式。
在 pack 或 unpack 格式中的 C0
和 U0
現在在指定的編碼模式下切換,並遵循括號分組。以前,括號是被忽略的。
另外,還有一個新的 pack() 字符格式,W
,旨在替換舊的 C
。保留了 C
,用於字符串內部表示編碼為字節的無符號字符。 W
表示無符號(邏輯)字符值,可以大於 255。因此,在處理潛在的 UTF-8 編碼數據時更加穩健(因為 C
將在範圍 0..255 之外的值進行包裝,並且不遵循字符串編碼)。
在實踐中,這意味着 pack 格式現在是編碼中性的,除了 C
。
為了保持一致性,在 unpack() 格式中的 A
現在會從字符串的末尾修剪所有 Unicode 空白。在 perl 5.9.2 之前,它只會剝離傳統的 ASCII 空格字符。
一個新的 unpack() 模板字符,"."
,返回到目前為止已讀取的字節或字符數(取決於所選擇的編碼模式,請參閱上文)。
$*
和$#
变量$*
已被弃用,改用/s
和/m
正则表达式修饰符,已被移除。
已移除弃用的$#
变量(数字输出格式)。
添加了两个新的严重警告:$#/$* 不再受支持
。
substr()的三参数形式返回的lvalues以前是原始字符串上的“固定长度窗口”。在某些情况下,这可能导致出乎意料的动作或其他未定义的行为。现在,窗口的长度会根据分配给它的字符串的长度自动调整。
-f _
现在,在文件测试运算符之后,标识符_
被强制为裸词。这解决了定义全局_
子例程时的一些解析问题。
:unique
:unique
属性现已成为无操作,因为其当前实现基本上有缺陷且不支持线程安全。
%^H
提示变量的编译时值现在可以传播到eval("")的代码中。这使得实现词法pragma更有用。
作为此次更改的副作用,常量的重载现在也会传播到eval("")中。
chdir()的裸词参数现在被识别为文件句柄。早期版本将裸词解释为目录名。(Gisle Aas)
perl的一个旧特性是,在require
或use
查找具有.pm扩展名的文件之前,它们会首先查找具有.pmc扩展名的类似文件名。如果找到此文件,则它将在任何可能存在的以.pm扩展名结尾的文件之前加载。
以前,只有在.pmc文件比匹配的.pm文件更新时,才会加载它们。从5.9.4开始,如果存在,则始终加载。
version
对象,而不是v-string現在仍然可以在printf中使用%vd
格式來使用^V,但任何字符級別的操作將會訪問version
對象的字符串表示形式,而不是v字符串的序數。像substr($^V, 0, 2)
或split //, $^V
等表達式不再有效,必須重新編寫。
特殊數組@-
和@+
不再在正則表達式中被插值。(佐藤泰之)
如果你通過一個被標記的名稱調用一個子程序,並且它延遲到一個AUTOLOAD函數,那麼$AUTOLOAD將會(正確地)被標記。(瑞克·德蘭尼)
當perl在標記模式下運行時,printf()
和sprintf()
將拒絕任何標記格式參數。(拉斐爾·加西亞-蘇亞雷斯)
通過undef $SIG{FOO}
來未定義或刪除一個信號處理程序,現在等同於將其設置為'DEFAULT'
。(拉斐爾·加西亞-蘇亞雷斯)
use strict 'refs'
在defined()的參數中忽略了取硬引用的操作,例如
use strict 'refs';
my $x = 'foo';
if (defined $$x) {...}
現在將正確產生運行時錯誤Can't use string as a SCALAR ref while "strict refs" in use
。
defined @$foo
和defined %$bar
現在也受到strict 'refs'
的約束(即,在那裡$foo
和$bar
必須是正確的引用。)(defined(@foo)
和defined(%bar)
是不鼓勵的構造。)(尼古拉斯·克拉克)
(?p{})
已被移除正則表達式結構(?p{})
在perl 5.8中被棄用,現已被移除。請改用(??{})
。(拉斐爾·加西亞-蘇亞雷斯)
Perl 5.9中已經移除了對偽哈希的支持。(fields
預編指令仍然存在,但使用了替代實現。)
perlcc
,字節碼加載程序和相關模塊(B::C,B::CC,B::Bytecode等)不再與perl源碼一起發布。這些實驗性工具從來沒有可靠地工作過,並且由於缺乏志願者來使它們與perl解釋器開發保持一致,決定將它們移除,而不是發布一個破壞版的它們。這些模塊的最後版本可以在perl 5.9.4中找到。
但是,B編譯器框架仍然在perl核心中得到支持,就像它允許的更有用的模塊一樣(包括B::Deparse和B::Concise等)。
從perl源代碼tarball中移除了JPL(Java-Perl Lingo)。
如果您修改任何套件的@ISA
,使其導致遞迴繼承,Perl現在將立即拋出異常。
以前,異常直到Perl嘗試使用遞迴繼承解析方法或執行$foo->isa($bar)
查找時才會發生。
5.10.x版本的行為偏向使用該模組的人; 5.8.x版本的行為偏向模組作者;
假設以下代碼
main calls Foo::Bar::baz()
Foo::Bar inherits from Foo::Base
Foo::Bar::baz() calls Foo::Base::_bazbaz()
Foo::Base::_bazbaz() calls: warnings::warnif('substr', 'some warning
message');
在5.8.x版本中,如果Foo::Bar包含use warnings;
,則代碼會發出警告。 Foo::Base或main是否啟用警告都無關緊要,要禁用警告,必須修改Foo::Bar。
在5.10.0及更新版本中,如果main包含use warnings;
,則代碼會發出警告。 Foo::Base或Foo::Bar是否啟用警告都無關緊要,要禁用警告,必須修改main。
更多核心模組現在也可以通過CPAN分別提供。 如果您想要更新其中一個模組,您不需要等待新的perl版本。 在cpan shell中,運行“r”命令將報告可升級的模組。 更多信息請參閱perldoc CPAN
。
feature
新的pragmafeature
用於啟用可能破壞舊代碼的新功能。 請參見上面的"feature pragma"。
mro
這個新的pragma使得可以改變解析繼承方法的算法。 請參見上面的"新的pragma,mro
"。
sort
pragma的作用範圍sort
pragma現在是詞法作用域的。 它的影響以前是全局的。
bignum
,bigint
,bigrat
的作用範圍三個數值pragmasbignum
,bigint
和bigrat
現在是詞法作用域的。(Tels)
base
base
pragma現在會警告如果一個類嘗試從自己繼承。(Curtis "Ovid" Poe)
strict
和warnings
strict
和warnings
現在會大聲抱怨如果它們通過錯誤的大小寫(例如use Strict;
)加載。(Johan Vromans)
version
版本 (version) 模組提供版本物件的支援。
warnings
警告 (warnings) pragma 不再載入 Carp。這意味著在編譯時未載入 Carp 而使用 Carp 例程的程式碼可能需要進行調整;通常,以下 (有錯誤的) 程式碼將不再運作,並需要在函數名稱後添加括號。
use warnings;
require Carp;
Carp::confess 'argh';
less
less
現在做些有用的事情(或至少試圖)。實際上,它已被轉換為詞法 pragma。因此,在您的模組中,您現在可以測試用戶是否要求使用更少的 CPU、更少的記憶體、更少的魔法,甚至可能是更少的脂肪。詳情請參閱 less。(Joshua ben Jore)
encoding::warnings
,由 Audrey Tang 所作,是一個模組,當含有高位元組的 ASCII 字符串被隱式轉換為 UTF-8 時,會發出警告。自 Perl 5.9.4 起,它是一個詞法 pragma;在舊版的 perl 上,它的影響是全局的。
Module::CoreList
,由 Richard Clamp 所作,是一個小巧方便的模組,告訴您任何版本的 Perl 5 附帶哪些版本的核心模組。它附帶一個命令行前端,corelist
。
Math::BigInt::FastCalc
是 Math::BigInt::Calc
的 XS 啟用版本,因此更快。
Compress::Zlib
是一個與 zlib 壓縮庫的介面。它附帶一個捆綁版本的 zlib,因此不需要安裝可運行的 zlib。它被 Archive::Tar
所使用(請參閱下文)。
IO::Zlib
是一個 IO::
風格的介面,用於 Compress::Zlib
。
Archive::Tar
是一個用於操作 tar
存檔的模組。
Digest::SHA
是一個用於計算多種類型 SHA 雜湊值的模組,已包含在 CPAN 模組中,用於 SHA 支持。
已新增 ExtUtils::CBuilder
和 ExtUtils::ParseXS
。
Hash::Util::FieldHash
,由 Anno Siegel 所作,已新增。此模組提供對 field hashes 的支援:以線程安全的垃圾回收方式維護參考與值的關聯。這樣的哈希對於實現內部對象很有用。
Module::Build
,由 Ken Williams 所作,已新增。它是一個替代 ExtUtils::MakeMaker
來建構和安裝 Perl 模組的方法。
Module::Load
,由 Jos Boumans 所作,已新增。它提供一個單一介面來加載 Perl 模組和 .pl 檔案。
Module::Loaded
,由Jos Boumans編寫,已添加。它用於標記模塊是否已加載或已卸載。
Package::Constants
,由Jos Boumans編寫,已添加。它是一個簡單的助手,用於列出給定包中聲明的所有常量。
Win32API::File
,由Tye McQueen編寫,已添加(用於Windows構建)。該模塊提供了對Win32系統API調用文件/目錄的低級訪問。
Locale::Maketext::Simple
,CPANPLUS所需的,是Locale::Maketext::Lexicon
的簡單包裝器。請注意,Locale::Maketext::Lexicon
未包含在perl核心中;當後者不存在時,Locale::Maketext::Simple
的行為會優雅地降級。
Params::Check
實現了一個通用的輸入解析/檢查機制。它被CPANPLUS使用。
Term::UI
簡化了在終端提示時提問的任務。
Object::Accessor
提供了一個接口,用於創建每個對象的訪問器。
Module::Pluggable
是一個簡單的框架,用於創建接受可插拔子模塊的模塊。
Module::Load::Conditional
提供了簡單的方法來查詢並可能加載已安裝的模塊。
Time::Piece
提供了一個面向對象的時間函數接口,重寫了內建的localtime()和gmtime()。
IPC::Cmd
幫助找到並運行外部命令,可能是交互式的。
File::Fetch
提供了一個簡單的通用文件提取機制。
Log::Message
和Log::Message::Simple
被CPANPLUS
的日誌設施使用。
Archive::Extract
是一個通用的存檔提取機制,適用於.tar(普通,gzipped或bzipped)或.zip文件。
CPANPLUS
提供了一個API和一個命令行工具,用於訪問CPAN鏡像。
Pod::Escapes
提供了在解碼Pod E<...>序列時有用的實用程序。
Pod::Simple
現在是Perl附帶的幾個與Pod相關的模塊的後端。
Attribute::Handlers
Attribute::Handlers
現在可以報告調用者的文件和行號。(David Feldman)
所有解釋性屬性現在都作為數組引用傳遞。(Damian Conway)
B::Lint
B::Lint
現在基於Module::Pluggable
,因此可以通過插件進行擴展。(Joshua ben Jore)
B
現在可以通過使用方法B::COP::hints_hash()訪問詞法指示(%^H
)。它返回一個B::RHE
對象,後者又可以通過方法B::RHE::HASH()獲取哈希引用。(Joshua ben Jore)
Thread
由於舊的5005thread線程模型已被刪除,改為使用ithreads方案,Thread
模塊現在是一個兼容性包裝器,僅用於舊代碼中。它已從默認的動態擴展列表中刪除。
Perl 調試器現在可以保存所有調試命令以供稍後引用;值得注意的是,它現在可以模擬向後步進,通過重新啟動並從保存的命令歷史中重新運行除最後一個命令之外的所有命令。
它還可以使用 i
命令顯示給定類的父繼承樹。
ptar
是一個純 Perl 實現的 tar
,附帶 Archive::Tar
。
ptardiff
是一個小型實用程序,用於生成 tar 存檔和目錄樹內容之間的差異。與 ptar
一樣,它附帶 Archive::Tar
。
shasum
是一個命令行實用程序,用於打印或檢查 SHA 摘要。它附帶新的 Digest::SHA
模塊。
corelist
實用程序現在與 perl 一起安裝(請參閱上面的 "新模塊")。
h2ph
和 h2xs
現在對於“現代”C代碼更加健壯。
h2xs
實現了一個新選項 --use-xsloader
,即使在向後兼容模塊中也強制使用 XSLoader
。
已修復了具有撇號的作者名稱的處理。
現在跳過任何具有負值的枚舉。
perlivp
現在不再默認檢查 *.ph 文件。使用新的 -a
選項運行 所有 測試。
find2perl
現在假設 -print
為默認操作。之前,需要明確指定它。
find2perl
中修復了幾個 bug,關於 -exec
和 -eval
。也添加了選項 -path
、-ipath
和 -iname
。
config_data
是一個新實用程序,附帶 Module::Build
。它提供了 Perl 模塊的配置的命令行界面,該模塊使用了 Module::Build 的可配置框架(即包含了其父模塊的本地配置信息的 *::ConfigData
模塊)。
cpanp
,CPANPLUS shell,已新增。(cpanp-run-perl
,用於 CPANPLUS 操作的輔助程式也已新增,但不建議直接使用)。
cpan2dist
是隨 CPANPLUS 附帶的新工具。它是從 CPAN 模組建立發行版(或套件)的工具。
pod2html
的輸出已通過 CSS 增強以更具可自訂性。同時修正了一些格式問題。(Jari Aalto)
perlpragma 手冊文件說明如何在純 Perl 中撰寫自己的詞法 pragma(這是從 5.9.4 開始可能的)。
新的 perlglossary 手冊文件是 Perl 文件中使用的術語詞彙表,由 O'Reilly Media, Inc. 提供。
perlreguts 手冊文件,由 Yves Orton 提供,描述了 Perl 正則表達式引擎的內部結構。
perlreapi 手冊文件描述了用於編寫可插入正則表達式引擎的 perl 解釋器的介面(由 Ævar Arnfjörð Bjarmason 提供)。
perlunitut 手冊文件是有關在 Perl 中進行 Unicode 和字串編碼編程的教程,由 Juerd Waalboer 提供。
新增的手冊頁面 perlunifaq(Perl Unicode FAQ),由 Juerd Waalboer 提供。
perlcommunity 手冊文件描述了互聯網上和現實生活中的 Perl 社區。(Edgar "Trizor" Bering)
CORE 手冊文件記錄了 CORE::
命名空間。(Tels)
長期存在的功能 /(?{...})/
正則表達式現在已經有文件記錄了其設置 $_
和 pos() 的功能。
對數組進行就地排序(@a = sort @a
)現已優化,避免了對數組的臨時副本的生成。
同樣地,reverse sort ...
現在優化為反向排序,避免了臨時中間列表的生成。
通過介於 0 和 255 之間的數值常數訪問詞法數組的元素現在更快了。(這在以前僅適用於全局數組。)
一些 perl 用於檢索 Unicode 屬性和轉換映射的純 Perl 代碼已重新在 XS 中實現。
現在,解釋器內部支援一種更有效率的內聯常數形式。將常數值的引用存儲在符號表中相當於一個完整的類型全局引用常數子程序,但使用的內存少約 400 字節。這個代理常數子程序在必要時會自動升級為真實的類型全局與子程序。採取的方法類似於現有的子程序存根聲明的空間優化,這些存根聲明以普通純量的形式存儲,而不是完整的類型全局。
核心模組中的一些已經轉換為使用此功能來存儲其系統相關常數 - 結果 use POSIX;
現在節省了約 200K 的內存。
PERL_DONT_CREATE_GVSV
新的編譯標誌 PERL_DONT_CREATE_GVSV
,在 perl 5.8.8 中作為一個選項引入,默認在 perl 5.9.3 中開啟。它阻止 perl 在每個新的類型全局中創建一個空純量。有關詳細信息,請參閱 perl589delta。
弱引用的創建現在是 O(1) 而不是 O(n),感謝 Nicholas Clark。弱引用的刪除仍然是 O(n),但如果刪除只在程序退出時發生,則可以完全跳過。
Salvador Fandiño 提供了改進,以減少 sort
的內存使用量並加快某些情況下的速度。
幾個內部數據結構(類型全局、GV、CV、格式)已經重組以使用更少的內存。(Nicholas Clark)
UTF-8 緩存代碼現在更加高效,並且更常用。(Nicholas Clark)
在 Windows 上,perl 的 stat() 函數通常打開文件以確定鏈接計數並更新可能通過硬鏈接更改的屬性。將 ${^WIN32_SLOPPY_STAT} 設置為真值可以通過不執行此操作來加速 stat()。 (Jan Dubois)
正則表達式引擎不再是遞歸的,這意味著以前可能會導致堆棧溢出的模式要麼會因有用的解釋而死亡,要麼會運行到完成,但由於它們以前能夠在之前導致堆棧溢出,所以可能需要很長的時間才能發生。如果您以前偶爾遇到堆棧溢出(或段錯誤),並升級後發現現在 perl 竟然卡住了,請尋找一個退化的正則表達式。(Dave Mitchell)
單個字符類現在與將字符用作文字時相同對待,這意味著使用字符類作為轉義機制的代碼將看到加速。(Yves Orton)
在可能的情況下,交替會被優化成更有效率的匹配結構。字串字面值的交替會被合併成一個trie,同時進行匹配。這意味著,在給定點匹配N個交替時,新的代碼的執行時間為O(1),而不是O(N)。一個新的特殊變量,${^RE_TRIE_MAXBUF},已被添加以微調這個優化。(Yves Orton)
註: 存在大量繞過perl歷史性能不佳的交替的代碼。通常,用於繞過的技巧將禁用新的優化。希望用於此目的的實用模塊能了解這些新的優化。
當一個模式以可轉換成trie的交替開始且沒有更好的優化可用時,正則表達式引擎將使用Aho-Corasick匹配來找到起始點。(Yves Orton)
-Dusesitecustomize
通過將-Dusesitecustomize
標誌傳遞給Configure,可以啟用對@INC的運行時定制。啟用後,這將使perl在執行任何其他操作之前運行$sitelibexp/sitecustomize.pl。然後可以設置此腳本以將額外的項目添加到@INC。
現在,Configure支持創建可重定位的perl樹。如果使用-Duserelocatableinc
配置,那麼@INC中的路徑(以及%Config中的所有其他內容)可以選擇性地通過perl執行文件的路徑來定位。
這意味著,如果在任何路徑的開頭找到字符串".../"
,則將其替換為$^X的目錄。因此,可以根據每個目錄設置重定位,儘管使用-Duserelocatableinc
的默認值是將所有內容重定位。初始安裝是在原始配置的前綴上完成的。
現在的配置過程可以檢測是否有可用的strlcat()和strlcpy()。當它們不可用時,將使用perl自己的版本(來自Russ Allbery的公共領域實現)。perl解釋器中的各處現在都在使用它們。(Steve Peters)
d_pseudofork
和 d_printf_format_null
新增了一個配置變數,可在 Config 模組中以 $Config{d_pseudofork}
的形式使用,用於區分在 Windows 平台上使用的偽 fork() 支持與真正的 fork() 支持。
新增了一個配置變數 d_printf_format_null
,用於查看是否允許類 printf 的格式為 NULL。
Configure -h
現在已擴展為包含最常用的選項。
平行構建現在應該可以正常工作,但如果指示使用 make test
進行平行運行,仍然可能存在問題。
在 Win32 上使用 Borland 編譯器應該可以更順利地進行構建。特別是 Steve Hay 已經努力避開了許多由其編譯器發出的警告,至少有一個 C 編譯器內部錯誤也已被解決。
現在在 Windows 上可以將 Perl 擴展靜態構建到 Perl DLL 中。
此外,現在可以在 Win32 上建立一個不依賴 Perl DLL 的 perl-static.exe
。詳情請參閱 Win32 makefiles。(Vadim Konovalov)
Perl 捆綁的所有 XS 模塊中的 ppport.h 文件現在都是在構建時自動生成的。(Marcus Holland-Moritz)
已經努力使 perl 和核心 XS 模塊能夠與各種 C++ 編譯器兼容(儘管在一些平台上的一些編譯器上情況並不完美)。
改進了使用 Microsoft 的 64 位編譯器構建 Perl 的支持。(ActiveState)
Perl 現在可以使用 Microsoft Visual C++ 2005(和 2008 Beta 2)進行編譯。
所有 win32 構建(MS-Win、WinCE)已合併並進行了清理。
隨 perl 捆綁的 CPAN 模組的 README 檔案和變更記錄不再安裝。
已報告 Perl 在 Symbian OS 上可運行。請參閱 perlsymbian 以獲取更多資訊。
針對使 Perl 在 z/OS 上正常運行進行了許多改進。
已報告 Perl 在 DragonFlyBSD 和 MidnightBSD 上可運行。
已報告 Perl 也可以在 NexentaOS ( http://www.gnusolaris.org/ ) 上運行。
VMS 端口已得到改進。請參閱 perlvms。
已添加對 Cray XT4 Catamount/Qk 的支援。更多資訊請參閱源代碼分佈中的 hints/catamount.sh。
已合併了 RedHat 和 Gentoo 的供應商補丁。
DynaLoader::dl_unload_file() 現在可以在 Windows 上運行。
strict
在正則表達式評估塊 (/(?{...})/
) 中未生效。
CORE::require() 和 CORE::do() 當被覆蓋時,始終被解析為 require() 和 do()。這現在已經修正。
您現在可以在列表切片後使用非箭頭形式的鏈式下標,就像
({foo => "bar"})[0]{foo}
這以前是一個語法錯誤;需要一個 ->
。
no warnings 'category'
現在與 -w 正確配合工作以前在全局啟用警告(通過 -w
)運行時,對特定警告類別的選擇性禁用實際上會關閉所有警告。這現在已經修正;現在 no warnings 'io';
將只關閉 io
類中的警告。以前它會錯誤地關閉所有警告。
修復了幾個 ithreads 中的內存泄漏。同時,ithreads 變得不那麼佔用內存。
threads
現在是一個雙生命模塊,也可在 CPAN 上獲得。它在許多方面進行了擴展。有一個用於線程信號的 kill() 方法。可以獲取線程狀態,或正在運行或可加入的線程列表。
使用新的 threads->exit()
方法來退出應用程式(這是主線程的默認行為)或僅退出當前線程(這是所有其他線程的默認行為)。另一方面,exit() 內建現在始終導致整個應用程式終止。(Jerry D. Hedden)
當對負值調用 chr() 時,現在會返回 \x{FFFD}
,即 Unicode 替換字符,除非啟用了 bytes
執行時期,此時將使用值的低八位。
在 Windows 上,現在會檢查 PERL5SHELL 環境變數是否為 tainted 屬性。(Rafael Garcia-Suarez)
stat()
和 -X
文件測試現在將 *FILE{IO} 文件處理器視為 *FILE 文件處理器。(Steve Peters)
現在當引用被重新 bless 到另一個類別時,重載將正常工作。內部實現上,將 "overloading" 標誌從引用移動到了被引用對象,這在邏輯上是它一直應該所在的地方。(Nicholas Clark)
已修復了與具有字符串重載的對象相關的一些 UTF-8 處理錯誤。(Nicholas Clark)
傳統上,eval 'syntax error'
會嚴重泄漏。現在已經消除或減少了許多(但不是全部)這些泄漏。(Dave Mitchell)
在先前的版本中,Perl 在初始化隨機數生成器時會讀取文件 /dev/urandom。在 Windows 上,該文件不太可能存在,即使存在,也可能不包含適當的數據,因此 Perl 不再在 Windows 上嘗試讀取它。(Alex Davies)
對於設置了 setuid 權限的腳本以及使用 -T 運行的腳本,PERLIO_DEBUG
環境變數將不再起作用。
此外,在啟用了線程的 Perl 中,使用 PERLIO_DEBUG
可能會導致內部緩衝溢出。這已經修復。
PerlIO::scalar 現在將阻止對唯讀純量進行寫入。此外,對於基於 PerlIO::scalar 的檔案處理器,現在支援 seek(),必要時底層字串將被填充為零。(Rafael, Jarkko Hietaniemi)
study() 對 UTF-8 字串從未正常工作,但可能導致錯誤結果。現在在 UTF-8 數據上是一個無操作。(Yves Orton)
訊號 SIGILL、SIGBUS 和 SIGSEGV 現在始終以「不安全」方式傳遞(與其他訊號相反,其他訊號會延遲到 Perl 解譯器達到相對穩定的狀態才傳遞;參見 perlipc 中的「延遲訊號(安全訊號)」)。(Rafael)
當透過 @INC-hook 載入模組或檔案時,並且當此 hook 在 %INC 中設置了檔案名稱條目時,將會相應地為此模組設置 __FILE__。(Rafael)
-t
選項修正現在可以在不混亂啟用的警告類別的情況下一起使用 -w
和 -t
選項。(Rafael)
對已設置了 :utf8
PerlIO 層的檔案處理器進行複製,現在將正確地保持該層在複製的檔案處理器上。(Rafael)
當本地化以變數作為鍵的散列表元素時,如果在 local() 生效期間更改了該變數(如 local $h{$x}; ++$x
),則本地化將無法正常工作。(Bo Lindbergh)
Perl 現在將嘗試告訴您未定義的變數的名稱(如果有)。
新增了一個已廢棄的警告,已廢棄在假條件中使用 my(),以警告不安全且已廢棄的結構的使用。
my $x if 0;
請參閱 perldiag。請改用 state
變數。
新增警告:!=~ 應該是 !~
,以防止這種錯誤拼寫的不匹配運算符。
警告 左對齊字串中的換行符號 已被移除。
錯誤 「-T」選項過晚 已重新表述為更具描述性。
這個警告現在在更一致的情況下被發出;簡單來說,當所涉及的宣告之一是 my
變數時。
my $x; my $x; # warns
my $x; our $x; # warns
our $x; my $x; # warns
另一方面,以下
our $x; our $x;
現在會產生一個 「our」變數%s 重宣告
警告。
當 dirhandle 被使用但已關閉或實際上並不是 dirhandle 時,現在會發出這些新警告。
已添加兩個棄用警告:(Rafael)
Opening dirhandle %s also as a file
Opening filehandle %s also as a directory
Perl 的命令行開關 -P
現已棄用。
Perl 將警告您可能會遇到的與 use VERSION
語法相關的後向兼容性問題。
perl -V
有幾個改進,使它更適合從 shell 腳本中獲取配置變數的值。詳細資訊請參閱 perlrun。
一般而言,perl 的原始碼已在許多地方進行了重構、整理和優化。此外,內存管理和分配在幾個地方得到了改善。
當使用 gcc 編譯 perl 核心時,將打開盡可能多的 gcc 警告標誌,這在平台上是可能的。(這種對清潔的追求不適用於 XS 代碼,因為我們無法保證我們沒有編寫的代碼的整潔程度。)對於其他各種 C 編譯器,已添加或加緊了類似的嚴格標誌。
定義各種SV
類型的常數的相對順序已經更改; 特別是,SVt_PVGV
已被移動到SVt_PVLV
之前,SVt_PVAV
,SVt_PVHV
和SVt_PVCV
之前。這不太可能造成任何影響,除非您的代碼明確地對該排序進行了假設。(對象B::*
的繼承層級已經改變以反映這一點。)
與此相關,內部類型SVt_PVBM
已被移除。這種專用的SV
類型被index
運算符和正則表達式引擎的部分部分使用,以便實現快速的Boyer-Moore匹配。它在內部的使用已被SV
類型的SVt_PVGV
取代。
已添加新類型SVt_BIND
,以準備實現Perl 6在5上的項目。目前尚無實現,因此無法創建或銷毀。
C預處理器符號PERL_PM_APIVERSION
和PERL_XS_APIVERSION
,它們應該提供與當前perl二進制兼容(或源兼容)的最老版本的版本號,但沒有使用,有時具有誤導性的值。它們已被刪除。
BASEOP
結構現在使用的空間更少。 op_seq
字段已被刪除,並由單位比特位字段op_opt
替換。 op_type
現在長度為9位。 (因此,B::OP
類不再提供seq
方法。)
perl的解析器現在由bison生成(以前是由byacc生成的)。因此,它似乎更加健壯。
此外,Dave Mitchell改進了在-DT
下的lexer調試輸出。
const
Andy Lester提供了許多改進,以確定哪些函數參數和局部變量實際上可以聲明為const
給C編譯器。Steve Peters提供了新的*_set
宏並重新構建了核心以使用這些宏而不是在LVALUE上下文中賦值給宏。
已添加一個新文件,mathoms.c。它包含不再在perl核心中使用但出於二進制或源代碼兼容性原因仍然可用的函數。但是,如果您在編譯器標誌中添加-DNO_MATHOMS
,則不會編譯這些函數。
AvFLAGS
已刪除 AvFLAGS
巨集。
av_*
變更av_*()
函式,用於操作陣列,不再接受空的 AV*
參數。
特殊變數 $^H 和 %^H 的實作已更改,以允許在純 Perl 中實作詞法 pragma。
B::
模組的繼承層次已更改;B::NV
現在繼承自 B::SV
(曾繼承自 B::IV
)。
匿名哈希和陣列建構子現在在 optree 中只需 1 個操作,而不再需要 3 個,現在當操作被標記為 OPf_SPECIAL 時,pp_anonhash 和 pp_anonlist 會返回對哈希/陣列的參考。 (Nicholas Clark)
在語法 /(?{...})/
區塊中,對於語法 $_
的實作仍然存在問題。 (參見 t/op/mydef.t 中的 TODO 測試。)
當生效時,堆疊的檔案測試運算子將無法正常工作,因為它們依賴於 stat() 緩衝區 _
被填充,而檔案測試會繞過 stat()。
Unicode 的處理在幾個地方仍然不清潔,它取決於字串內部是否被標記為 UTF-8。 這將在 perl 5.12 中更加一致,但這是不可避免的,且會帶來一定程度的向後不兼容性。
在 Linux 上使用 g++ 和線程支援編譯時,報告指出 $!
停止正確運作。 這與 glibc 提供了兩個 strerror_r(3) 實作有關,而 perl 選擇了錯誤的實作。
如果您發現您認為是一個錯誤,您可能會查看最近在 comp.lang.perl.misc 新聞群組和位於 http://rt.perl.org/rt3/ 的 perl bug 數據庫中發表的文章。在 http://www.perl.org/,Perl 官方網站上也可能有相關資訊。
如果您認為您有一個未報告的錯誤,請運行您版本中包含的 perlbug 程式。請務必將您的錯誤縮小為一個小而足夠的測試案例。您的錯誤報告將與 perl -V
的輸出一起發送到 perlbug@perl.org 以供 Perl 移植團隊分析。
請參閱 Changes 檔案和 perl590delta 到 perl595delta 手冊頁以獲取詳盡的更改細節。
請參閱 INSTALL 檔案以了解如何建構 Perl。
請參閱 README 檔案以獲取一般信息。
請參閱 Artistic 和 Copying 檔案以獲取版權信息。