2014-07-08 2 views
1

이 질문은 'BioPerl'과 관련되어 있지만, 그 질문은 아마도 그보다 더 일반적인 것 같습니다.출력을 스트리밍하여 문자열 변수로 저장하기

기본적으로 Bio::Tree::TreeI 개체를 생성했으며이를 문자열 변수로 변환하려고합니다. > write_tree은 "스트림에 나무를 씁니다"-

# a $tree = Bio::Tree::TreeI->new() (which I know is an actual tree as it prints to the terminal console) 

my $treeOut = Bio::TreeIO->new(-format => 'newick') 
$treeOut->write_tree($tree) 

이의 출력은

: 나는 문자열 변수에 그 변환에 가까이 올 수

유일한 방법은 사용하여 스트림에 그 나무를 작성하는 것입니다 나는 당신이 변수에 대한 표준 출력을 리디렉션 할 수 있습니다 Bio::TreeIO

답변

1

BioPerl 개체의 파일 핸들을 설정하여 동일한 목표를 쉽게 달성 할 수있는 방법이 있으며, 해킹이 덜 발생한다고 생각합니다. 예를 들면 다음과 같습니다.

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Bio::TreeIO; 

my $treeio = Bio::TreeIO->new(-format => 'newick', -fh => \*DATA); 
my $treeout = Bio::TreeIO->new(-format => 'newick', -fh => \*STDOUT); 

while (my $tree = $treeio->next_tree) { 
    $treeout->write_tree($tree); 
} 

__DATA__ 
(A:9.70,(B:8.234,(C:7.932,(D:6.321,((E:2.342,F:2.321):4.231,((((G:4.561,H:3.721):3.9623, 
I:3.645):2.341,J:4.893):4.671)):0.234):0.567):0.673):0.456); 

이 스크립트를 실행하면 예상대로 뉴윅 문자열이 터미널에 인쇄됩니다. Bio::Phylo (권장)을 사용하는 경우 to_string 메서드 (IIRC)가 있으므로 나무를 인쇄하기 위해 개체를 만들지 않아도되므로 say $tree->to_string을 사용할 수 있습니다.

+0

아, 그건 당면한 문제에 훨씬 더 구체적입니다. Bio :: Phylo에 대한 정보 주셔서 감사합니다. – Rambatino

2

의 기능의에서 문자열을 반환하는 또 다른 방법을 찾을 수 있지만, 어떻게, 문자열 변수에 그를 캡처 할

my $captured; 
{ 
    local *STDOUT = do { open my $fh, ">", \$captured; $fh }; 
    $treeOut->write_tree($tree); 
} 
print $captured; 
+0

그건 오소리예요. 고맙습니다! – Rambatino

관련 문제