下面是一些代碼,我與實驗的摘錄:解引用在穆斯屬性持有的在內存中的文件
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