STDOUT redirigido a la variable que no atrapa la salida de la tubería

Quiero redirigir temporalmente stdout a una variable en memoria. Las impresiones se redirigen correctamente a mi variable pero no a la salida de una tubería (bc en mi ejemplo). Que esta pasando?

#!/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";

La salida real será:

before bc

Rendimiento esperado:

before bc
4

Respuestas a la pregunta(2)

Su respuesta a la pregunta