下面的代码是脚本的一部分,我在其中合并不同目录的文件。合并后我将剩余的文件复制到最终目录中。 合并工作正常但在复制文件时我得到了
cp: missing destination file operand after `/users/abc/perl_scripts/temp_dir/b.cc'
Try `cp --help' for more information.
sh: line 1: /users/abc/perl_scripts/temp: is a directory
for $k(dir1) {
$flag=0;
for $j(@dir2) {
if("$k" eq "$j") {
&merge_gcov("$UERRC1/$k","$UERRC2/$k","$DATA_DIR/$k");
$flag=1;
last;
}
}
if($flag == 0) {
#print ">>>>>>>>>>>>> cp $UERRC1/$k $DATA_DIR/$k \n";
'cp $UERRC1/$k,$DATA_DIR`;
}
}
任何人都可以帮我解决这个问题......
答案 0 :(得分:5)
无论何时使用系统调用,您最有可能做一些多余的事情,在这种情况下肯定是多余的。 Perl非常能够复制文件。我推荐File::Copy
模块,它是perl 5中的核心模块。使用它很简单:
use File::Copy qw(copy);
copy $from, $to or die $!; # it is a good idea to check if the copy failed
此外,不是循环遍历@dir2
中的所有文件名,而是查看名称是否与$k
中的名称匹配,为什么不检查该文件是否存在于另一个目录中? E.g。
if (-e "$UERRC1/$k") { # check if file exists
merge_gcov("$UERRC1/$k", "$UERRC2/$k", "$DATA_DIR/$k");
} else {
copy "$UERRC1/$k", $DATA_DIR or die $!;
}
文件测试-e
的文档位于perldoc -f "-X"
你真的应该使用更合适的变量名。它将使您的代码更易读,更易于维护和调试。
也...
在您执行任何其他操作之前,您应该在脚本中添加以下两行并修复无疑出现的错误:
use strict;
use warnings;
strict
将强制您声明所有变量(通常使用my $foo
),这将删除由于变量名称中的拼写错误而难以检测的错误。错误消息将显示为“全局符号$ foo需要显式包名称...”。
warnings
会为您提供有关您做错事情的信息。这是一件好事。
答案 1 :(得分:1)
cp的参数格式为cp from to
,但您有cp from,to
。
这可能是它抱怨参数数量的原因 - $UERRC1/$k,$DATA_DIR
是单个参数。它应该是cp $UERRC1/$k $DATA_DIR
,就像你的打印声明一样。