我在Perl中很天真。我已经编写了以下代码,因为我在尝试打开文件时出现以下错误,所以我在两天后就崩溃了:No such file or directory at line 23 (open (FILE, "$config_file") or die $!;)
我在做的是:
我真的很感谢你的帮助。 以下是我的代码:
#!/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;
答案 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 strict
和use 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;