2013-01-07 264 views
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; 
} 

是否posssible也寫這個while循環中的文本文件?比方說,該文本文件看起來像這樣:

#Some comments 
a_variale = 5 
a_path = /home/user/path 

write_to_this_variable = "" 

我怎麼可以把一些文字write_to_this_variable

+1

嘗試MODE參數 - http://perldoc.perl.org/functions/open.html。 –

+4

你爲什麼不嘗試使用模塊爲你做閱讀和寫作?例如。請參閱[Config :: Tiny](https://metacpan.org/module/Config::Tiny)或[Config :: Simple](https://metacpan.org/module/Config::Simple)。 – stevenl

+3

你應該使用'open'三個參數版本以及詞法文件句柄和錯誤檢查。例如'打開我的$ config_fh,'<','myfile.properties'或者死掉$ !;' – dgw

回答

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': $!"; 

您可能需要sanitse你喜歡的東西\Q寫,如果它包含非字母數字文本。

0

這是一個程序的例子,它使用Config::Std模塊讀取一個像你的簡單配置文件寫入。據我所知,它是唯一的模塊,將保留在原始文件中的任何評論。

有兩點需要注意:

  1. $props{''}{write_to_this_variable}形式的配置文件部分將包含值的名稱的第一個哈希鍵。如果沒有分區,那麼你必須在這裏使用一個空字符串

  2. 如果你需要引用一個值,那麼當你指定散列元素時,你必須顯式地添加這些元素,就像我一樣這裏用'"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"