读取和写入同一文件

时间:2013-01-07 07:47:50

标签: perl

我正在使用我在网上找到的代码来读取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中添加一些文字?

2 个答案:

答案 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模块来读取像您这样的简单配置文件。据我所知,它是唯一可以保留原始文件中任何注释的模块。

有两点需要注意:

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

  2. 如果您需要围绕a值的引号,那么在分配给哈希元素时必须明确添加这些引号,就像我在这里使用'"Some text"'

  3. 一样

    我认为该计划的其余部分是不言自明的。

    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"