2010-05-14 15 views
3

Dans le programme court suivant:

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

pourquoi ne pas die produire un numéro de ligne et retour à la ligne? Ma sortie ressemble à ceci:

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

Répondre

10

Template est en retournant un objet erreur de type Template::Exception. L'objet a une stringification surchargée qui s'applique lorsque la valeur est imprimée, mais quand die regarde la valeur, il voit une référence et n'ajoute pas le numéro de ligne et le retour à la ligne. Forcer la valeur en une chaîne plus tôt pour résoudre le problème:

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

impressions

file error - non-existent-file: not found at scratchpad.pl line 25. 
0

Alors que @ la réponse d'Eric ne résout la question des postes d'observation, je suggère annexant un espace au lieu de pré-attente une chaîne vide .

La raison est que s'il y a des problèmes dans le modèle, l'erreur sera signalée comme venant du texte du modèle au lieu du numéro de ligne dans le fichier perl (ce que je veux). Voir cet exemple court:

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

Il en résulte:

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

Ce qui est pas très utile. Je veux l'emplacement du fichier perl. Au lieu de cela, je suggère:

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

qui produit:

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

De cette façon, je reçois le numéro de ligne dans le fichier perl aussi. Cela semble un peu moche, cependant. (Vous pouvez arrêter de lire maintenant, si vous aimez ...)

Une façon encore plus correcte serait:

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

qui produit cette sortie:

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

Mais il est tellement verbeux et a un . étrange là-bas. Je suis en fait fini par créer:

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); 

Alors que je reçois ceci:

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

ainsi que cela pour l'exemple des postes d'observation:

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