Did I miss something really obvious?
The following code shows a successful 'cd' for me
use IPC::Run qw( start pump finish );
my ($input, $output, $errput);
my $subp = start([ '/bin/bash' ],
\$errput) or die $@;
$input .= "cd /work/drjohnson\n";
pump $subp until length $input == 0;
$input .= "pwd\n";
pump $subp until $output =~ /\n/;
If you have a runnable example of where it doesn't work for you, I'd be glad to try it. You might also try IPCRUNDEBUG. Do an 'export IPCRUNDEBUG=details' before running your script. I believe what the author meant was that you couldn't do things like 'cd' (well, chdir) in your parent script between pump calls.