STDOUT redirecionado para variável que não captura a saída do tubo

Quero redirecionar temporariamente o stdout para uma variável na memória. As impressões são redirecionadas corretamente para minha variável, mas não para a saída de um pipe (bc no meu exemplo). O que está acontecendo?

#!/usr/bin/perl

my $stdout_sink;
open(my $orig_stdout, ">&STDOUT") || die $!;
close STDOUT;
open(STDOUT, ">", \$stdout_sink) || die $!;

# produce some output in different ways
print "before bc\n"; # ok
open my $fh, "| bc";
print $fh "2+2\n";   # not ok
close $fh;

close STDOUT;  
open(STDOUT, ">&", $orig_stdout) || die $!;
print "$stdout_sink";

A produção real será:

before bc

Saída, d saída:

before bc
4

questionAnswers(2)

yourAnswerToTheQuestion