unpack TEMPLATE,EXPR
unpack TEMPLATE

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);

應謹慎使用 pP 格式。由於 Perl 無法檢查傳遞給 unpack 的值是否對應到有效的記憶體位置,傳遞一個未知是否有效的指標值可能會導致災難性的後果。

如果有多個封包碼或欄位或群組的重複計數大於輸入字串剩餘量時,結果並未明確定義:重複計數可能會減少,或 unpack 可能會產生空字串或零,或可能會引發例外。如果輸入字串比 TEMPLATE 所描述的字串長,該輸入字串的剩餘部分將被忽略。

請參閱 pack 以取得更多範例和注意事項。