의 I는 실험있어 일부 코드에서 발췌 한 것입니다 : 다른 곳에서무스 특성에 개최 메모리 파일을 역 참조
has buffer => (is => 'rw', isa => 'ScalarRef');
has old_stdout => (is => 'rw', isa => 'FileHandle');
sub capture {
my $self = shift;
my $old_stdout;
my $buffer;
open $old_stdout, '>&', STDOUT
or croak 'Cannot duplicate filehandle';
close STDOUT;
open STDOUT, '>', \$buffer
or croak 'Cannot open filehandle';
$self->old_stdout($old_stdout);
$self->buffer(\$buffer);
}
sub reset {
my $self = shift;
open STDOUT, '>&', $self->old_stdout
or croak 'Cannot reset STDOUT';
}
: 나는 부정 행위 시도
my $stdout = Capture->new();
print "Some output\n";
$stdout->reset();
print $stdout->buffer();
# SCALAR(0x#######)
print ${$stdout->buffer()};
# Some output
은 속성 hashref를 직접 설정 - 작동하지만, 그것을하고 싶지 않다. :
open STDOUT, '>', \$self->{buffer}
or croak 'Cannot open filehandle';
나는 som을 놓치고 있다고 생각한다. 여기 근본적인 것. $buffer
(메모리 내 파일)을 무스 (Moose) 속성으로 저장하는 방법은 어떻게해야합니까? 호출자가 역 참조를하지 않고 나중에 검색 할 수 있도록하려면 어떻게해야합니까?
업데이트
나는 트릭을 않는 around
방법 수정, 추가되었습니다 :
around 'buffer' => sub {
my $orig = shift;
my $self = shift;
return ${$self->$orig} unless @_;
$self->$orig(@_);
};
을 ...하지만 여전히 지저분한 느낌. 더 좋은 방법이 있습니까?
감사합니다. 당신의 대답에서 아무 것도 없애지 않고, 내가 그것을 보았 더라면 분명했습니다. 그것은 분명하고 간단하며 효과적입니다. capture :: Tiny - 네, 매우 유사합니다. 그것은 더 큰 무언가의 일부이며, 나는 Capture :: Tiny를 보았습니다. 나는 CPAN 모듈을 사용하여 잘 끝낼 수도 있지만, 어느 쪽이든, 그것은 가치있는 일이었습니다. 길을 따라 몇 가지 새로운 것들을 배웠습니다. – Martin