perl 无法对未定义的值调用方法“isBinary”

juud5qan  于 2022-12-19  发布在  Perl
关注(0)|答案(1)|浏览(166)

我正在尝试为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

b0zn9rqh

b0zn9rqh1#

您错误地使用了MIME::Types。看起来您想从HTTP头(或者多部分主体头)中获取值并确定它是什么。您使用了mimeTypeOf,它需要文件扩展名或文件名,而您应该使用type,它需要类型字符串。
无论哪种方式,都有可能返回undef值,因为MIME::Types可能无法将字符串Map到类型。

my $type = $mime->type( $self->{type} );
if( defined $type ) { ... }

与此无关的是,由于某种原因使用了CORE::state,这看起来像是在定义某个名为state的方法或子例程,并期望它与Perl内置函数冲突。
但是我认为你不需要state,你有一个示例方法init,由于某种原因,它基于一个先前创建的,不相关的示例持久化一个值,我认为你需要my,因为你只是给一个本地名称给已经在调用示例中的东西,你不想把它持久化给下一个调用它的示例。

相关问题