Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在linux上:cp:源文件后缺少目标文件操作数_Perl - Fatal编程技术网

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;