VMS::DCLsym - Perl 擴充套件用於操作 DCL 符號
tie %allsyms, VMS::DCLsym;
tie %cgisyms, VMS::DCLsym, 'GLOBAL';
$handle = new VMS::DCLsym;
$value = $handle->getsym($name);
$handle->setsym($name, $value, 'GLOBAL')
or die "Can't create symbol: $!\n";
$handle->delsym($name, 'LOCAL') or die "Can't delete symbol: $!\n";
$handle->clearcache();
VMS::DCLsym 擴充套件提供使用綁定雜湊介面存取 DCL 符號。這允許 Perl 腳本以類似於透過內建 %ENV
雜湊操作邏輯名稱的方式操作符號。或者,您可以在此套件中直接呼叫方法來讀取、建立和刪除符號。
這個介面讓你可以將 DCL 符號表視為 Perl 關聯式陣列,其中每個元素的鍵是符號名稱,而元素的值是該符號的值。鍵字串中的大小寫並不重要,因為 DCL 會將符號名稱轉換為大寫,但值字串中的大小寫很重要。支援關聯式陣列的所有一般操作。讀取元素會擷取符號的目前值,指定給它會定義新的符號(或覆寫現有符號的舊值),而刪除元素會刪除對應的符號。將元素設定為 undef
,或直接將它 undef
,會將對應的符號設定為空字串。你也可以讀取特殊鍵「:GLOBAL」和「:LOCAL」以找出是否已為這個 hash 指定預設符號表(請參閱下一段),或設定這些鍵來指定預設符號表。
當你呼叫 tie
函式將關聯式陣列繫結到這個套件時,你可以指定一個選用引數,也就是你希望在其中建立和刪除符號的符號表。如果引數是字串「GLOBAL」,則會使用全域符號表;任何其他字串都會導致使用本機符號表。請注意,這個引數不會影響讀取符號的嘗試;如果具有指定名稱的符號存在於本機符號表中,它總是會優先於全域符號表中具有相同名稱的符號而傳回。
雖然在某些方面不如繫結 hash 介面方便,但你也可以直接呼叫方法來操作個別符號。在某些情況下,這會讓你比使用繫結 hash 集合有更精細的控制。支援下列方法
這會建立一個 VMS::DCLsym
物件,可用作稍後方法呼叫的控制代碼。單一選用引數會指定在未來的預設方法呼叫中使用的符號表,方式與上面所述的 tie
選用引數相同。
如果在純量內容中呼叫,getsym
會傳回名稱作為呼叫引數提供的符號的值,或如果沒有這樣的符號,則傳回 undef
。本機符號表中的符號總是優先於全域符號表中的符號。如果在清單內容中呼叫,getsym
會傳回一個二元素清單,其第一個元素是符號的值,而第二個元素是字串「GLOBAL」或「LOCAL」,表示讀取符號值的表格。
此方法所採取的前兩個參數是符號名稱和應指派給它的值。第三個參數(選用)是一個指定要使用的符號表的字串;「GLOBAL」指定全域符號表,而任何其他字串指定區域符號表。如果省略此參數,則會使用物件的預設符號表。setsym
會在成功時傳回 TRUE,否則傳回 FALSE。
此方法會刪除名稱作為第一個參數給出的符號。第二個參數(選用)指定符號表,如上文 setsym
所述。如果成功刪除符號,則傳回 TRUE;如果未刪除,則傳回 FALSE。
由於取得已定義符號清單以供連結雜湊反覆運算器使用時會產生額外負擔,因此只會執行一次,而清單會重複用於後續反覆運算。透過此套件所做的符號變更會記錄下來,但在罕見的情況下,如果有人從外部變更程序的符號表(使用網路上的一些軟體時有可能),則反覆運算器將與符號表不同步。如果您預期會發生這種情況,您可以透過呼叫此方法來重設快取。此外,如果您將 FALSE 值傳遞為第一個參數,則會停用快取。稍後可以透過將 TRUE 值作為第一個參數再次呼叫 clearcache
來重新啟用快取。它會傳回 TRUE 或 FALSE,分別表示快取先前是否已啟用或停用。
此方法是一個權宜之計,直到我們可以將程式碼納入此擴充功能以直接遍歷程序的符號表為止,因此它可能會在這個套件的未來版本中消失。
Charles Bailey bailey@newman.upenn.edu
1.09
反覆運算器的符號清單是透過產生子程序來組裝的,這可能會很慢。理想情況下,我們應該直接從 C 遍歷程序的符號表。