2010-08-25 7 views
3

Dans cPanel, ils vous indiquent d'insérer ce code dans le début des fichiers Perl. Je ne suis pas sûr de ce que ça fait. J'ai essayé le code avec et sans cela au début du fichier et il semble que tout fonctionne de la même manière. Je n'ai pas testé cela avec cron en cours d'exécution du code, mais seulement comme moi-même. Par « testé sur », je veux dire en utilisant des lignes d'impression, des connexions de base de données & renvoie, sous-marins, vars, etc ...Que fait ce code Perl?

BEGIN 
{ 
    my $base_module_dir = (-d '/home/root/perl' ? '/home/root/perl' : (getpwuid($>))[7] . '/perl/'); 
    unshift @INC, map { $base_module_dir . $_ } @INC; 
} 

Répondre

8

Peut-être un peu plus facile à lire:

# 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); 
} 
+0

qu'en est-il de cette pièce? "(getpwuid ($>)) [7]" Je ne comprends pas le $> et le tableau ref (?) à [7] – CheeseConQueso

+0

http://p3rl.org/getpwuid - mais je modifierai légèrement ma réponse – nicomen

+0

+1 pour me montrer à nouveau pourquoi j'aime le Perl. – Dummy00001

3

Ce code crée Perl à préférer des modules dans les deux /home/root/perl --Si il existe et est un répertoire - ou ~/perl lorsque vous recherchez des modules à charger. Il prend fondamentalement tous les chemins que le Perl utilise normalement et les base dans le répertoire choisi.

Probablement, cela permet à l'utilisateur d'avoir une version de débogage ou de correction d'un bug d'un module système et pour Perl de le préférer à la place.

Cela se fait dans un bloc BEGIN car c'est le seul moyen de s'assurer qu'un bloc de logique peut être exécuté pour modifier @INC afin d'affecter le comportement des instructions use.

+0

Il ne PREPEND pas un répertoire, mais prepends fait ce répertoire les noms de tous les membres de @INC et ajoute que la liste plus large à l'avant de @INC , d'où la carte. – HerbN

10

Il est conçu pour définir le chemin de recherche de votre module. Plus précisément, il définit l'emplacement par défaut (premier emplacement coché) du répertoire local perl/ de l'utilisateur. Il ajoute non seulement ce répertoire mais en fait une nouvelle racine pour @INC. Il le fait pour chaque entrée dans @INC. Dans un environnement à accès limité comme ceux qui utilisent CPanel, cela vous assure que les scripts (CGI généraux) utilisent vos modules par-dessus tout autre. BEGIN signifie qu'il se produit avant tout code qui n'est pas dans le bloc.

La première ligne détermine si /home/root/perl existe et est un répertoire. Si les deux sont vrais, ils affectent cela à $base_module_dir, sinon, ils affectent <user home>/perl/ à la variable. Rappelez-vous, dans perl vous pouvez indexer un appel de fonction directement s'il renvoie une liste.

Il trouve le répertoire personnel de l'utilisateur avec getpwuid($>). getpwuid() obtient des informations de compte d'utilisateur pour un utilisateur donné (généralement à partir de passwd sur un système Unix) et le renvoie sous forme de liste. $> est l'identifiant utilisateur effectif du script. La raison de l'index de 7 est que c'est l'emplacement du répertoire de base dans la liste (et c'est le 8ème champ dans passwd si la mémoire sert).

Il ajoute ensuite TOUTES les entrées dans @INC avec $base_module_dir et insère ces entrées modifiées au début de @INC. Il ne s'agit donc pas simplement d'ajouter $base_module_dir en tant que répertoire, mais de l'ajouter en tant que nouvelle racine pour toutes les entrées dans @INC. C'est pourquoi il utilise map au lieu de simplement ajouter une seule entrée.

+0

Ah, c'est vrai. J'ai supprimé ma réponse depuis que j'ai raté les effets de la carte. Merci d'avoir fait remarquer cela. +1 à HerbN –

+0

qu'en est-il de cette pièce? "(getpwuid ($>)) [7]" Je ne comprends pas le $> et le tableau ref (?) à [7] – CheeseConQueso