Почему в $ template-> error () не отображается номер строки? - PullRequest
3 голосов
/ 14 мая 2010

В следующей короткой программе:

 use Template;
 my $template = Template->new (INCLUDE_PATH => ".");
 $template->process ("non-existent-file")
      or die $template->error ();

почему не умрет не создаст номер строки и символ новой строки? Мой вывод выглядит так:

 ~ 502 $ perl template.pl
 file error - non-existent-file: not found ~ 503 $ 

Ответы [ 2 ]

10 голосов
/ 14 мая 2010

Template возвращает объект ошибки типа Template::Exception.Объект имеет перегруженную строковую спецификацию, которая применяется при печати значения, но когда die смотрит на значение, он видит ссылку и не добавляет номер строки и символ новой строки.Приведите значение в строку ранее, чтобы решить проблему:

use Template;
my $template = Template->new (INCLUDE_PATH => ".");
$template->process ("non-existent-file")
  or die '' . $template->error ();

печать

file error - non-existent-file: not found at scratchpad.pl line 25.
0 голосов
/ 13 января 2016

В то время как ответ @ Эрика действительно решает проблему с OP, я предлагаю добавить пробел вместо предварительного ожидания пустой строки.

Причина в том, что если в шаблоне есть проблемы, об ошибке будет сообщено, что она идет из текста шаблона, а не из номера строки в файле perl (что я и хочу). Смотрите этот короткий пример:

use Template;
my $template = Template->new();
# Clearly a division by zero bug
$template->process(\"[% 1 / 0 %]")
    or die $template->error();

В результате:

undef error - Illegal division by zero at input text line 1.

Что не очень полезно. Я хочу местоположение файла perl. Вместо этого я предлагаю:

my $template = Template->new();
$template->process(\"[% 1 / 0 %]")
    or die $template->error() . ' ';

, который производит:

undef error - Illegal division by zero at input text line 1.
  at test.pl line 11.

Таким образом, я также получаю номер строки в файле perl. Это выглядит немного уродливо, хотя. (Вы можете прекратить читать сейчас, если хотите ...)

Еще более правильный путь был бы:

use Template;
my $template = Template->new();
$template->process(\"[% 1 / 0 %]")
    or do {
        my $error = $template->error . '';
        chomp $error;
        die $error;
    };

, который производит этот вывод:

undef error - Illegal division by zero at input text line 1. at t2.pl line 15.

Но это так многословно и там есть странный .. Я фактически закончил тем, что создал:

sub templateError {
    my ($template) = @_;
    my $string = $template->error->as_string;
    chomp $string;
    $string =~ s/(line \d+)\.$/$1/;
    return $string;
}
...
use Template;
my $template = Template->new ();
$template->process (\"[% 1 / 0 %]")
    or die templateError($template);

Чтобы я получил это:

undef error - Illegal division by zero at input text line 1 at test.pl line 30.

, а также это для примера OP:

file error - non-existent-file: not found at test.pl line 31.
...