Size: a a a

2021 July 19

AK

Andrey Karepin in Modern::Perl
если нет package, то как ты его подключаешь в свою программу тогда?
источник

SZ

Sergey Zhmylove in Modern::Perl
Require
источник

SZ

Sergey Zhmylove in Modern::Perl
источник

D

Denys in Modern::Perl
Коллеги,
Наткнулся в проекте на странный баг, похоже что в коде создаются вирутальные модули. Под виртуальными модулями имеют ввиду такой модуль, который есть $INC{‘Some::Module::Name’} => 1.  Но values вместо пути к файлу там 1. Ну и самого файла Some/Module/Name.pm в проекте нет.
Похоже что где то в коде, есть кусочек кода которые во время старта веб сервиса, евалить этот модуль наследует его от реального Module/Name.pm.
Вот мне нужно поймать то место где этот евал происходит. Не подскажите какой хук можно повесить что бы отловить момент когда Some::Module::Name’ добавляется в %INC ?
источник

W

Warstone in Modern::Perl
@PerlBanjoBot
use Data::Dumper;
print Dumper(\%INC);
eval "sub My::Cool::Package::sub { print \"Bingo!\\n\" }";
print Dumper(\%INC);
My::Cool::Package::sub()
источник

P

PerlBanjoBot in Modern::Perl
$VAR1 = {
         'overloading.pm' => '/usr/local/lib/perl5/5.34.0/overloading.pm',
         'bytes.pm' => '/usr/local/lib/perl5/5.34.0/bytes.pm',
         'warnings.pm' => '/usr/local/lib/perl5/5.34.0/warnings.pm',
         'feature.pm' => '/usr/local/lib/perl5/5.34.0/feature.pm',
         'open.pm' => '/usr/local/lib/perl5/5.34.0/open.pm',
         'constant.pm' => '/usr/local/lib/perl5/5.34.0/constant.pm',
         'Exporter.pm' => '/usr/local/lib/perl5/5.34.0/Exporter.pm',
         'strict.pm' => '/usr/local/lib/perl5/5.34.0/strict.pm',
         'utf8.pm' => '/usr/local/lib/perl5/5.34.0/utf8.pm',
         'Carp.pm' => '/usr/local/lib/perl5/5.34.0/Carp.pm',
         'Data/Dumper.pm' => '/usr/local/lib/perl5/5.34.0/x86_64-linux/Data/Dumper.pm',
         'XSLoader.pm' => '/usr/local/lib/perl5/5.34.0/XSLoader.pm',
         'warnings/register.pm' => '/usr/local/lib/perl5/5.34.0/warnings/register.pm'
       };
$VAR1 = {
         'overloading.pm' => '/usr/local/lib/perl5/5.34.0/overloading.pm',
         'bytes.pm' => '/usr/local/lib/perl5/5.34.0/bytes.pm',
         'warnings.pm' => '/usr/local/lib/perl5/5.34.0/warnings.pm',
         'feature.pm' => '/usr/local/lib/perl5/5.34.0/feature.pm',
         'open.pm' => '/usr/local/lib/perl5/5.34.0/open.pm',
         'constant.pm' => '/usr/local/lib/perl5/5.34.0/constant.pm',
         'Exporter.pm' => '/usr/local/lib/perl5/5.34.0/Exporter.pm',
         'strict.pm' => '/usr/local/lib/perl5/5.34.0/strict.pm',
         'utf8.pm' => '/usr/local/lib/perl5/5.34.0/utf8.pm',
         'Carp.pm' => '/usr/local/lib/perl5/5.34.0/Carp.pm',
         'Data/Dumper.pm' => '/usr/local/lib/perl5/5.34.0/x86_64-linux/Data/Dumper.pm',
         'XSLoader.pm' => '/usr/local/lib/perl5/5.34.0/XSLoader.pm',
         'warnings/register.pm' => '/usr/local/lib/perl5/5.34.0/warnings/register.pm'
       };
Bingo!
https://PerlBanjo.com/d7a6131ff9
источник

W

Warstone in Modern::Perl
Наглядный пример что %INC не расскажет вам ни о чем.
источник

W

Warstone in Modern::Perl
@PerlBanjoBot
package base;
sub qwe { print "qwe\n"}

package main;
push(@{"My::Cool::Package::ISA"}, "base");
my $obj = bless {}, "My::Cool::Package";
$obj->qwe();
источник

P

PerlBanjoBot in Modern::Perl
Can't use string ("My::Cool::Package::ISA") as an ARRAY ref while "strict refs" in use at script.pl line 13.
https://PerlBanjo.com/07a99b668f
источник

W

Warstone in Modern::Perl
@PerlBanjoBot
package base;
sub qwe { print "qwe\n"}

package main;
no strict 'refs';
push(@{"My::Cool::Package::ISA"}, "base");
my $obj = bless {}, "My::Cool::Package";
$obj->qwe();
источник

P

PerlBanjoBot in Modern::Perl
источник

D

Denys in Modern::Perl
@Warstone cпасибо.
Но в моем то примере я вижу что этот модуль есть в INC. Моя гипотеза в том что если смогу поймать момент когда  Some::Module::Name попал в INC, то скорее всего это место будет связано с созданием этого самого Some::Module::Name
источник

W

Warstone in Modern::Perl
У вас создается объект этого класса?..
источник

D

Denys in Modern::Perl
да в моем варианте $obj->new
источник

D

Denys in Modern::Perl
в самом My::Cool::Package ничего нет, но есть реальный base от которого все унаследовано и new в частности
источник

W

Warstone in Modern::Perl
Ну так в base::new вызовите carp
источник

W

Warstone in Modern::Perl
В случае если класс My::Cool::Package
источник

D

Denys in Modern::Perl
нет, мне нужно найти не место где $obj->new,.
а место где  push(@{"My::Cool::Package::ISA"}, "base");
источник

D

Denys in Modern::Perl
вот вопрос как раз был об этом. где вставить carp что бы найти
источник

W

Warstone in Modern::Perl
@ISA - это обычный массив... Натравите на него tie и при записи туда вы найдете кто это делает
источник