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 mailing list
[email protected] | http://moscow.pm.org

Ответить