![](/img/trans.png)
[英]How can I tell Module::Build not to add the lib/perl5 subdirectories to the installation path?
[英]How can I tell perl the path for a module?
我在 perl 腳本中使用了 perl 模塊文件:
打印標簽.pl
use Table;
Table.pm
與printtab.pl
位於同一目錄中,因此只要我從該目錄執行 printtab ,它就可以正常執行。
但是如果我從其他地方執行它,例如,使用 cronjob,我會收到一個錯誤,指出在@INC
中找不到該模塊。
解決此問題的正確方法是什么?
我試過了
push @INC, "/path/Table.pm";
但它不起作用。 你能告訴我為什么嗎?
我發現了關於use lib
並且它工作正常
use lib "/path";
在這種情況下使用 lib 是最好的方法嗎?
use lib
是一個不錯的選擇。 但是,您是否將模塊放在與程序相同的目錄中(或放在與包含程序的目錄相關的子目錄中),您可以use FindBin;
喜歡:
use FindBin;
use lib "$FindBin::Bin/../lib";
push @INC, "/path/Table.pm";
不起作用,因為 @INC 應該是目錄列表,而不是模塊的完整路徑。 所以如果你這樣做:
push @INC, "/path";
它應該工作。
話雖如此, use lib "/path";
也是一個不錯的選擇。
根據您的程序的安裝目錄結構,使用 FindBin 來確定腳本的實際位置可能對構建模塊的正確路徑很有用。
一個巧妙的小技巧:
#! /usr/bin/env perl
use strict;
use warnings;
BEGIN {
our $moduleIsMissing;
eval {
require My::Module;
};
if ($@) {
$moduleIsMissing = 1;
}
}
if ($main::moduleIsMissing) {
print "Module is missing. I've got to do something about it!\n"
}
else {
print "Module is there. I'm fine!\n";
}
我對$main::moduleIsMissing
的事情不滿意,但我還沒有想出解決辦法。
如果My::Module
可用,則它已加載並且一切正常。 否則,設置$main::moduleIsMissing
標志。 這允許您測試模塊是否已加載,如果沒有,則采取規避措施。 例如,如果模塊Term::Cap
可用,您的程序將在打印文本時使用粗體,但如果沒有,將簡單地打印出沒有粗體的文本。
回到問題:這樣做要好得多:
use lib "MyDir";
而不是@INC
。
use lib
在編譯時包含目錄。 因此,如果我在目錄“MyDir”中有一個模塊“Foo::Bar”,我可以這樣做:
use lib qw(MyDir);
use Foo::Bar;
沒有 Perl 抱怨。 如果我這樣做:
push (@INC, qw(MyDir));
use Foo::Bar;;
Perl 會抱怨找不到我的模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.