在cPanel中,它们会告诉您将此代码插入Perl文件的开头。我不确定它是做什么的。我已经在文件的开头尝试了有和没有这个的代码,似乎所有工作都是一样的。我没有用cron运行代码来测试它,但只有我自己。通过“测试它”,我的意思是使用打印线,数据库连接和返回,潜艇,变种等...
BEGIN
{
my $base_module_dir = (-d '/home/root/perl' ? '/home/root/perl' : ( getpwuid($>) )[7] . '/perl/');
unshift @INC, map { $base_module_dir . $_ } @INC;
}
答案 0 :(得分:10)
它旨在设置您的模块搜索路径。具体来说,它将默认位置(已检查的第一个位置)设置为用户的本地perl/
目录。它不仅添加了该目录,还使其成为@INC
的新根目录。 它为@INC中的每个条目执行此操作。在有限的访问环境(例如使用CPanel的访问环境)中,这可以确保您的脚本(通用cgi)能够将您的模块用于任何其他模块。
BEGIN表示它发生在不在块中的任何代码之前。
第一行确定/home/root/perl
是否存在并且是目录。如果两者都为真,则将其分配给$base_module_dir
,否则将<user home>/perl/
分配给变量。请记住,在perl中,如果函数调用返回列表,则可以直接对其进行索引。
它使用getpwuid($>)
找到用户的主目录。 getpwuid()
获取给定用户的用户帐户信息(通常来自Unix系统上的passwd)并将其作为列表返回。 $>
是脚本的有效用户ID。索引为7的原因是列表中主目录的位置(如果内存服务的话,它是passwd中的第8个字段)。
然后将@INC
中的所有条目添加到$base_module_dir
,并在@INC
的前面插入修改后的条目。因此,不只是将$base_module_dir
添加为目录,而是将其添加为@INC
中所有条目的新根。这就是为什么它使用map
而不是仅添加一个条目。
答案 1 :(得分:8)
也许更容易阅读:
# The BEGIN block is explained in perldoc perlmod
BEGIN {
# Prefix all dirs already in the include path, with root's perl path if it exists, or the
# current user's perl path if not and make perl look for modules in those paths first:
# Example:
# "/usr/lib/perl" => "/home/root/perl/usr/lib/perl, /usr/lib/perl"
my $root_user_perl_dir = '/home/root/perl';
# Fetch user home dir in a non-intuitive way:
# my $user_perl_dir = ( getpwuid($>) )[7] . '/perl/');
# Fetch user home dir slightly more intuitive:
my $current_userid = $>; # EFFECTIVE_USER_ID see perldoc perlvar
# See perldoc perlfunc / perldoc -f getpwuid
my ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)
= getpwuid($current_userid);
my $current_user_home_dir = $dir;
my $user_perl_dir = $current_user_home_dir . '/perl/';
my $base_module_dir = '';
if (-d $root_user_perl_dir ) {
# Use this if the path exists
$base_module_dir = $root_user_perl_dir;
}
else {
# or fallback to current user's path
$base_module_dir = $user_perl_dir;
}
# Generate the new paths
my @prefixed_INC = map { $base_module_dir . $_ } @INC;
# Add the generated paths in front of the existing ones.
@INC = (@prefixed_INC, @INC);
}
答案 2 :(得分:3)
此代码将Perl设置为/home/root/perl
中的模块 - 如果它存在且是目录 - 或者在查找要加载的模块时~/perl
。它基本上采用Perl通常使用的每条路径,并将它们基于所选目录。
可能,这允许用户拥有系统模块的调试版或修正版,而Perl则更喜欢这样。
它在BEGIN块中执行此操作,因为它是确保可以运行逻辑块以修改@INC
以影响use
语句行为的唯一方法。