$zip->replaceMember( 'MANIFEST.MF', $file );
Maybe try instead
$zip->replaceMember( 'META-INF/MANIFEST.MF', $file );
Also, it seems (though the docs are somewhat ambiguous) the method wants a member object for the new member, not a file name, so try (untested)
...
my $new_member = Archive::Zip::Member->newFromFile($file);
$zip->replaceMember( 'META-INF/MANIFEST.MF', $new_member);
If that doesn't work either, what's the return value of replaceMember()? (according to the docs, it returns undef on error)