2011-06-24 80 views
0

我完全是Perl/Fastcgi的新手。包括pm文件中的文件

我有一些pm模塊需要添加很多腳本,隨着時間的推移它會增長和增長。因此,我需要一個使管理員更容易的結構。

所以,我想創建文件在我可以包括的某種目錄結構。我希望我包含的文件可以像文件寫入包含文件的文件一樣。

我試過'做','使用'和'要求'。我想包含的實際文件位於Perl正在查找的其中一個目錄中。(使用perl -V進行驗證)

我嘗試過BEGIN {}內外的操作。

我該怎麼做?在pm文件中是否可以包含pm文件?它是否必須是我包含的pm文件,或者它可以是任何擴展名嗎?

我已經嘗試了幾種方法,下面是我最後一次嘗試。

Config.pm

package Kernel::Config; 

sub Load { 

#other activities 

require 'severalnines.pm'; 

#other activities 

} 
1; 

severalnines.pm

# Filter Queues 

$Self->{TicketAcl}->{'ACL-hide-queues'} = { 
       Properties => { 
}, 
       PossibleNot => {Ticket => { Queue => 
        ['[RegExp]^*'] }, 

    }, 
}; 
1; 

我不是在Apache的error_log中與此相關的得到任何錯誤。儘管如此,如果我把它放在Config.pm文件中,代碼也不會被識別。

我不打算開始編程很多,只是在第三方應用程序中做一些管理。儘管如此,我還是四處搜尋,試圖瞭解它如何與包含文件一起工作。是否將onesnines.pm視爲perl模塊,是否需要使用像h2xs或類似的程序才能「創建」模塊(告訴您,完全新手......)?

在此先感謝!

+1

你試過'require'/ full/path/to/file.foo''?你確定所有這些腳本都返回了一個真正的值(通常通過在文件底部加一個'1;'來完成)。另外,它是Perl,而不是Pearl。你有沒有試過檢查Apache的錯誤日誌?失敗的'require'會導致發送錯誤的過程崩潰到stderr。 – unpythonic

+0

謝謝!我確實加了1;因爲我沒有那個。該文件可以找到,但代碼沒有使用,我認爲。請使用代碼查看我更新的帖子。 – Nicsoft

+0

如果我做了你的任何建議,我仍然需要編寫代碼才能使用我包含的任何內容。我的觀點是不需要在Config.pm文件中做任何其他事情,而不需要做某些事情。我需要查看服務器端包括嗎? – Nicsoft

回答

0
if ( 'I want the files that I include will be exactly like if the text were written in the file where I do the include.' 
    && 'have to add a lot of scripts and over time it will grow and grow') { 
    warn 'This is probably a bad idea because you are not creating any kind of abstraction!'; 
} 

看看Exporter,恐怕也會給你一個很好的解決方案!

3

我通常創建自己的模塊前綴 - 以項目或工作地點命名。例如,您可以將所有模塊都放在Mu下面,模塊名爲Mu::FooMu::Bar。使用多個模塊(不要試圖將所有內容都保存在一個文件中),並用*.pm後綴命名模塊。

然後,如果Mu目錄是在相同的目錄中的程序,你只需要做到這一點:

use Mu::Foo; 
use Mu::Bar; 

如果他們在其他目錄,你可以這樣做:

use lib qw(/path/to/other/directory); 
use Mu::Foo; 
use Mu::Bar; 

是否有可能在pm文件中包含pm文件?

爲什麼肯定是的。

所以,我想創建文件在我可以包括的某種目錄結構。我希望我包含的文件是,如果文本是在包含的文件中寫入的。

這是一個糟糕的主意。你最好使用包裝機制。也就是說,將每個模塊聲明爲獨立的軟件包名稱。否則,你的模塊將會有一個變量或函數,你的腳本將會覆蓋,而你永遠不會知道它。

在Perl中,您可以通過在模塊名稱前添加前綴來引用模塊中的變量。 (如File::Find一樣。例如$File::Find::Name是找到的文件的名稱,這不污染您的命名空間。

如果你真的想你的模塊函數和變量的命名空間,看看@EXPORT_OK列表變量Exporter。這是你想要導入到你的模塊命名空間的所有變量和函數的列表,但它不是自動的,你必須在use聲明旁邊列出它們,這樣,你更有可能知道它們。使用出口商是不是太困難在你模塊中,你會放:

package Mu::Foo; 
use Exporter qw(import); 
our EXPORT_OK = qw(convert $fundge @ribitz); 

然後,在你的程序中,你會p UT:

use Mu::Foo qw(convert $fundge @ribitz); 

現在您可以訪問convert$fundge@ribitz,好像他們是你的主要計劃的一部分。但是,您現在已經記錄了您正在從Mu::Foo中抽取這些子例程和變量。

(如果你認爲這是複雜的,很高興我沒有告訴你,你真的應該在你的模塊使用面向對象的方法。這是真正做到這一點的最好辦法。)

+0

你可以通過定義一個指向目錄的['PERL5LIB'](http://perldoc.perl.org/perlrun.html#ENVIRONMENT)環境變量來緩解這個過程,這將被添加到你的'@INC '。現在將所有自定義的'.pm'文件放在這個目錄中,並且可以像安裝它們一樣使用它們。 –

+0

謝謝你的回答。我用我的代碼在我的文章中做了一些更新。該文件可以找到,但代碼沒有被應用。 – Nicsoft