2014-09-07 2 views
3

J'ai une super classe appelée Réponse:Accès __DATA__ de super classe

package Response; 

use strict; 
use warnings; 

use HTML::Template; 

sub response { 
    my ($class, $request) = @_; 
    return $request->new_response($class->status, $class->headers, $class->body); 
} 

sub body { 
    my $class = shift; 
    my $template = HTML::Template->new('filehandle' => eval("$class::DATA")); 
    return $template->output() . $class; 
} 

sub status { 
    return 200; 
} 

sub headers { 
    return [ 'Content-Type' => 'text/html' ]; 
} 

1; 

__DATA__ 
Default content 

et une sous-classe appelée URIError:

package URIError; 

use strict; 
use warnings; 

use Response; 
our @ISA = qw(Response); 

1; 

__DATA__ 
Invalid URI 

Lorsque URIError-> réponse est appelée, ligne

my $template = HTML::Template->new('filehandle' => eval("$class::DATA")); 

dans la classe de réponse ne prend pas DONNÉES contenu de la section de la classe URIError.

Quelle est la syntaxe pour y parvenir?

+0

Ce pue. Les données ne peuvent être lues qu'une seule fois (sauf si vous notez la position initiale du fichier et revenez en arrière). Pourquoi ne pas avoir un accesseur qui – ikegami

Répondre

3

Votre code fonctionnera si vous modifiez la méthode body comme ceci. Il n'y a pas besoin de eval: tout ce que vous devez faire est de désactiver strict 'refs' et déréférencer la chaîne "${class}::DATA"

sub body { 
    my $class = shift; 

    my $data_fh = do { 
     no strict 'refs'; 
     *{"${class}::DATA"}; 
    }; 

    my $template = HTML::Template->new(filehandle => $data_fh); 

    $template->output . $class; 
} 
+0

@ user1474829 La façon préférée de dire «merci» est en acceptant la réponse la plus utile (cliquez sur la coche verte) à n'importe quelle question que vous posez (ce qui augmente aussi un peu votre réputation), et en haut -voting réponses utiles (si vous avez 15 + réputation). S'il vous plaît lire le [tour], et bonne chance avec les réponses. – jm666

+0

Désolé je n'ai jamais vraiment passé par tout ce processus de marquage. Votre réponse est marquée maintenant! Merci encore –

+0

@ user1474829: Merci; Je suis heureux que je puisse vous aider. (Notez que le commentaire ci-dessus ne venait pas de moi mais de @ jm666) – Borodin