The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"путь к модулю"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"путь к модулю"  
Сообщение от jr email(ok) on 10-Дек-07, 10:31 
Как узнать путь к загруженному модулю?

use Module;

my $mod_path = ???;
print "Path to 'Module' = $mod_path\n";

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "путь к модулю"  
Сообщение от angra (ok) on 10-Дек-07, 19:30 
Может я конечно ошибаюсь, но наверное никак. Perl хранит список загруженных модулей, но ему нет никакой нужды хранить еще и путь к ним. Если есть желание поискать вручную, то пройдитесь по списку путей в @INC.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "путь к модулю"  
Сообщение от jr (ok) on 10-Дек-07, 20:32 
>Может я конечно ошибаюсь, но наверное никак. Perl хранит список загруженных модулей,
>но ему нет никакой нужды хранить еще и путь к ним.
>Если есть желание поискать вручную, то пройдитесь по списку путей в
>@INC.

Нашел переменную __FILE__
Она как раз содержит абсолютный путь к файлу текущего модуля.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "путь к модулю"  
Сообщение от angra (ok) on 10-Дек-07, 21:27 
Очень интересно, а можно пример. Такой например ничего не выводит
perl -e 'use Test::Simple; print $Test::Simple::__FILE__'
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "путь к модулю"  
Сообщение от jr email(ok) on 11-Дек-07, 09:50 
>Очень интересно, а можно пример. Такой например ничего не выводит
>perl -e 'use Test::Simple; print $Test::Simple::__FILE__'

поторопился я с выводами...

perldata:
Three special literals are __FILE__, __LINE__, and __PACKAGE__, which represent the current filename, line number, and package name at that point in your program.

поскольку файл модуля у меня исполняется из apache, то эта переменная и ссылается на файл модуля, что меня и привело к заблуждению...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "путь к модулю"  
Сообщение от konst email(??) on 11-Дек-07, 22:56 
>Как узнать путь к загруженному модулю?
>
>use Module;
>
>my $mod_path = ???;
>print "Path to 'Module' = $mod_path\n";

А зачем?
Можно использовать поиск по файлам. Очень полезная команда: locate
Если модуль стандартный, то find /usr/lib perl -name Module.pm

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "путь к модулю"  
Сообщение от angra (ok) on 12-Дек-07, 05:12 
То что вы советуете можно сделать средствами самого Perl намного эффективней. Однако Perl вы похоже не знаете, зато совет по нему даете. Так держать. Можете на досуге помедитировать над задачей поиска при помощи find модулей типа Net::Dns::Async при существующем RPC::Async, а также подумать что делать c модулями расположенными в
.
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
особенно с учетом возможности различных версий одного модуля в разных директориях и надо знать какая именно загрузилась при выполнении программы.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "путь к модулю"  
Сообщение от konst email(ok) on 12-Дек-07, 16:22 
>[оверквотинг удален]
>.
>/usr/local/lib/perl/5.8.8
>/usr/local/share/perl/5.8.8
>/usr/lib/perl5
>/usr/share/perl5
>/usr/lib/perl/5.8
>/usr/share/perl/5.8
>/usr/local/lib/site_perl
>особенно с учетом возможности различных версий одного модуля в разных директориях и
>надо знать какая именно загрузилась при выполнении программы.

1. Команда locate покажет все варианты. Включаем мозг - понимаем какой именно модуль имелся ввиду
2. Т.к. здесь не все участники полные дебилы, то find /usr/lib/perl может послужить просто образцом. Далее включенный мозг (+ распечатка: @INC) смогут сделать свое дело.
3. Ваши догадки и советы не по теме - оставьте при себе

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "путь к модулю"  
Сообщение от angra (ok) on 13-Дек-07, 00:18 
>1. Команда locate покажет все варианты. Включаем мозг - понимаем какой именно
>модуль имелся ввиду

Вы не поверите но далеко не везде
1. locate есть
2. updatedb выполняется по крону. Более того лично мой опыт подсказывает что чаще всего это не так.
Ну и наконец для распознавания результата у вас требуется человек.

>2. Т.к. здесь не все участники полные дебилы, то find /usr/lib/perl может
>послужить просто образцом. Далее включенный мозг (+ распечатка: @INC) смогут сделать
>свое дело.

Те кто не дебилы не будут использовать find для этой задачи. Еще раз повторю Perl вы не знаете, что такое автоматика вы не в курсе, так как ваши варианты требуют человека. Ради интереса покажите как вы получите распечатку @INC

>3. Ваши догадки и советы не по теме - оставьте при себе

Простите, но не по теме здесь как раз вы разглагольствуете.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "путь к модулю"  
Сообщение от konst email(??) on 13-Дек-07, 01:40 
>>1. Команда locate покажет все варианты. Включаем мозг - понимаем какой именно
>>модуль имелся ввиду
>
>Вы не поверите но далеко не везде
>1. locate есть
>2. updatedb выполняется по крону. Более того лично мой опыт подсказывает что
>чаще всего это не так.

Это уже совсем другой вопрос. При исполнении команды locate выводится предупреждение, если база давно не обновлялась. В любом случае запустить не несколько сек. updatedb - никого не затруднит.

>Ну и наконец для распознавания результата у вас требуется человек.
>
>>2. Т.к. здесь не все участники полные дебилы, то find /usr/lib/perl может
>>послужить просто образцом. Далее включенный мозг (+ распечатка: @INC) смогут сделать
>>свое дело.
>
>Те кто не дебилы не будут использовать find для этой задачи. Еще
>раз повторю Perl вы не знаете, что такое автоматика вы не
>в курсе, так как ваши варианты требуют человека. Ради интереса покажите
>как вы получите распечатку @INC

Очередной наезд?
Если мне потребуется получить результат автоматически - меня не затруднит написать скриптик. Но, как правило, этого не требуется - достаточно штатных средств *nix. И команда find занимает там не последнее место.
Что касается @INC, то perl -e 'print join("\n",@INC);' покажет мне значение INC по умолчания, а в самостоятельных проектах, как правило, используются собственные модули (и @INC соответственно дополняется).  В какой момент происходит подгрузка левых модулей - выяснить бывает не так просто (когда пытаешься разобраться в чужом проекте), поэтому лично я использую именно locate (или find, если уже точно известна директория проекта)

Т.о. анализ @INC поможет лишь в случае со стандартными модулями, но не самописными. Но и в том и другом случае, locate найдет нужный модуль быстрее...

>>3. Ваши догадки и советы не по теме - оставьте при себе
>
>Простите, но не по теме здесь как раз вы разглагольствуете.

По теме у Вас было ТОЛЬКО: совет "пройтись по @INC" (вот сами и ходите. ls,cd Вам в помощь). Остальное - наезды и смешные амбиции.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "путь к модулю"  
Сообщение от angra (ok) on 13-Дек-07, 03:34 
У некоторых updatedb конечно справляется за несколько минут, но похоже с системами где на это уйдет много часов вы не работали. С ситуацией типа shared hosting, где это просто нельзя запустить, тоже не сталкивались.

Изначальный вопрос был про получение пути к уже загруженному модулю, то есть внутри перлового скрипта. Ответа на него я не знаю, более того мне кажется что это в принципе  нельзя получить явно. Если кто-то предложит способ, то я буду рад о нем узнать. Все ваши способы это вызов внешних программ, причем без реальной на то необходимости, что является моветоном. Когда я предлагал проход по  @INC имелся ввиду проход средствами перла и никакие добавки в @INC не сыграют роль, в отличии от вашего внешнего find/locate.
Кстати привели вы не самый плохой способ получения  @INC. Остается только удивляться вашей привязанности к вызову внешних утилит вместо использования модулей перла.

P.S. если у вас есть варианты решения оригинального вопроса, то предлагайте, с удовольствием послушаю, но предлагать писать внешние скрипты анализирующие вывод locate/find не стоит.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "путь к модулю"  
Сообщение от konst email(??) on 13-Дек-07, 04:49 
>У некоторых updatedb конечно справляется за несколько минут, но похоже с системами
>где на это уйдет много часов вы не работали. С ситуацией
>типа shared hosting, где это просто нельзя запустить, тоже не сталкивались.

OK. Мне действительно трудно представить себе ситуацию, где updatedb требуется несколько часов... Все что, могу предположить: сервер с хостингом (>10000 host'ов), где запрещено пользоваться БД (mysql,postgres).
Вот пример одного из моих серверов (10-15 хостов, правда БД используются):
Всего файлов:
time find / -type f |wc -l
  304358

real    1m35.144s
user    0m1.929s
sys     0m9.836s
Итак: всего 300тыс. файлов (для сравнения мой дом.комп: ~223тыс.)

time /usr/libexec/locate.updatedb      

real    1m43.499s
user    0m4.034s
sys     0m10.248s

Вот рез-т на другом сервере (там стат-логов много):

time find / -type f |wc -l

895474

real    3m37.768s
user    0m0.837s
sys     0m3.645s

>
>Изначальный вопрос был про получение пути к уже загруженному модулю, то есть
>внутри перлового скрипта. Ответа на него я не знаю, более того
>мне кажется что это в принципе  нельзя получить явно. Если
>кто-то предложит способ, то я буду рад о нем узнать.
>
>P.S. если у вас есть варианты решения оригинального вопроса, то предлагайте, с
>удовольствием послушаю, но предлагать писать внешние скрипты анализирующие вывод locate/find не
>стоит.

Я после опубликования последнего сообщения догадался, о чем сыр-бор. Вы просто восприняли задание "в лоб":  путь к загруженному модулю (получить внутри скрипта - это Вы от себя додумали).


Я же сделал поправку... Проявил немного телепатических способностей, и меня осенило, что НИКОМУ НИКОГДА НЕ ПОНАДОБИТСЯ путь к "УЖЕ загруженному модулю" внутри perl-скрипта. Вопрос был о том, что автор увидел текст скрипта, в котором в первых строчках было:
use MyModule;
и он просто хотел ознакомится с его содержимым. Мои ответы были - на таким образом понятый вопрос. Думаю, это именно то, что хотел автор.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру