2010-08-25 1 views
3

В cPanel они сообщают вам вставить этот код в начало файлов Perl. Я не уверен, что он делает. Я пробовал код с и без этого в начале файла, и, похоже, все работает одинаково. Я не тестировал это с помощью cron, управляющего кодом, но только как я. К «протестировал это», я имею в виду использование печатных линий, соединения с базой данных & возвратов, подлодка, ПОСРЕДНИКИ, и т.д. ...Что делает этот код Perl?

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

ответ

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

что об этой части? "(getpwuid ($>)) [7]« Я не понимаю $> и массив ref (?) to [7] – CheeseConQueso

+0

http://p3rl.org/getpwuid - но я немного отредактирую свой ответ – nicomen

+0

+1 для того, чтобы снова показать мне, почему я люблю Perl. – Dummy00001

3

Этого код устанавливает Perl предпочитает модули в любом /home/root/perl --Ел он существует и является каталогом - или ~/perl при поиске модулей для загрузки. Он в основном использует каждый путь, который обычно использует Perl, и основывает его в этом выбранном каталоге.

Вероятно, это позволяет пользователю иметь отладочную или исправленную версию системного модуля, а для Perl предпочтительнее этого.

Он делает это в блоке BEGIN, потому что это единственный способ убедиться, что блок логики может быть запущен для изменения @INC, чтобы повлиять на поведение операторов use.

+0

Это не предварять каталог, но на самом деле присоединяет этот каталог с именами всех членов @INC и добавляет, что больший список передней @INC , следовательно, отображение. – HerbN

10

Он предназначен для установки пути поиска модуля. В частности, он устанавливает местоположение по умолчанию (первое локальное местоположение) локального каталога perl/ пользователя. Он не только добавляет этот каталог, но делает его новым корнем для @INC. Он делает это для каждой записи в @INC. В среде с ограниченным доступом, такой как те, которые используют CPanel, это гарантирует, что ваши скрипты (общие cgi) будут использовать ваши модули над любыми другими.

BEGIN означает, что это происходит до того, как какой-либо код не находится в блоке.

Первая строка определяет, существует ли /home/root/perl и является каталогом. Если оба значения истинны, они присваивают значение $base_module_dir, в противном случае переменная присваивает <user home>/perl/. Помните, что в perl вы можете индексировать вызов функции напрямую, если он возвращает список.

Он находит домашний каталог пользователя с getpwuid($>). getpwuid() получает информацию об учетной записи пользователя для данного пользователя (обычно из passwd в системе Unix) и возвращает его как список. $> - эффективный идентификатор пользователя скрипта. Причиной индекса 7 является то, что расположение домашнего каталога в списке (и это 8-е поле в passwd, если память служит).

Затем он добавляет ВСЕ записи в @INC с $base_module_dir и вставляет эти измененные записи в начале @INC. Таким образом, это не просто добавление $base_module_dir в качестве каталога, но добавление этого в качестве нового корня для всех записей в @INC. Вот почему он использует map вместо того, чтобы просто добавить одну запись.

+0

Ах, правильно. Я удалил свой ответ, так как я пропустил эффект от карты. Спасибо что подметил это. +1 до HerbN –

+0

что с этим изделием? "(getpwuid ($>)) [7]« Я не понимаю, что $> и массив ref (?) - [7] – CheeseConQueso