Я пытаюсь понять, как использовать IO :: Uncompress :: Unzip, чтобы распаковать Jar-файлы. У меня есть имена файлов в печати банки, но я получаю сообщение об ошибке:Perl IO :: Uncompress :: Unzip
Can't call method "reset" on an undefined value at ../IO/Uncompress/Base.pm line 986.
после того как я прочитал последнюю запись. Вот мой модуль:
sub modify_artifact {
my %parameters = @_;
my @required_parameters = qw(version directory);
for my $parameter (@required_parameters) {
if (not exists $parameters{$parameter}) {
die qq(ERROR: Missing required parameter "$parameter");
}
}
my $directory = $parameters{directory};
my $dir_fh = IO::Dir->new($parameters{directory}) or
die qq(ERROR: Cannot open directory "$parameters{directory} for reading.);
while (my $file_name = $dir_fh->read) {
next if $file_name =~ /^\./; #Hidden and "." and ".."
my $full_file_name = File::Spec->join($directory, $file_name);
my $archive_fh = IO::Uncompress::Unzip->new($full_file_name) or
die qq(ERROR: Cannot open file "$full_file_name" for reading.);
while (my $status = $archive_fh->nextStream) {
last unless $status > 0;
say $archive_fh->getHeaderInfo->{Name}; # Print out file or directory
}
}
}
say
линия работает для каждого и каждой записи в архиве, но тогда я получаю отказ при попытке прочитать в следующем потоке:
META-INF/MANIFEST.MF
META-INF/maven/
META-INF/maven/com.vegicorp/
META-INF/maven/com.vegicorp/services/
META-INF/maven/com.vegicorp/services/pom.properties
META-INF/maven/com.vegicorp/services/pom.xml
com/
com/vegicorp/
com/vegicorp/services/
com/vegicorp/services/filter/
com/vegicorp/services/filter/impl/
com/vegicorp/services/generators/
com/vegicorp/services/filter/impl/DescInfoFilter.class
com/vegicorp/services/filter/impl/RequestFilterAals.class
com/vegicorp/services/generators/OutputGenerator$1.class
com/vegicorp/services/generators/OutputGenerator.class <- Last entry in archive
Can't call method "reset" on an undefined value at ../IO/Uncompress/Base.pm line 986.
Я попробовал петлю for
, показанную в тоже примерах:
sub modify_artifact {
my %parameters = @_;
my @required_parameters = qw(version directory);
for my $parameter (@required_parameters) {
if (not exists $parameters{$parameter}) {
die qq(ERROR: Missing required parameter "$parameter");
}
}
my $directory = $parameters{directory};
my $dir_fh = IO::Dir->new($parameters{directory}) or
die qq(ERROR: Cannot open directory "$parameters{directory} for reading.);
while (my $file_name = $dir_fh->read) {
next if $file_name =~ /^\./; #Hidden and "." and ".."
my $full_file_name = File::Spec->join($directory, $file_name);
my $archive_fh = IO::Uncompress::Unzip->new($full_file_name) or
die qq(ERROR: Cannot open file "$full_file_name" for reading.);
my $status;
for ($status = 1; $status > 0; $status = $archive_fh->nextStream()) {
say $archive_fh->getHeaderInfo->{Name};
last if $status < 0;
}
}
}
Но я получаю тот же вопрос. Похоже, что метод nextStream
вызывает ошибку. Здесь что-то не хватает? Есть ли способ увидеть, есть ли следующий поток, прежде чем я его извлечу?
Вам нужно использовать IO :: Uncompress :: Unzip? Архив :: Zip и Archive :: Extract имеют гораздо более приятные интерфейсы. – Schwern
Это может быть правдой, но 'IO :: Uncompress :: Unzip' поставляется с Perl, а остальные - дополнительными модулями, которые должны быть установлены с помощью CPAN. Я бы предпочел использовать стандартные модули, когда они доступны, поскольку я знаю, что они будут там независимо от того, на каком компьютере я нахожусь. –
Просто попробовал эквивалент того, что вы делаете в случайном файле jar. Отлично. Какую версию IO :: Uncompress :: Unzip вы используете? – pmqs