从“使用”命令中删除用户名

Dan*_*dav 4 perl

我所有的Perl文件都以/ home / UserName / lib use命令开头。有没有办法从我所有的.pl文件中消除硬编码的UserName?我想简化针对不同用户和不同域的网站复制。这是一个Perl模板网站,该网站从URL中获取cfg = UserName参数,并根据特定的用户格式呈现该网站。但是所有用户的lib文件都一样!

您可以改用这样的东西吗?使用lib'./lib'; 抱歉,我对perl编程的了解非常有限。

例:

use lib '/home/UserName/lib';
use RT::RealTime;
use RT::Site;
.... 
Run Code Online (Sandbox Code Playgroud)

任何可以提供帮助的人都会感激不尽。

zdi*_*dim 8

如果我正确理解了您的要求,一种方法是

use warnings;
use strict;

my $user_name;
BEGIN { $user_name = $ENV{USER} }

use lib "/home/$user_name/lib";

# use packages from that path...
Run Code Online (Sandbox Code Playgroud)

这将设置运行脚本的用户的用户名。

更好的是,在这种特殊情况下,实际上不需要使用BEGIN,因为%ENV是解释器尽早设置的全局变量,因此您可以简单地说

use lib "/home/$ENV{USER}/lib";
Run Code Online (Sandbox Code Playgroud)

要么

use lib "$ENV{HOME}/lib"
Run Code Online (Sandbox Code Playgroud)

但是,这不能满足许多​​其他相关需求,这就是为什么我(首先)展示了一种方法来解决在编译时无法传递给我们的问题的原因BEGIN

在这种情况下,周围的小舞BEGIN如下。将use在编译时运行,所以$user_name必须已经可用; 因此,我们将其设置在BEGIN必须使用该变量的语句之前的块中use。但是,我们需要在块外部声明变量(这my是一个编译时语句)。

然后可以将所有内容包装在另一个块中,将代码从before my $user_name到after 包围起来user lib...,以限定该$user_name变量的范围,以便在文件的其余部分中看不到该变量。

另一个选择似乎是将这些软件包简单地移动到用户无关的位置,然后您在该use lib 语句中不需要用户名...?