Что является надлежащим способом создать использование метода BUILDARGS MooseX:: Объявить?

На окнах можно использовать PuttyGen, чтобы загрузить файл секретных ключей, удалить пароль и затем перезаписать существующий файл секретных ключей.

6
задан Axeman 3 September 2009 в 13:57
поделиться

3 ответа

Я думаю, вам нужно что-то вроде метода BUILDARGS (ClassName $ class: Str $ filename) {...} , в котором вы явно определяете инициатор как ClassName $ class .

10
ответ дан 8 December 2019 в 18:39
поделиться

Думаю, вам нужно:

#!/use/bin/perl

use strict;
use warnings;

use MooseX::Declare;
class BinaryFile::Buffer {
    use FileHandle;
    use Carp;

    has file      => ( is => 'ro', isa => 'FileHandle');
    has file_name => ( is => 'ro', isa => 'Str');
    has _buff     => (
        is       => 'rw',
        isa      => 'Str',
        default  => '',
        init_arg => undef
    );

    sub BUILDARGS {
        my ($class, $file_name) = @_;
        my $file = FileHandle->new( $file_name ) or do {
            carp "unable to open ", $file_name, " : $!";
            return;
        };
        $file->binmode;
        return $class->SUPER::BUILDARGS(
                file_name => $file_name,
                file      => $file
        );
    }

    # get the next n bytes from the buffer.
    method pop(Int $len) {
        # ... Make sure there is data in _buff
        return substr( $self->buff, 0, $len, '' );
    }

    # Look around inside the buffer without changing the location for pop
    method peek(Int $offset, Int $len) {
        # ... Make sure there is data in _buff
        return substr( $self->buff, $offset, $len );
    }
}

my $f = BinaryFile::Buffer->new($0);

print $f->file_name, "\n";
2
ответ дан 8 December 2019 в 18:39
поделиться

также очень изящный способ сделать это (просто расширение ответа передо мной):

use MooseX::MultiMethods;

multi method BUILDARGS (ClassName $class: Str $filename) {

#do whatever you want to do if only a strg is passed

}

таким образом MooseX :: MultiMethods позаботится о том, чтобы, если вы НЕ вызываете FileHandle-> new ($ file_name),

но

FileHandle->new(
_filename => $file_name
);

(это обычный синтаксис),

он все равно будет работать!

Кроме того, вы можете (что не так полезно для имен файлов, но для других case)

добавьте

multi method ( ClassName $class, Int $some_number ){}

таким образом, new теперь может обрабатывать хеш-ссылки, целые числа и строки ...

о возможности ...;)

1
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: