2013-04-17 66 views
-1

我有兩個文件,下面的文件是 「Packages_module.pl」,混亂在perl軟件包

use pack_modules; 
$var = 1; 
print "var is $var\n"; 
&pack_module::check_scope($var); 
print "var is $var\n"; 

第二個文件是 「pack_modules.pm」,代碼是下面

package pack_module; 
use Exporter; 
@ISA = qw/Exporter/; 
@EXPORT = qw/$var/; 
our ($var); 
sub check_scope 
{ 
    $var = 3; 
} 
1; 

當我運行pack_modules.pm我得到了以下結果。

var is 1 
    ========== 
    Using Module Subroutine: 
    var is 1 
    ========== 

第一次,很明顯,「$ VAR」將是1,但它再給予1而不是3,第二次可以在任何一個可以告訴我爲什麼「pack_module」的價值是不可見在「Packages_module」中。

+2

你沒有出口'$ var',但'$ var2'。你也可以看看'$ pack_module :: var'來測試你的假設。 「check_scope」的參數被忽略。 (哦,請不要寫小寫模塊,或者用'&調用subs。) – amon

+0

@amon我錯誤地給了$ var2 $ var。無論如何,我已經編輯它,但仍然是給出相同的輸出。 –

回答

1

主要問題:

你是不是出口$var,但$var2。如果您導出$var,則價值會發生變化。

而且,你用pack_moudles,但包被命名爲pack_module

但是還有一些小問題:你用一個參數調用check_scope,但你永遠不會在子程序的主體中檢索參數。相反,您可以更改全局變量$var的值。

+0

我錯誤地給了$ var2 $ var。無論如何,我已經編輯它,但仍然是給出相同的輸出。 –

+0

'pack_module'與'pack_modules'不一樣。 – choroba

1

use pack_modules相當於BEGIN { require pack_modules; pack_modules->import; }

由於您的模塊文件被命名爲pack_modules.pm,該require步工作得很好。

然後它調用pack_modules->import它什麼都不做,因爲該文件包含一個名爲pack_module的包。不要緊,什麼pack_module(沒有最後的「s」)出口,如果你的主程序從pack_modules導入符號(有一個「S」)。

將模塊文件中的第一行更改爲package pack_modules;,將主程序中的子呼叫改爲pack_modules::check_scope($var);,它應該可以工作。 (作爲一個方面說明,做到用戶自定義函數沒有前綴的調用與&,這是在Perl 4緩繳這是不是在Perl 5必要的,有副作用,你可能不打算調用。)

順便說一句,如果您有相關use strict;開始你的程序,它會給予你一些額外的線索,這個問題的原因,通過抱怨Global symbol "$var" requires explicit package name在你的主程序。