如何使用perl将文件从一个文件夹复制到另一个文件夹,扩展名不同

时间:2014-08-13 11:45:24

标签: perl

#!/usr/bin/perl 
use File::Copy; 
print "content-type: text/html \n\n"; #The header 
$filetobecopied = "C:\Users\avinash\Desktop\mktg/"; 
$newfile = "C:\Users\avinash\Desktop\elp/"; 
copy("$.pdf","$.elp") or die "File cannot be copied.";

以上程序我已经习惯了输出但是得到错误任何人都可以帮我解决代码

2 个答案:

答案 0 :(得分:1)

如果使用反斜杠,请对字符串使用单引号,或将反斜杠加倍。在双引号中,许多反斜杠字符具有特殊含义:

my $newfile = "C:\Users\avinash\Desktop\elp/";
print $newfile;

输出:

C:SERSVINASHDESKTOPP/

也有一些隐藏的角色:

0000000: 433a 5345 5253 0756 494e 4153 4844 4553  C:SERS.VINASHDES
0000010: 4b54 4f50 1b4c 502f                      KTOP.LP/

答案 1 :(得分:0)

您的脚本存在三个大问题。

  1. 始终在每个perl脚本中包含use strict;use warnings;

    使用这两个Pragmas是成为更好的程序员可以做的第一件事。此外,如果他们看到您正在进行此基本尽职调查以自行追踪错误,那么您将始终获得专家的更多帮助。

    在这种情况下,您实际上会在代码中收到两条警告:

    Use of uninitialized value $. in concatenation (.) or string at script.pl line 6.
    Use of uninitialized value $. in concatenation (.) or string at script.pl line 6.
    

    因此,您的第copy("$.pdf","$.elp")行正在插入未定义的变量$.,因为您无法从文件中读取。

  2. 以双引号字符串转义反斜杠

    反斜杠在文字字符串定义中具有特殊含义。如果你想在双引号字符串中使用文字反斜杠,那么你需要转义它。

    在这种情况下,正在翻译以下内容:

    • \Uuc函数
    • \a是一个警报代码
    • \D只是文字D

    要解决此问题,您需要使用单引号字符串或转义反斜杠

    my $filetobecopied = "C:\\Users\\avinash\\Desktop\\mktg"; # Backslashes escaped
    
    my $filetobecopied = 'C:\Users\avinash\Desktop\mktg';     # Single quotes safer
    

    此外,我无法弄清楚为什么你的两个字符串都有一个正斜杠。

  3. 输出错误消息:$!

    始终在错误消息中包含尽可能多的信息。在这种情况下,File::Copy执行以下操作:

      

    所有功能在成功时返回1,在失败时返回0。如果遇到错误,将设置$!

    因此,您的or die语句应包含以下内容:

    copy("fromfile","tofile") or die "Can't copy: $!";
    

    为了获得更好的调试信息,您可以包含要发送到复制的参数:

    copy("fromfile","tofile") or die "Can't copy fromfile -> tofile: $!";
    
  4. 无论如何,这三件事将帮助您调试脚本。根据您提供的信息,仍然无法完全解释您的意图,但以下是更好格式代码的存根:

    #!/usr/bin/perl 
    use strict;
    use warnings;
    
    use File::Copy; 
    
    print "content-type: text/html \n\n"; #The header 
    
    # The following is likely wrong, but the best interpretation of your intent for now:
    my $filetobecopied = 'C:\Users\avinash\Desktop\mktg.pdf'; 
    my $newfile        = 'C:\Users\avinash\Desktop\elp.elp'; 
    
    copy($filetobecopied, $newfile)
        or die "Can't copy $filetobecopied -> $newfile: $!";