Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用ExtUtils::MakeMaker时如何更改脚本/模块中的变量字符串_Linux_Perl_Makefile - Fatal编程技术网

Linux 使用ExtUtils::MakeMaker时如何更改脚本/模块中的变量字符串

Linux 使用ExtUtils::MakeMaker时如何更改脚本/模块中的变量字符串,linux,perl,makefile,Linux,Perl,Makefile,我在用perl编写的应用程序中有一些模块和脚本。对于它的发行版,我使用的是ExtUtils::MakeMaker 模块和脚本的目标操作系统是Linux。问题是,最终用户可能会将模块/脚本安装在非标准目录中,也可能安装在他们自己的目录中,然后像这样安装: perl Makefile.PL PREFIX='/YOUR/DIRECTORY' make make test make install ExtUtils::MakeMaker解决了当模块/scritps安装目录不是标准目录时,通过前缀变量解

我在用perl编写的应用程序中有一些模块和脚本。对于它的发行版,我使用的是
ExtUtils::MakeMaker

模块和脚本的目标操作系统是Linux。问题是,最终用户可能会将模块/脚本安装在非标准目录中,也可能安装在他们自己的目录中,然后像这样安装:

perl Makefile.PL PREFIX='/YOUR/DIRECTORY'
make
make test
make install
ExtUtils::MakeMaker
解决了当模块/scritps安装目录不是标准目录时,通过
前缀
变量解决的问题

如何将
前缀
字符串”值复制或替换到脚本中?例如,代替硬代码:

use lib '/YOUR/DIRECTORY';
我想将其替换为以下模板:

use lib '%%PREFIX%%';
其中,
%%PREFIX%%
在“编译”时被替换,并且没有设置环境变量(
$ENV{'PREFIX'}


谢谢你的回答

要使用的是PM_过滤器:

if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
    # doesn't work on windows: no sed
    $opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}
它可以在linux和几乎所有的东西上工作,除了windows(正如您在评论中看到的)

[更新以包含更多使用细节:

use ExtUtils::MakeMaker;

%opts = (
     'NAME'         => 'myModulesAndScripts',
     # ...
    );

if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
    # doesn't work on windows: no sed
    $opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}

WriteMakefile(%opts);

(正如注释所指出的,您可以尝试在PM_筛选器中调用perl本身,这样就不需要windows检查;但是,在我上面的示例中,我发现perl不在exec路径中,并且/usr的现有前缀路径已经可以了……如果您需要,可以直接在普通WriteMakefile参数列表中定义PM_筛选器想要更大的可移植性:
'perl-pe“s |/usr/share |$(前缀)/share |“'
谢谢@Wes,我不太明白...
PM|u过滤器是从?对不起。你可以直接放在WriteMakefile选项中。我会更新一下。