我正在尝试为Perl制作一个更小、更优化的CGI模块。
在使用init
子例程获取或设置默认文件数据时,我遇到了一个主要由MIME::Types
模块引起的问题。
实际上,我的init子例程应该从new
构造函数中获取受祝福的变量,初始化MIME::Types
,使用MIME::Types
通过mimeTypeOf()
返回$type的MIME::Type,确定MIME::Type是否为二进制,并打印出Content-Type和Content-Disposition。
然而,当试图做一些那样性质的事情时,我得到的标题是错误。
这是我目前的代码,理论上应该可以工作。
sub new {
my ($class, %args) = @_;
my $self = {};
my $type = $args{type} // 'text/html'; # If type isn't defined, default to HTML content.
my $attachment = ($args{attachment} // 'false') eq 'true' ? 'attachment' : 'inline'; # Same, but with disposition instead.
$self->{type} = $type;
$self->{attachment} = $attachment;
bless $self, $class;
return $self;
}
sub init {
my $self = shift;
CORE::state $type = shift // $self->{type}; # If there are no overrides, just use $self->type;
# print $self->type; prints text/html when not specified.
CORE::state $attachment = shift // $self->{attachment}; # Same as above, but with $self->attachment;
# print $self->attachment; prints inline when not specified.
my $types = MIME::Types->new;
my $mime = $types->mimeTypeOf($type);
if ($mime->isBinary) {
$self->{attachment} = 'attachment';
} else {
$self->{attachment} = ('inline' or $attachment);
}
die "Warning: Binary content types should not be sent inline!\r\n" if ($mime->isBinary && $attachment eq 'inline');
print "Content-Type: $mime\r\nContent-Disposition: $self->{attachment}\r\n\r\n";
return;
}
即使打印类型也会返回一个非未定义的值,事实上,当新方法中没有任何内容时,它会打印出它应该打印的内容,这是我的主CGI文件中的代码。
#!C:\Strawberry\perl\bin\perl.exe
use strict;
use warnings;
use TinyCGI::Core;
# Create a new TinyCGI::Core object
my $cgi = TinyCGI::Core->new();
# Initialize the TinyCGI::Core object
$cgi->init();
print 'Hello, World!';
这在没有MIME::Types的情况下也能很好地工作,甚至在对象中实际定义的内容也能很好地工作。
我也尝试过不使用CORE::state
。
1条答案
按热度按时间b0zn9rqh1#
您错误地使用了
MIME::Types
。看起来您想从HTTP头(或者多部分主体头)中获取值并确定它是什么。您使用了mimeTypeOf
,它需要文件扩展名或文件名,而您应该使用type
,它需要类型字符串。无论哪种方式,都有可能返回undef值,因为
MIME::Types
可能无法将字符串Map到类型。与此无关的是,由于某种原因使用了
CORE::state
,这看起来像是在定义某个名为state
的方法或子例程,并期望它与Perl内置函数冲突。但是我认为你不需要
state
,你有一个示例方法init
,由于某种原因,它基于一个先前创建的,不相关的示例持久化一个值,我认为你需要my
,因为你只是给一个本地名称给已经在调用示例中的东西,你不想把它持久化给下一个调用它的示例。