It's all explained rather well in the docs. Archive::Zip
addFile is expecting a filename not an Archive::Zip::ZipFileMember object. Try this instead:
#!perl
use strict;
use warnings;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
# Include actual filenames in the next two lines
my $oldfile = 'oldzip.zip';
my $newfile = 'newzip.zip';
my $oldzip = Archive::Zip->new();
$oldzip->read( $oldfile ) == AZ_OK or die 'read error';
print "$oldfile contains the following files:\n";
print " $_\n" for $oldzip->memberNames();
print "\n";
my $newzip = Archive::Zip->new();
my @wanted = $oldzip->membersMatching( '123.*\.xml' );
for my $member ( @wanted )
{
print "Extracting ", $member->fileName(), " from $oldfile and addi
+ng to $newfile\n";
$oldzip->extractMember( $member );
$newzip->addMember( $member );
}
print "\n";
$newzip->writeToFileNamed( $newfile ) == AZ_OK or die 'error somewhere
+';
print "$newfile contains the following files:\n";
print " $_\n" for $newzip->memberNames();
__END__
# Sample output
oldzip.zip contains the following files:
123a.xml
123b.xml
234c.xml
Extracting 123a.xml from oldzip.zip and adding to newzip.zip
Extracting 123b.xml from oldzip.zip and adding to newzip.zip
newzip.zip contains the following files:
123a.xml
123b.xml