没有这样的文件或目录错误:Perl

时间:2014-06-20 20:04:04

标签: regex perl

我在Perl中很天真。我已经编写了以下代码,因为我在尝试打开文件时出现以下错误,所以我在两天后就崩溃了:No such file or directory at line 23 (open (FILE, "$config_file") or die $!;)

我在做的是:

  1. 打开文件夹并列出其中的所有文件。
  2. 遍历每个文件以查找特定字符串。
  3. 为所有文件创建新文件,并将匹配的字符串替换为其他字符串。
  4. 我真的很感谢你的帮助。 以下是我的代码:

    #!/usr/bin/perl -w
    #~ The perl script that changes the IP addresses in configuration files from 192.168.3.x into 192.168.31.x in any particular folder
    
    use strict;
    use warnings;
    use diagnostics;
    
    #~ Get list of files in the Firewall folder
    my $directory = 'C:\Users\asura\Desktop\ConfigFiles\Firewall';
    opendir (my $dir, $directory) or die $!;
    my @list_of_files = readdir($dir);
    my $file;
    while ($file = readdir ($dir)) {
        push @list_of_files, $file;
    }
    closedir $dir;
    print "@list_of_files\n";
    
    #~ Iterate over each files to replace some strings
    foreach my $config_file (@list_of_files) {
      next unless (($config_file !~ /^\.+$/));
      open (FILE, "$config_file") or die $!;
      my @original_array = <FILE>;
      close(FILE);
      my @new_array;
      foreach my $line (@original_array) { 
        chomp($line);
        $line =~  s/192\.168\.3/192\.168\.31/g;
        push (@new_array, $line);
      }
      print @new_array;
    
    #~ Create a new files with modified strings
      my $new_config_file = $config_file.1;
      my $newfile = 'C:\Users\asura\Desktop\ConfigFiles\Firewall\$new_config_file';
      open (NEW_FILE, ">", "$newfile") or die $!;
      foreach (@new_array){
         print NEW_FILE "$_\n";
      }
      close(NEW_FILE);
    }
    exit 0;
    

2 个答案:

答案 0 :(得分:4)

当您将项目推送到@list_of_files时,您只推送文件名(从readdir返回的值)。除非您的脚本在C:\Users\asura\Desktop\ConfigFiles\Firewall中运行,否则仅使用文件名(相对路径)的第22行的open将失败。

您需要在第14行将绝对路径推送到@list_of_files,如下所示:

push @list_of_files, $directory . "\\" . $file;

另外,正如@ Michael-sqlbot提到的那样,你需要在第35行引用字符串,以便执行字符串插值(或使用连接)。

最后,您还应该在第34行正确引用字符串连接。

答案 1 :(得分:3)

以下是删除错误的代码的简化。

首先要在每个脚本中获得荣誉,包括use strictuse warnings。您可以随时使用use autodie;一个额外的工具进行文件处理。

代码中的主要缺陷是您在打开文件时不包含路径信息。有两种主要方法可以解决这个问题。您可以手动指定路径,就像您对输出文件句柄的open所做的那样,或者您可以使用glob代替opendir,因为它会自动包含返回结果中的路径

你的正则表达式中有一个次要错误,你在.3之后错过了一个单词边界。这将导致三十年代的数字错误地匹配。

为了简化你的代码我只是删除了所有多余的临时变量,而是逐个文件地逐行处理。当输入和输出文件句柄明显相关时,这有利于使其更清晰。最后,如果您真的想要编辑文件,那么perlfaq4会展示很多方法。

#!/usr/bin/perl -w
#~ The perl script that changes the IP addresses in configuration files from 192.168.3.x into 192.168.31.x in any particular folder

use strict;
use warnings;
use autodie;
use diagnostics;

#~ Get list of files in the Firewall folder
my $dir = 'C:\Users\asura\Desktop\ConfigFiles\Firewall';

opendir my $dh, $dir;

#~ Iterate over each files to replace some strings
while (my $file = readdir($dh)) {
    next if $file =~ /^\.+$/;

    open my $infh, '<', "$dir\\$file";
    open my $outfh, '>', "$dir\\${file}.1"; #~ Create a new files with modified strings

    while (<$infh>) {
        s/(?<=192\.168)\.3\b/.31/g;
        print $outfh $_;
    }

    close $infh;
    close $outfh;
}
closedir $dh;