Это должно сработать:
#!/usr/bin/perl
use strict;
use warnings;
my ($to_change, $reference) = @ARGV[0,1];
my %pairs_ref;
my %pairs_change;
my $line = qr/^(\w+)\s+equalto\s+(\w+)/;
# read the reference file
open (my $fhr, '<', $reference) or die "Cannot read from file $reference: $!";
while (<$fhr>) {
if (/$line/) {
my ($param, $value) = ($1, $2);
$pairs_ref{$param} = $value; # store all pairs
}
}
close $fhr;
# read the file to be modified (note: we're not using in-place modification!)
open (my $fhc, '<', $to_change) or die "Cannot read from file $to_change: $!";
while (<$fhc>) {
if (/$line/) {
my $param = $1;
# if the parameter appeared in the reference file, set the value to the reference
# value (does no damage if they're identical anyway)
if (defined $pairs_ref{$param}) {
$pairs_change{$param} = $pairs_ref{$param};
}
}
}
close $fhc;
# print to the output file (that way we're not overwriting the original information)
open (my $fhn, '>', "file3") or die "Cannot write to file3: $!";
foreach my $param (sort keys %pairs_change) {
print $fhn "$param equalto $pairs_change{$param}\n\n";
}
close $fhn;
Это просто, и я использовал только ту информацию, которая была дана в вашем вопросе, поэтому я не знаю, действительно ли это то, что вы ищете,Я не учел никаких различий в количестве пробелов или около того.
Полученный файл (который я назвал 'file3') выглядит так:
value1 equalto doc
value2 equalto ref
value3 equalto txt
Сценарийбыть вызванным так:
./script.pl file1 file2