题
我在Windows上使用Perl(活动Perl)。我有一个PERL程序可以将文件封闭到当前文件夹中,并使用从内部使用的DOS COPY命令将它们全部串联到使用System()...
当我执行时,这给出了一个DOS错误,说“系统找不到指定的文件”。它与我拥有的文件名中的空间有关。
这是Perl代码: -
@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{
if($firsttime == 1)
{
@args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
system (@args);
#system("copy /b '$_'+$outfile $outfile");
$firsttime = 0;
}
else
{
@args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
system (@args);
#system("copy /b $outfile+'$_' $outfile");
}
}
Glob返回我当前文件夹中的文件名数组,这些文件名称之间的空格在其中,因此数组元素之间有空格。当我使用系统(...)使用“ $ _”在这些数组元素上执行我的复制命令时,如上所述,它会产生错误。
我尝试了几种可以调用系统(...)但没有成功的方式。
我想知道,
1]如何使用上面的代码对其之间的空间进行此操作。如何在文件名中“逃脱”空白。
2] PERL中的任何替代解决方案都可以实现相同的目标。 (欢迎简单的人..)
解决方案
您的代码不会在文件名周围添加任何引号。
尝试
"\"$_\""
和
"\"$outfile\""
其他提示
停止使用 system()
要使用便携式库可以完成呼叫。 Perl有一个 文件::复制 模块,使用它,您不必担心这样的事情,而且您的操作系统可移植性要好得多。
system
很少有正确的答案 use 文件::复制;
串联所有文件:
use File::Copy;
my @in = glob "*.mp3";
my $out = "final.mp3";
open my $outh, ">", $out;
for my $file (@in) {
next if $file eq $out;
copy($file, $outh);
}
close $outh;
当您尝试访问变量时,可能会出现问题 $_
在内部块内。最安全的方式,更改:
foreach (@files)
到:
foreach $file (@files)
然后进行必要的更改 @args
, ,并逃脱双重引用将它们包括在字符串中。
@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile");
...
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile");
在Windows中,您通常可以在文件名(和/或路径)周围放置双引号,即允许特殊字符,即“长文件名”。
c:“我的长路径这是一个file.mp3”
编辑:
这不起作用吗?
system("copy /b \"$_\"+$outfile $outfile");
(请注意字符串中的双引号,而不是单报价)
$ filename = 〜s / / /;;
文件名只是使用斜杠来折叠空间
不隶属于 StackOverflow