Perl 在linux上:cp:源文件后缺少目标文件操作数
下面的代码是脚本的一部分,我在其中合并不同目录的文件。合并后,我将剩余文件复制到最终目录中。 合并工作正常,但在复制文件时,我得到Perl 在linux上:cp:源文件后缺少目标文件操作数,perl,Perl,下面的代码是脚本的一部分,我在其中合并不同目录的文件。合并后,我将剩余文件复制到最终目录中。 合并工作正常,但在复制文件时,我得到 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 有人能帮
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
有人能帮我解决这个问题吗…cp的参数的形式是
cp-from-to
,但是您有cp-from-to
这可能就是它抱怨参数数量的原因-
$UERRC1/$k,$DATA\u DIR
是单个参数。它应该是cp$UERRC1/$k$DATA\u DIR
,就像在打印语句中一样。无论何时使用系统调用,都很可能是在做一些冗余的事情,在这种情况下,它肯定是冗余的。Perl非常能够复制文件。我推荐这个模块,它是Perl5中的核心模块。使用它很简单:
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
的文档可在中找到
您确实应该使用更合适的变量名。它将使您的代码更具可读性,更易于维护和调试
还有
在执行任何其他操作之前,应在脚本中添加以下两行,并修复出现的错误:
use strict;
use warnings;
strict
将强制您声明所有变量(通常使用my$foo
),这将消除由于变量名称中的拼写错误而难以检测到的错误。错误消息将显示“全局符号$foo需要显式包名…”
警告
将为您提供有关您做错事情的信息。这是一件好事 你的压痕很糟糕。看起来到处都在使用全局变量。您是否使用了警告
和严格
?不要用和调用subs。您的cp
行是语法错误(显示真实代码)。不要在void上下文中使用反勾号。发布一个完整的程序来演示这个问题。它只是脚本的一部分。。。完整的代码太大…问题是cp命令而不是SUB。。我更正了'cp$UERRC1/$k$DATA_DIR';您的for循环参数中是否有dir1
(一个空字)输入错误?如果您没有使用使用警告,这将是一个无声错误,循环只运行一次,$k
是字符串“dir1”
。因此,请更新您的问题以显示真实的代码(特别是cp行),并取消打印语句的注释,以确认所有变量都是您所期望的。
use strict;
use warnings;