【发布时间】:2014-12-15 16:19:26
【问题描述】:
为了在 Windows 上使用 XMLLINT 递归处理一些 XML 文件,我编写了一小段代码
#!C:\Perl64\bin\perl
$ENV{PATH} = 'C:\Users\NLP-Lingua\Desktop\echos';
my $racine = $ENV{PATH};
&recurse($racine);
sub recurse {
my $dossier = shift(@_);
opendir(DOSSIER, $dossier);
my @files = readdir (DOSSIER);
#print "liste des fichier de $dossier : @files\n";
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
my $file = $dossier."/".$file;
if (-f $file) {
#print $file, "\n";
if (($file =~ /\.xml$/)) {
system("C://toolslibxml//xmllint.exe --dropdtd --noent $file > $file\_out");
open (OUT, ">$file\_translated.xml");
}
close(IN);
}
}
if (-d $file) {
&recurse($file);
}
}
close IN;
close OUT;
此代码在 Ubuntu 上完美运行,但我在重定向输出时遇到了问题
C://toolslibxml//xmllint.exe --dropdtd --noent $file 到一个文件中,如果我使用运算符 ">" 所有输出都打印到屏幕上,但如果我把它放回去,文件是空的,我也尝试过使用反引号和变量的变体结果是一样的
在提示命令下命令
C://toolslibxml//xmllint.exe --dropdtd --noent file > out_putfile 工作完美,所以很奇怪
提前致谢
【问题讨论】:
-
我对windows真的不是很坚定,但是你写的代码看起来像是直接从90年代开始的:使用
strict和warnings,三个参数open,&子程序调用不需要,您应该在打开时检查错误(use autodie或成语open … or die $!。您是否考虑过使用ICP::Run?这可能会解决您的重定向问题。另外,您应该使用@987654332 @(这是一个核心模块)来连接路径(因为你在那里也有问题)。 -
你到底为什么要换
$ENV{PATH}? -
你
close(IN)(两次),但你从不打开它。$file\_out也是一个 hack,我很惊讶它可以工作。正确的方法是${file}_out。或者更好的是,my $file_out = $file . "_out";,然后插入该变量。然后你打开一个OUT文件,但你从来没有向它打印任何东西。当你说这“完美”时,我倾向于不相信你。