目錄

名稱

符號 - 處理 Perl 符號及其名稱

語法

use Symbol;

$sym = gensym;
open($sym, '<', "filename");
$_ = <$sym>;
# etc.

ungensym $sym;      # no effect

# replace *FOO{IO} handle but not $FOO, %FOO, etc.
*FOO = geniosym;

print qualify("x"), "\n";              # "main::x"
print qualify("x", "FOO"), "\n";       # "FOO::x"
print qualify("BAR::x"), "\n";         # "BAR::x"
print qualify("BAR::x", "FOO"), "\n";  # "BAR::x"
print qualify("STDOUT", "FOO"), "\n";  # "main::STDOUT" (global)
print qualify(\*x), "\n";              # returns \*x
print qualify(\*x, "FOO"), "\n";       # returns \*x

use strict refs;
print { qualify_to_ref $fh } "foo!\n";
$ref = qualify_to_ref $name, $pkg;

use Symbol qw(delete_package);
delete_package('Foo::Bar');
print "deleted\n" unless exists $Foo::{'Bar::'};

說明

Symbol::gensym 會建立一個匿名 glob 並傳回其參考。此類 glob 參考可用作檔案或目錄句柄。

為了與不支援匿名 glob 的舊實作維持相容性,Symbol::ungensym 也已提供。但它並未執行任何動作。

Symbol::geniosym 會建立一個匿名 IO 句柄。這可指定至現有 glob,而不會影響 glob 的非 IO 部分。

Symbol::qualify 會將非限定符號名稱轉換為限定變數名稱(例如「myvar」->「MyPackage::myvar」)。如果提供第二個參數,qualify 會將其用作預設套件;否則,它會使用呼叫者的套件。無論如何,全域變數名稱(例如「STDOUT」、「ENV」、「SIG」)總是會以「main::」限定。

限定僅適用於符號名稱(字串)。假設為 glob 參考(其本質上已限定),因此參考不會變更。

Symbol::qualify_to_refSymbol::qualify 相同,但它傳回 glob 參考而非符號名稱,因此即使啟用 use strict 'refs',您仍可使用結果。

Symbol::delete_package 會清除整個套件命名空間。請注意,此常式預設不會匯出,您可能需要明確匯出它。

錯誤

Symbol::delete_package 有點太強大了。它會取消定義存在於指定套件中的每個符號。由於 Perl 為了效能考量,並未在每次呼叫函數或存取全域變數時執行符號表查詢,因此某些已載入且使用套件 Foo 中符號的程式碼,可能會在您刪除 Foo 之後停止運作,即使您之後重新載入 Foo 模組也是如此。