As yet another alternative: Archive::Extract can do it in a very straightforward manner:
my $x = Archive::Extract->new( archive => ’archive.zip’ );
$x->extract( to => 'target/directory' ) or die $x->error;
It (Archive::Extract) has the bonus benefit of working for .tar.gz, .tar.bz2 and other archive types as well. In turn, it has some drawbacks in the current implementation that take the entire contents of the archive into memory (due to Archive::Tar and Compress::unLZMA, but that does not affect handling zip files, which can use Archive::Zip or the utility unzip under the hood.