На окнах можно использовать PuttyGen, чтобы загрузить файл секретных ключей, удалить пароль и затем перезаписать существующий файл секретных ключей.
Я думаю, вам нужно что-то вроде метода BUILDARGS (ClassName $ class: Str $ filename) {...}
, в котором вы явно определяете инициатор как ClassName $ class
.
Думаю, вам нужно:
#!/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";
также очень изящный способ сделать это (просто расширение ответа передо мной):
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 теперь может обрабатывать хеш-ссылки, целые числа и строки ...
о возможности ...;)