pragmas,如autodie
,根據文檔,在詞彙範圍內。詞彙範圍pragmas
{
use autodie;
..
..
}
# Can die here
這是否適用於裝有use
所有模塊? 據我所知,採用的是幾乎是一樣的:
BEGIN {
require autodie;
autodie->import(LIST);
}
BEGIN發生在編譯時,要求不詞法範圍,所以怎麼來了,是autodie
知道關於它的範圍是什麼?
感謝,
pragmas,如autodie
,根據文檔,在詞彙範圍內。詞彙範圍pragmas
{
use autodie;
..
..
}
# Can die here
這是否適用於裝有use
所有模塊? 據我所知,採用的是幾乎是一樣的:
BEGIN {
require autodie;
autodie->import(LIST);
}
BEGIN發生在編譯時,要求不詞法範圍,所以怎麼來了,是autodie
知道關於它的範圍是什麼?
感謝,
簡短的回答是,詞法範圍的pragmatic modules被明確寫入的行爲是那樣,用神奇的內部變量$^H
和%^H
在編譯時啓用和禁用功能。
編譯器通過隱式地定位這些變量來發揮作用,以便在編譯代碼塊結束時恢復它們的值,使其與開始時的代碼塊相同。這樣就提供了詞彙語義的基礎。
最初只有$^H
變量可用。它包含一個位掩碼,指示在編譯期間的任何時間哪些編譯器選項可用。因爲這樣,唯一可以編寫的詞彙雜記就是那些操縱$^H
中定義的魔法位的集合。
後來引入了%^H
散列,現在任何編譯指示現在都可以在該散列中存儲值,其中的值以該編譯指示的名稱開頭。由於編譯器以與標量相同的方式定位哈希,所以任何編譯指示都可以在此自動存儲作用域狀態信息。
autodie
模塊不會操縱這些變量中的任何一個,而是將所有艱難工作的Fatal
模塊子類化。它使用%^H
來跟蹤哪些運算符已致命,並依靠編譯器在塊的末尾丟棄此信息。
提perlpragma會很好 – ysth 2012-07-30 00:38:51
從Fatal.pm
導入方法這是autodie
後端,享受這樣的:
# Dark magic to have autodie work under 5.8
# Copied from namespace::clean, that copied it from
# autobox, that found it on an ancient scroll written
# in blood.
# This magic bit causes %^H to be lexically scoped.
$^H |= 0x020000;
所以答案是,真的有一種方法,使您的進口意識到自己的詞法範圍,但它深深地與perl的內核糾纏在一起,並不適合普通程序員使用。
這不是require
這很有趣;這是編譯器在import
中的作用。
大部分(全部?)編譯指示使用$^H
或%^H
。解析器將它們定位到被解析的範圍,這意味着它將它們恢復到它們之前的值
以strict爲例。它的import
修改$^H
。 $^H
包含一系列指示編譯器如何表現的標誌。
$ perl -e'
BEGIN { printf "%04X\n", $^H }
{
use strict;
BEGIN { printf "%04X\n", $^H }
}
BEGIN { printf "%04X\n", $^H }
'
0100
0702
0100
$^H
保留給Perl的用法,但類似的本地化%^H
是用於一般用途。例如,當feature::qw_comment通過require
載入解析器時會掛鉤一次,但除非$^H{'feature::qw_comments::'}
爲真,否則不執行任何操作。它的進口量相當於
sub import { $^H{'feature::qw_comments::'} = 1; }
有沒有你想做的事情?或者這純粹是出於好奇? – ikegami 2012-07-30 19:48:26