Я определенно новичок в Perl, и, пожалуйста, прости меня, если это покажется тебе глупым вопросом.
Я пытаюсь распаковать несколько файлов .cab с помощью jzip в Perl (ActivePerl, jzip, Windows XP):
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use IO::File;
use v5.10;
my $prefix = 'myfileprefix';
my $dir = '.';
File::Find::find(
sub {
my $file = $_;
return if -d $file;
return if $file !~ /^$prefix(.*)\.cab$/;
my $cmd = 'jzip -eo '.$file;
system($cmd);
}, $dir
);
Код распаковывает первые .cab файлы в папке и зависает (без ошибок). Он висит там, пока я не нажму Ctrl + c, чтобы остановиться. Кто-нибудь знает, в чем проблема?
РЕДАКТИРОВАТЬ: я использовал processxp для проверки процессов, и я обнаружил, что запущено правильное количество процессов jzip (на количество cab-файлов находится в исходной папке). Однако только один из них запускается под cmd.exe => perl, и ни один из этих процессов не завершается после запуска. Мне кажется, мне нужно закрыть процесс и выполнить его один за другим, что я понятия не имею, как это сделать в Perl. Есть указатели?
РЕДАКТИРОВАТЬ: я также пытался заменить jzip на блокнот, оказывается, он открывает блокнот с одним файлом за раз (в последовательном порядке), и только если я вручную закрываю блокнот, запускается другой экземпляр. Это обычное поведение в ActivePerl?
РЕДАКТИРОВАТЬ: Я наконец решил, и я до сих пор не совсем уверен, почему. Что я сделал, так это удалил библиотеку XML из скрипта, что не должно относиться к делу. Извините, что вначале я целенаправленно удалил «использовать XML :: DOM», так как думал, что это совершенно не относится к этой проблеме.
OLD:
использовать строгое;
используйте предупреждения;
use File::Find;
use IO::File;
use File::Copy;
use XML::DOM;
use DBI;
use v5.10;
NEW:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use IO::File;
use File::Copy;
use DBI;
use v5.10;
my $prefix = 'myfileprefix';
my $dir = '.';
# retrieve xml file within given folder
File::Find::find(
sub {
my $file = $_;
return if -d $file;
return if $file !~ /^$prefix(.*)\.cab$/;
say $file;
#say $file or die $!;
my $cmd = 'jzip -eo '.$file;
say $cmd;
system($cmd);
}, $dir
);
Это, однако, создает еще одну проблему: когда извлеченный файл уже существует, скрипт снова зависнет. Я очень подозреваю, что это проблема jzip, и альтернативой решения этой проблемы является простая замена jzip на extract, как @ ghostdog74 указал ниже.