2014-01-15 22 views
0

我從模塊中導出了一些常量。在我的劇本我加載使用魔::裝載機Mojolicious Export不適用於Mojo :: Loader

我模塊

use constant FALSE  => 0; 
use constant TRUE   => 1; 

our @EXPORT = qw(FALSE TRUE); 

在我的劇本我的模塊。

Mojo::Loader->new->load($my_module_name); 

我能夠用我的模塊在我的劇本,但我導出的常量都不在我的腳本訪問。如果我加載我的模塊與使用條款。我能夠使用導出的常量。

任何想法如何解決這個問題,並將常量導入到我的腳本。

謝謝!

+1

請在導出常量的地方添加模塊代碼的相關部分。 – simbabque

+0

@simbabque檢查更新後的問題 – PMat

+0

您有使用Mojo模塊的原因嗎? – simbabque

回答

1

我看了一下Mojo :: Loader的代碼,結果證明它不能導入東西。它僅執行require(在字符串評估中),而不是use。快速的源代碼顯示沒有任何import,所以您需要自己撥打Your::Module->import

Here's a link的源代碼和報價的相關部分:

sub load { 
    my ($self, $module) = @_; 

    # Check module name 
    return 1 if !$module || $module !~ /^\w(?:[\w:']*\w)?$/; 

    # Load 
    return undef if $module->can('new') || eval "require $module; 1"; 

    # Exists 
    return 1 if [email protected] =~ /^Can't locate \[email protected]{[class_to_path $module]}\E in \@INC/; 

    # Real error 
    return Mojo::Exception->new([email protected]); 
} 

有這裏發生了一些有趣的事情。如果您的文件爲use foo,則導入使用常量。

use foo; 
print 'True: ', TRUE; 

但是:

require foo; 
foo->import; 
print 'True: ', TRUE; 

這將產生一個警告Bareword "TRUE" not allowed while "strict subs" in use。所以我們把TRUE()看起來不像是一個空話。畢竟,常數是一個子。現在它會工作。 Mojo::Loader->load('foo')也是如此。

如果您在requireimport周圍包圍BEGIN塊,則可以省略括號。

因此,如果你想導出常量,如果你想繼續使用Mojo :: Loader,可以將括號加到你稱之爲的地方。

+0

我也試過做my_module-> import();但它沒有幫助。仍然常量不可訪問 – PMat

+0

'load'之後? – simbabque

+0

是的,我在加載後確實導入了 – PMat