perl - 从父类(super class)访问 __DATA__

标签 perl plack

我有一个名为 Response 的父类(super class):

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 部分内容。

实现这个的语法是什么?

最佳答案

如果您像这样更改 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;
}

关于perl - 从父类(super class)访问 __DATA__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710301/

相关文章:

perl - 在 Perl 脚本中使用特殊字符

perl - 在 Plack::Builder 中挂载 "hosts"

perl - 将自定义环境变量设置为 psgi hash pack

perl - 如何使用 Perl 的 LWP 提取非标准的 HTTP header ?

perl - 有没有更好的方法在 Perl 中从我的字符串中添加/删除 'B'?

perl - Perl IO::Socket::UNIX与超时连接给出EAGAIN/EWOULDBLOCK

perl - 如何在 Perl 散列中存储和使用变量和子例程名称?

perl - 如何使用 Plack 和 Mojolicious 避免 502 响应?

perl - 将 Modperl 配置转换为 Plack - 按文件扩展名运行不同的处理程序

perl - 使用Apache反向代理对plack/PSGI应用程序进行身份验证