unpack
執行 pack
的相反動作:它會將字串展開成一個值清單。(在純量語境中,它只會傳回產生的第一個值。)
如果省略 EXPR,會解開 $_
字串。請參閱 perlpacktut 以了解此函式的簡介。
字串會被拆解成由 TEMPLATE 描述的區塊。每個區塊會分別轉換成一個值。通常,字串會是 pack
的結果,或字串的字元會代表某種 C 結構。
TEMPLATE 的格式與 pack
函式中的格式相同。以下是執行子字串的子程式
sub substr {
my ($what, $where, $howmuch) = @_;
unpack("x$where a$howmuch", $what);
}
然後是
sub ordinal { unpack("W",$_[0]); } # same as ord()
除了 pack
中允許的欄位之外,您可以在欄位前面加上 %<number>,以表示您想要 <number> 位元組的項目檢查碼,而不是項目本身。預設是 16 位元組的檢查碼。檢查碼是透過加總展開值的數字值來計算的(對於字串欄位,會加總 ord($char)
;對於位元欄位,會加總 0 和 1)。
例如,下列程式會計算出與 System V sum 程式相同的數字
my $checksum = do {
local $/; # slurp!
unpack("%32W*", readline) % 65535;
};
下列程式會有效率地計算位元向量中設定的位元數
my $setbits = unpack("%32b*", $selectmask);
應謹慎使用 p
和 P
格式。由於 Perl 無法檢查傳遞給 unpack
的值是否對應到有效的記憶體位置,傳遞一個未知是否有效的指標值可能會導致災難性的後果。
如果有多個封包碼或欄位或群組的重複計數大於輸入字串剩餘量時,結果並未明確定義:重複計數可能會減少,或 unpack
可能會產生空字串或零,或可能會引發例外。如果輸入字串比 TEMPLATE 所描述的字串長,該輸入字串的剩餘部分將被忽略。
請參閱 pack
以取得更多範例和注意事項。