0

我正在使用我在网上找到的这段代码来读取我的 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

4

2 回答 2

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它是否包含非字母数字。

于 2013-01-07T11:00:38.990 回答
0

这是一个程序示例,它使用Config::Std模块读取和写入像您这样的简单配置文件。据我所知,它是唯一可以保留原始文件中任何注释的模块。

有两点需要注意:

  1. 中的第一个哈希键$props{''}{write_to_this_variable}构成将包含该值的配置文件部分的名称。如果没有部分,对于您的文件,那么您必须在此处使用空字符串

  2. 如果您需要在 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"
于 2013-01-07T12:50:38.993 回答