[Moscow.pm] get own source code

Фролов Павел pavelfk3 на mail.ru
Сб Мар 28 20:55:30 PDT 2015


28.03.2015 20:07, PEF Secure пишет:
> Hi,
>
> прошу направить меня на путь.
>
> Хочется получить собственный исполняемый код, который виден интерпретатору.
> Нужен буквальный код, на который ссылается интерпретатор, когда говорит "такая
> то ошибка в такой то строке". Дело не решается чтением исходного кода
> соответствующего файла с диска, поскольку речь идёт о "фильтрованном" коде.
> Вот надуманный пример:
>
> package TestFilter;
> use Filter::Simple;
> FILTER_ONLY code => sub {
> 	s/\bIF\b(.*?) THEN/if($1){/g;
> 	s/\bELSE\b/} else {/g;
> 	s/\bEND IF\b/}/g;
> 	s/\bEND\b/}/g;
> };
> 1;
>
> use TestFilter;
> use v5.018;
>
> eval { IF 1 == 2 THEN say "impossible" ELSE say "yes" END IF };
>
> Если внутри eval-а будет ошибка, то хочется увидеть тот самый код, что там
> исполнялся интерпретатором перла.
sub _get_file_line
{
   my ( $filename, $line_number ) = @_;
   # http://docstore.mik.ua/orelly/perl/cookbook/ch08_09.htm
   open( my $source_fh, "<", $filename )  or die "cannot open < 
$filename: $!";
   $line_string = undef;
   $. = 0;
   do { $line_string = <$source_fh> } until $. == $line_number || eof;
   close( $source_fh ) || warn "close failed: $!";
   return $line_string;
}

   my $source_file = (caller(0))[1];
   my $source_line = (caller(0))[2];

   _get_file_line( $source_file, $source_line )



Подробная информация о списке рассылки Moscow-pm