3

Response というスーパークラスがあります。

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

および URIError というサブクラス:

package URIError;

use strict;
use warnings;

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

1;

__DATA__
Invalid URI

URIError->response が呼び出されると、行

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

Response クラスでは、URIError クラスからDATAセクションのコンテンツを取得しません。

これを達成するための構文は何ですか?

4

1 に答える 1

3

このようにメソッドを変更すると、コードが機能しますbody。の必要はありませんeval: 文字列を無効strict 'refs'にして逆参照するだけです。"${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;
}
于 2014-09-07T14:23:54.290 に答える