【发布时间】:2010-01-07 23:30:11
【问题描述】:
我绝对是 Perl 的新手,如果这对你来说是个愚蠢的问题,请原谅我。
我正在尝试用 Perl(ActivePerl、jzip、Windows XP)中的 jzip 解压缩一堆 .cab 文件:
#!/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”,因为我认为它与这个问题完全无关。 老的: 使用严格; 使用警告;
use File::Find;
use IO::File;
use File::Copy;
use XML::DOM;
use DBI;
use v5.10;
新:
#!/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 替换为提取物,如下面的@ghostdog74 指出的那样。
【问题讨论】:
-
jzip 是否要求任何用户反馈?它是否警告不要覆盖现有文件并等待是/否回答?
-
是否有特定文件失败?如果您尝试打印出 $cmd,它会在停止之前到达哪一个?如果您自己运行该命令会发生什么?它是否执行任何交互操作,例如等待按键或输入?您是否以同一用户身份运行脚本?
-
@John Enabling
strict,warnings,声明一个 perl 版本——我希望所有新的 Perl 程序员写的代码都像你的那样“糟糕”! -
@mopoke:我尝试手动运行命令,它们都运行良好。
-
Perl 的系统、qx 和反引号调用都是同步的——Perl 在继续之前等待函数完成。