Perl требуется для файла, заданного переменной - PullRequest
2 голосов
/ 26 апреля 2011

Я хочу использовать модуль, чтобы путь к файлу был в переменной.

Я пытался использовать этот код:

#!/usr/bin/perl -w
use strict;

use Getopt::Long;

my ($library, $zipped, $aid_class_file);
GetOptions ("aid_class_file=s"  =>  \$aid_class_file,
            "res_lib=s"         =>  \$library,
            "zip"               =>  \$zipped);

require $aid_class_file;

но это не работает. Как мне это сделать?

редактирование: Сообщение об ошибке:

Can't locate Error.pm in @INC (@INC contains: /usr/lib/perl5/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl .) at /nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm line 6.
BEGIN failed--compilation aborted at /nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm line 6.
Compilation failed in require at statistics.pl line 11.

Я хочу добавить файл с именем AidClass.pm, а не Error.pm

Я бежал, используя строку:

statistics.pl -aid_class_file="/nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/AidClass.pm"

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Ваша ошибка показывает, что AidClass не может найти файл Error.pm, который вызывает его сбой.Error.pm вызывается в строке 6 AidClass.pm:

Can't locate Error.pm

Он ищет его по следующему пути:

/usr/lib/perl5/5.8.3/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl

В зависимостио том, каков ваш AidClass, вы можете добавить его каталог как библиотеку в AidClass.pm, чтобы он также там искал Error.pm:

use lib '/nfs/iil/disks/home10/imelam2/learn_flow/flow_to_change/';
use Error;

Или вы можете сделать это из сценария, который вывызывают AidClass и вместо вызова use Error; вызывают use AidClass;, и если файл Error.pm находится в папке, он будет работать нормально.

2 голосов
/ 26 апреля 2011

Вы не говорите, каким образом это "не работает", так что это всего лишь предположение.

Вы пытались прочитать документацию ?В частности, бит, который говорит о загрузке модулей с использованием переменной.

Если EXPR - это голое слово, то требование предполагает расширение «.pm» и заменяет «::» на «/» в имени файладля вас, чтобы было легко загружать стандартные модули.Эта форма загрузки модулей не рискует изменить ваше пространство имен.

Другими словами, если вы попробуете это:

require Foo::Bar; # a splendid bareword

Функция require будет фактически искать «Foo / Bar.pm "файл в каталогах, указанных в массиве @INC.

Но если вы попробуете это:

$class = 'Foo::Bar';
require $class; # $class is not a bareword
#or
require "Foo::Bar"; # not a bareword because of the ""

Функция require будет искать файл" Foo :: Bar "вМассив @INC и будет жаловаться, что не нашел там "Foo :: Bar".В этом случае вы можете сделать:

eval "require $class";
...