-1

这将是我的第一个问题。我想通过使用 Perl 来实现以下目标。
代码应在 File2 中搜索 File1 中提到的参数,并将 File2 中“:”后面的值替换为 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
4

2 回答 2

1
  • 用于File::Slurp读取文件1
    • 对于每一行,使用split或正则表达式将键与值分开,并将此键值对附加到%file哈希中。
  • 要真正就地替换,请在-piPerl 的命令行中使用参数;(您可以尝试使用Tie::Hash,但可能会更难)。
  • 您可以通过将 file2 读取File::Slurp到哈希 %file2 中来模仿这一点,使用 的键上的循环将值覆盖%file1在值之上,并在正确循环中构造键值字符串后再次使用 a将结果写回 file2 .%hash2%hash2%hash2File::Slurp

如果您在特定步骤中遇到困难,请说明您所做的事情以及问题所在,以便我们帮助解决

于 2013-10-04T12:33:39.453 回答
-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
于 2013-10-04T15:21:47.783 回答