Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eliminate the UserName from the "use" command

Tags:

perl

All my Perl files start with the /home/UserName/lib use command. Is there a way to eliminate the hardcoded UserName from all my .pl files? I want to simplify duplicating of my website for different users and different domains. This is a Perl Templates website that takes the cfg=UserName param from the URL and renders the site according to the specific user format. But the lib files are all the same for all users!

Can you use something like this instead? use lib './lib'; Sorry, I have very limited knowledge of perl programming.

Example:

use lib '/home/UserName/lib';
use RT::RealTime;
use RT::Site;
.... 

Anyone who can help is appreciated.

like image 441
Daniel Yahdav Avatar asked Dec 14 '22 10:12

Daniel Yahdav


1 Answers

If I'm understanding your quest correctly, one way is

use warnings;
use strict;

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

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

# use packages from that path...

This sets the username of the user who runs the script.

Better yet, in this particular case the use of BEGIN isn't really needed since %ENV is a global variable set up by the interpreter early enough, so you can simply say

use lib "/home/$ENV{USER}/lib";

or

use lib "$ENV{HOME}/lib"

However, this won't work for many other related needs, which is why I (first) showed a way to work out things which aren't handed to us at compile time, in a BEGIN block.

In that case, the little dance around BEGIN goes as follows. The use runs at compile-time, so $user_name must already be available; thus we set it up in a BEGIN block that must come before the use statement that uses the variable. However, we need to declare the variable outside of the block (and my is a compile-time statement).

All that can then be wrapped in another block, enclosing code from before my $user_name to after user lib..., to scope that $user_name variable so that it is not seen in the rest of the file.

Another option seems to be to simply move those packages to a user-neutral location, and then you don't need the username in that use lib statement ...?

like image 173
zdim Avatar answered Jan 05 '23 00:01

zdim