Perl 在Moose中不使用writer方法填充只读属性

Perl 在Moose中不使用writer方法填充只读属性,perl,moose,Perl,Moose,我正在使用Moose在Perl中创建一个面向对象的类 我有许多属性,我希望它们是只读的,我声明如下: package BioIO::SeqIO; use Moose; use namespace::autoclean; use MooseX::StrictConstructor; use MooseX::Types::Moose qw(ArrayRef HashRef Int Str); use FinalTypes::MyTypes qw(FileType); has '_gi'

我正在使用Moose在Perl中创建一个面向对象的类

我有许多属性,我希望它们是只读的,我声明如下:

package BioIO::SeqIO;
use Moose;
use namespace::autoclean;
use MooseX::StrictConstructor;
use MooseX::Types::Moose qw(ArrayRef HashRef Int Str);
use FinalTypes::MyTypes qw(FileType);

has '_gi'      => (isa      => ArrayRef,
                   is       => 'ro',
                   init_arg => undef,
                   writer   => '_writer_gi');
sub BUILD {
    # Confessing with usage string if incorrect number of arguments used.
    @_ == 2 or confess getErrorString4WrongNumberArguments();
    # Initializing local variable with subroutine input.
    my ($self) = @_;
    # Creating BioIO::SeqIO object for GenBank or FASTA file.
    $self->fileType =~ /genbank/i ? $self->_getGenbankSeqs() : $self->_getFastaSeqs();
}
我还有一个生成器方法,如下所示:

package BioIO::SeqIO;
use Moose;
use namespace::autoclean;
use MooseX::StrictConstructor;
use MooseX::Types::Moose qw(ArrayRef HashRef Int Str);
use FinalTypes::MyTypes qw(FileType);

has '_gi'      => (isa      => ArrayRef,
                   is       => 'ro',
                   init_arg => undef,
                   writer   => '_writer_gi');
sub BUILD {
    # Confessing with usage string if incorrect number of arguments used.
    @_ == 2 or confess getErrorString4WrongNumberArguments();
    # Initializing local variable with subroutine input.
    my ($self) = @_;
    # Creating BioIO::SeqIO object for GenBank or FASTA file.
    $self->fileType =~ /genbank/i ? $self->_getGenbankSeqs() : $self->_getFastaSeqs();
}
我的代码工作正常,但是,我通过以下测试得到警告:

dies_ok {BioIO::SeqIO->new(filename => $fileNameIn, fileType => 'fasta', => _gi => [])}     '... dies when _gi sent to BioIO::SeqIO constructor';
警告如下:

Use of uninitialized value $gi in hash element at BioIO/SeqIO.pm line 256, <$fh> chunk 1.

我想我得到了一个警告,因为程序不会在用户试图写入_gi时就死掉,但是,我不知道如何确保这种情况发生

在属性定义中,请注意
init_arg
设置为未定义,即删除:

has '_gi'      => (isa      => ArrayRef,
                   is       => 'ro',
                   init_arg => undef,
                   writer   => '_writer_gi');

init arg是构造函数调用中参数的名称。由于它被设置为undef,您无法通过构造函数初始化它,只能通过writer方法(这里创建了一个名为
\u writer\u gi
的内部方法)。

真的看不出我们可以如何帮助您解决这个写得不好的问题。如果没有找到错误所在的上下文,那么向我们显示错误发生的行是没有意义的。
$gi
来自哪里?使用模块
BioIO::SeqIO
是个坏主意。它与CPAN模块
Bio::SeqIO
非常相似,对其功能没有任何合理的建议。