捕获输出以流式传输并存储为字符串变量

时间:2014-07-08 11:35:47

标签: string perl stream bioperl

虽然这个问题与'BioPerl'有关,但我相信这个问题可能更为笼统。

基本上我已经生成了一个Bio::Tree::TreeI对象,我试图将其转换为字符串变量。

我能接近将其转换为字符串变量的唯一方法是使用以下命令将该树写入流:

# 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)

- > write_tree的输出是“将树写入流”但是如何在字符串变量中捕获它,因为我找不到另一种从{{3中的任何函数返回字符串的方法}}

2 个答案:

答案 0 :(得分:3)

您可以将标准输出重定向到变量

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

答案 1 :(得分: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);

正如您所料,运行此脚本会将newick字符串打印到终端。如果您使用Bio::Phylo(我推荐),则有to_string方法(IIRC),因此您不必创建对象来打印树木,您可以{ {1}}。