0
package A;
$ENV{MOJO_USERAGENT_DEBUG} =1;
use Test::Mojo;
use utf8;

....
;
1;
package B;
BEGIN{ $ENV{MOJO_USERAGENT_DEBUG =1 } };
use Test::Mojo;
use utf8;
...
;
1;

Test::MojoパッケージはモジュールをインポートしますMojo::UserAgent:

package Test::Mojo;
...
use Mojo::UserAgent;
...
1;

パッケージ A のコードがデバッグを開くことができない理由。しかし、パッケージBはでき​​ますか?

4

2 に答える 2

3

Test::Mojo はロード時に変数をチェックするため、その前に環境を設定する必要があります。

于 2013-03-17T09:59:13.260 に答える
2
#!/usr/bin/env perl
# vim:set shiftwidth=4 tabstop=4 expandtab ai smartindent fileformat=unix fileencoding=utf-8 syntax=perl:
# http://perldoc.perl.org/perlmod.html#BEGIN,-UNITCHECK,-CHECK,-INIT-and-END
package init;
            { print "10. Ordinary code runs at runtime.\n"; }
END         { print "16. So this is the end of the tale.\n" }
INIT        { print " 7. INIT blocks run FIFO just before runtime.\n" }
UNITCHECK   { print " 4. And therefore before any CHECK blocks.\n" }
CHECK       { print " 6. So this is the sixth line.\n" }
            { print "11. It runs in order, of course.\n"; }
BEGIN       { print " 1. BEGIN blocks run FIFO during compilation.\n" }
END         { print "15. Read perlmod for the rest of the story.\n" }
CHECK       { print " 5. CHECK blocks run LIFO after all compilation.\n" }
INIT        { print " 8. Run this again, using Perl's -c switch.\n" }
            { print "12. This is anti-obfuscated code.\n"; }
END         { print "14. END blocks run LIFO at quitting time.\n" }
BEGIN       { print " 2. So this line comes out second.\n" }
UNITCHECK   { print " 3. UNITCHECK blocks run LIFO after each file is compiled.\n" }
INIT        { print " 9. You'll see the difference right away.\n" }
            { print "13. It merely _looks_ like it should be confusing.\n"; }
sub import {
    print "IMPORT\n";
}
1;

それはそれをかなり明確にするはずです;-)。

言い換えると、BEGINブロックと「use」ステートメントは、同じコンパイルステップで発生順に評価されます。2つの例では、BEGINと「use」が入れ替わっているため、Aでは「useTest::Mojo」の後にBEGINブロックが実行されます。私の推測では、Test::Mojoはコンパイル時にenvvarを評価します。実行時に評価する場合は、機能するはずです。

詳細は?ここを参照してください

于 2013-03-17T19:46:09.820 に答える