符號 - 處理 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_ref
與 Symbol::qualify
相同,但它傳回 glob 參考而非符號名稱,因此即使啟用 use strict 'refs'
,您仍可使用結果。
Symbol::delete_package
會清除整個套件命名空間。請注意,此常式預設不會匯出,您可能需要明確匯出它。
Symbol::delete_package
有點太強大了。它會取消定義存在於指定套件中的每個符號。由於 Perl 為了效能考量,並未在每次呼叫函數或存取全域變數時執行符號表查詢,因此某些已載入且使用套件 Foo
中符號的程式碼,可能會在您刪除 Foo
之後停止運作,即使您之後重新載入 Foo
模組也是如此。