невозможно найти определение функции в базе кода Perl - PullRequest
4 голосов
/ 10 ноября 2011

Я копаюсь в 7900+ строках perl-кода. Мне нужно было изменить несколько вещей, и все шло довольно хорошо, хотя я всего лишь 36 часов в Perl. Я выучил основные конструкции языка и смог сделать небольшие вещи. Но вдруг я нашел вызов функции, который нигде не имеет определения. Я grep'ed несколько раз, чтобы проверить все «sub». Я не смог найти определение функции. Что мне не хватает? Где находится определение этой функции. Я совершенно уверен, что это пользовательская функция, а не библиотечная функция (по ее названию я догадался). Пожалуйста, помогите мне найти определение этой функции.

Вот несколько строк об использовании функции.

(cfg_machine_isActive($ep)) {
         staf_var_set($ep, VAR_PHASE, PHASE_PREP);
         staf_var_set($ep, VAR_PREP,  STATE_RUNNING);
      } else {
         cfg_machine_set_state($ep, STATE_FAILED);
      }
   }
   $rc = rvt_deploy_library();       #this is the function that is the problem 
   dump_states() unless ($rc != 0);

Вот ответ:

(я не мог опубликовать этот ответ сам, потому что у меня недостаточно репутации)

Я обнаружил, что самый быстрый способ найти определение импортированной функции в perl - это следующие команды:

>perl.exe -d <filename>.pl

Это запускает отладчик. Затем; сделать

b <name of the function/subroutine who's definition you are looking for>

в нашем случае это будет означать:

b rvt_deploy_library

затем нажмите «c», чтобы перейти к упомянутой функции / подпрограмме.

Это приводит отладчик к требуемой функции. Теперь вы можете увидеть строку №. и расположение функции / подпрограммы на консоли.

main::rvt_deploy_library(D:/CAT/rvt/lib/rvt.pm:60): 

Ответы [ 3 ]

6 голосов
/ 10 ноября 2011

Есть несколько способов объявить метод в Perl. Вот почти наверняка неполный список:

  1. Стандартный способ, например. sub NAME { ... }
  2. Использование MooseX :: Method :: Signatures, method NAME (...) {...}
  3. Присвоение типовому глобу, например. *NAME = sub {...};

Кроме того, если пакет объявляет функцию AUTOLOAD, тогда не может быть явного определения метода. См. perlsub для получения дополнительной информации.

5 голосов
/ 11 ноября 2011

Вы можете проверить любое значение perl с помощью модуля B . В этом случае:

sub function_to_find {}

sub find_sub (\&) {
    my $code = shift;
    require B;
    my $obj = B::svref_2object($code);  # create a B::CV object from $code

    print "$code:\n";

    print "  $$_[0]: $$_[1]\n" for
        [file    => $obj->FILE],
        [line    => $obj->GV->LINE],
        [name    => $obj->GV->NAME],
        [package => $obj->STASH->NAME];
}

find_sub &function_to_find;

, который печатает что-то вроде:

CODE(0x80ff50):
  file: so.pl
  line: 7
  name: function_to_find
  package: main
4 голосов
/ 10 ноября 2011

B :: Xref покажет все функции, объявленные во всех файлах, используемых вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...