簡體   English   中英

如何告訴 perl 模塊的路徑?

[英]How can I tell perl the path for a module?

我在 perl 腳本中使用了 perl 模塊文件:

打印標簽.pl

use Table;

Table.pmprinttab.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM