четверг, 24 февраля 2011 г.

tracking used perl modules

а вот оказывается в perl в переменную @INC можно добавить указатель на ф-цию, которая будет в таком случае вызываться каждый раз при разрешении используемого модуля.
Примерчик использования:
perl -Mpresolve my_cewl_script_do_it_all_now.pl
Результаты:

BEGIN
{
        require( $INC{'constant.pm'} = 'C:/Perl/lib/constant.pm' );
        require( $INC{'warnings/register.pm'} = 'C:/Perl/lib/warnings/register.pm
' );
        require( $INC{'FindBin.pm'} = 'C:/Perl/lib/FindBin.pm
' );
        require( $INC{'Cwd.pm'} = 'C:/Perl/lib/Cwd.pm
' );
        require( $INC{'base.pm'} = 'C:/Perl/lib/base.pm
' );
        require( $INC{'Config.pm'} = 'C:/Perl/lib/Config.pm
' );
        require( $INC{'File/Basename.pm'} = 'C:/Perl/lib/File/Basename.pm
' );
        require( $INC{'re.pm'} = 'C:/Perl/lib/re.pm
' );
        require( $INC{'File/Spec.pm'} = 'C:/Perl/lib/File/Spec.pm
' );
        require( $INC{'vars.pm'} = 'C:/Perl/lib/vars.pm
' );
        require( $INC{'File/Spec/Win32.pm'} = 'C:/Perl/lib/File/Spec/Win32.pm
' );
        require( $INC{'File/Spec/Unix.pm'} = 'C:/Perl/lib/File/Spec/Unix.pm
' );
        require( $INC{'Exporter/Heavy.pm'} = 'C:/Perl/lib/Exporter/Heavy.pm
' );
        require( $INC{'lib.pm'} = 'C:/Perl/lib/lib.pm
' );
        require( $INC{'Getopt/Std.pm'} = 'C:/Perl/lib/Getopt/Std.pm
' );
}
1;

Вычитано в маловразумительном наборе рецептов книжке perl hacks
Исходник лоховского сделанного на коленке модуля presolve.pm под катом
package presolve;
use strict;
use warnings;

my @track;

BEGIN { unshift @INC, \&resolve_path }

sub resolve_path
{
  my ($code, $module) = @_;
  push @track, $module;
  return;
}

INIT
{
  print "BEGIN\n{\n";
  for my $tracked (@track)
  {
    print "\trequire( \$INC{'$tracked'} = '$INC{$tracked}' );\n";
  }
  print "}\n1;\n";
}
# be trve 
1;

Комментариев нет:

Отправить комментарий