这是我的第一个问题。我想通过使用Perl来实现以下目标 代码应搜索File2中File1中提到的参数,并将文件2中“:”后面的值替换为File1中的值。代码应该就地替换,不要更改/排序文件中的参数顺序。
文件1:
config1: abc
config2: bcd
config3: efg
文件2:
config1: cba
config2: sdf
config3: eer
config4: 343
config5: sds
config6: dfd
输出 - > File2应如下所示:
config1: abc
config2: bcd
config3: efg
config4: 343
config5: sds
config6: dfd
答案 0 :(得分:1)
File::Slurp
读取文件1
split
或正则表达式将键与值分开,并将此键值对附加到%file
哈希值。-pi
参数; (你可以尝试使用Tie::Hash
,但可能会更难)。File::Slurp
将file2读入哈希%file2,使用%file1
的循环覆盖%hash2
值覆盖%hash2
值,来模仿此问题。在正确的循环中构造key-valye字符串后,再次使用%hash2
将结果File::Slurp
写回file2。如果您在执行特定步骤时遇到困难,请显示您已完成的操作以及问题所在,以便我们帮助您排查问题
答案 1 :(得分:-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