2013-10-04 48 views
-1

这将是我的第一个问题。我想通过使用Perl来实现以下目标。
代码应该搜索File2中File1中提到的参数,并将文件2中“:”的值替换为File1中的值。代码应该就地替换,并且不要更改/排序文件中参数的顺序。Perl注意到一个文件中的变量,在另一个文件中搜索并替换它

文件1:

config1: abc 
config2: bcd 
config3: efg 

文件2:

config1: cba 
config2: sdf 
config3: eer 
config4: 343 
config5: sds 
config6: dfd 

输出 - >文件2应该是这样的:

config1: abc 
config2: bcd 
config3: efg 
config4: 343 
config5: sds 
config6: dfd 
+4

这听起来像功课(更换就地并保持参数顺序是在小KVP配置文件中具有零实际寿命相关性的任意约束)。你能告诉我你尝试过什么,遇到了什么困难? StackOverflow不是“为我做的工作/家庭作业”网站。 – DVK

回答

1
  • 使用File::Slurp读取文件1
    • 对于每一行,使用split或正则表达式将键和值分开,并将此键值对添加到%file散列中。
  • 要真正地在原地替换,请使用-pi参数到Perl的命令行; (你可以尝试使用Tie::Hash,但可能会更困难)。
  • 您可以通过阅读文件2使用File::Slurp到一个哈希%文件2,在铺设使用过的%hash2键循环%hash2值之上%file1值mimique这一点,使用后再次File::Slurp写造成%hash2回文件2在正确的循环中构造键 - valye字符串。

如果你有一个具体的步骤困难,请出示你做了什么,什么问题,所以我们可以帮助解决

+0

感谢您的回应......我已经创建了一个使用正则表达式的工作代码行......循环等......不是作业:P ......只是本网站的新用户。 –

-1
use strict; 
use warnings; 

#store params from file1 
my (%params); 

open(my $FILE1, "< file1.txt") or die $!; 
my @arr = <$FILE1>; 
foreach(@arr){ 
    #extract key-value pairs \s* = any number of spaces, .* = anything 
    #\w+ = any sequence of letters (at least one) 
    my ($key, $value) = ($_ =~ /(\w+)\s*:\s*(.*)/); 
    $params{$key}=$value; 
} 
close $FILE1; 

open(my $FILE2, "< file2.txt") or die $!; 
my @arr2 = <$FILE2>; 
foreach(@arr2){ 
    my ($key, $value) = ($_ =~ /(\w+)\s*:\s*(.*)/); 
    #if the found key did exist in params, then replace the found value, with 
    #the value from file 1 (this may be dangerous if value contains regexp chars, 
    #consider using e.g. \Q...\E 
    if (exists $params{$key}) { 
     #replace the row in @arr2 inline using direct ref $_ 
     $_ =~ s/$value/$params{$key}/; 
    } 
} 
close $FILE2 
#replace/output the result /here to a different file, not to destroy 
open(my $FILE2W, "> file2_adjusted.txt") or die $!; 
print $FILE2W @arr2; 
close $FILE2W 
相关问题