-2

下面的代码是脚本的一部分,我在其中合并不同目录的文件。合并后,我将剩余的文件复制到最终目录中。合并工作正常,但在复制文件时我得到

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`;
     }
 }

谁能帮我解决这个问题...

4

2 回答 2

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,不如只检查文件是否存在于另一个目录中?例如

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会给你关于你做错的事情的信息。这是一件好事。

于 2013-01-03T12:35:48.763 回答
1

cp 的参数是形式的cp from to,但你有cp from,to

这可能就是它抱怨参数数量的原因 -$UERRC1/$k,$DATA_DIR是一个单一的参数。它应该是cp $UERRC1/$k $DATA_DIR,就像在您的打印声明中一样。

于 2013-01-03T11:23:18.323 回答