2

我有一个程序可以为 png 图像生成像素强度值,并且由于原始生成的文本文件出现一些故障,这些图像通常必须用同名的新文件覆盖。我的问题是,当我复制该文件的新版本时,目标目录是否必须先删除同名的目标文件,还是会覆盖目标文件?

system ("rm -rf /home/alos/Y2H_images/all$intensity");
system ("cp $intensity /home/alos/Y2H_images/all");

还是在 perl 脚本中执行复制命令会自动覆盖文件?谢谢

4

4 回答 4

4

执行命令的不是Perl,而是 Perl 以给定字符串作为参数调用的 shell。

是的,它就像任何普通副本一样——它会破坏任何现有的同名文件,就好像你自己在 shell 中输入它一样,并且在权限错误等时失败,就像你输入它一样自己的壳。

此外,通配符扩展和字符串转义是特定于 shell 的,出于可移植性和安全性原因必须考虑。

于 2011-07-28T13:55:20.083 回答
3

您可以简单地复制新文件,旧文件将被替换。

cp允许通过in标志控制覆盖行为;默认情况下,无论如何,文件都会被覆盖。

如果您希望在面对特定错误情况时安全,即无法打开目标文件,您可以指定-f标志:

 system ("cp -f $intensity /home/alos/Y2H_images/all");
于 2011-07-28T13:55:19.437 回答
2

正如评论中提到的,使用File::Copy确实是更好的解决方案。它将覆盖目标文件(至少在我的系统上)。

use File::Copy;
copy $intensity, "/home/alos/Y2H_images/all" or die $!;

如果您想检查目标文件是否已经存在,可以通过以下方式完成:

print "File exists: $intensity\n" if -e $intensity;

如果您仍希望在复制之前删除该文件:

unlink "/home/alos/Y2H_images/all$intensity" or die $!;
于 2011-07-28T14:55:31.203 回答
2

如果你调用它system,它就像“现实生活”一样。是的。

于 2011-07-28T13:56:11.807 回答