我正在使用我在网上找到的代码来读取Perl脚本中的属性文件:
open (CONFIG, "myfile.properties");
while (CONFIG){
chomp; #no new line
s/#.*//; #no comments
s/^\s+//; #no leading white space
s/\s+$//; #no trailing white space
next unless length;
my ($var, $value) = split (/\s* = \s*/, $_, 2);
$$var = $value;
}
是否也可以写入此while循环中的文本文件?假设文本文件如下所示:
#Some comments
a_variale = 5
a_path = /home/user/path
write_to_this_variable = ""
如何在write_to_this_variable
中添加一些文字?
答案 0 :(得分:1)
覆盖具有可变长度记录(行)的文本文件并不实际。复制文件是正常的,如下所示:
my $filename = 'myfile.properites';
open(my $in, '<', $filename) or die "Unable to open '$filename' for read: $!";
my $newfile = "$filename.new";
open(my $out, '>', $newfile) or die "Unable to open '$newfile' for write: $!";
while (<$in>) {
s/(write_to_this_variable =) ""/$1 "some text"/;
print $out;
}
close $in;
close $out;
rename $newfile,$filename or die "unable to rename '$newfile' to '$filename': $!";
如果包含非字母数字字符,则可能需要使用\Q
之类的内容清理您正在编写的文本。
答案 1 :(得分:0)
这是一个程序示例,它使用Config::Std
模块来读取像您这样的简单配置文件。据我所知,它是唯一可以保留原始文件中任何注释的模块。
有两点需要注意:
$props{''}{write_to_this_variable}
中的第一个哈希键形成将包含该值的配置文件部分的名称。如果您的文件没有任何部分,那么您必须在此处使用空字符串
如果您需要围绕a值的引号,那么在分配给哈希元素时必须明确添加这些引号,就像我在这里使用'"Some text"'
我认为该计划的其余部分是不言自明的。
use strict;
use warnings;
use Config::Std { def_sep => ' = ' };
my %props;
read_config 'myfile.properties', %props;
$props{''}{write_to_this_variable} = '"Some text"';
write_config %props;
<强>输出强>
#Some comments
a_variale = 5
a_path = /home/user/path
write_to_this_variable = "Some text"