Jan Eden wrote:

> Hi,
>
> [EMAIL PROTECTED] wrote:
>
> >I have a text file with a records like:
> >
> >smith, James, Dr., 115 Fourth Street, Chicago, IL, 32012, $20.00:
> >[EMAIL PROTECTED]
> >
> >and another text file with placeholders like:
> >
> >Hello $last_name, $first_name:
> >
> >I want to read the first textfile and update the second one.
> >
> >Any ideas!
>
> This is a very general question. Have you already tried something? Have your read an 
> Introduction to Perl (O'Reilly's "Learning Perl" is highly recommended)?
>
> Basically, what you have is a data file and a template file. You should open the 
> data file and read the data into a hash (using pattern matching), then merge the 
> hash and the template file (replacing your placeholders), putting out a scalar 
> variable for each set of data.

I would do it the other way around.  I am guessing here that the OP wants to use the 
second file as a tameplate, as you suggest also, but consider the use of a template.  
He probably does not want to actually update the original, but to spawn personalized 
copies for each customer/recipient record in the data file.

Since the text of the template is the material that would be repeated each time 
through the loop, the text is what he should slurp.  Then he can go through the 
data-file record by record, making a personalized version from the template for each 
one.

Of course I could be wrong--the OP might really want to modify the template itself.  
In that case, he would first have to decide which record he would want to take the 
values from

For the time being, though, I am assuming that he simply misstated the procdure.  If 
he has the template in memory as a concatenated string, he can substitute in the 
proper variables for the place holders with each record

my $template_string = get_file_contents();
my $contact = {};
my $count = 0;
while (<DATA_FILE>) {
   chomp;
   ($contact->{'last name'}, $contact->{'first name'} ...$conatact->{'current 
balance'}) = split /,\s+/, $_;
   (my $inerpolated_string = $template_string) =~ s/%(.*?)%/$contact->{$1}/g;
   open(OUT_FILE, 'boiler_plate' . ++$count . '.txt'
   print OUT_FILE $inerpolated_string;
}

This should work alright.  Took a few rounds to get the typos out, but the following 
worked from the command line:
my $template_string = 'Hello, %first name% %last name%, how are you';

my $contact = {};
my $count = 0;
while (<DATA>) {
   chomp;
   ($contact->{'last name'}, $contact->{'first name'}) = split /,\s+/, $_;
   (my $interpolated_string = $template_string) =~ s/%(.*?)%/$contact->{$1}/g;
   open(OUT_FILE, '>boiler_plate' . ++$count . '.txt');
   print OUT_FILE $interpolated_string;
}
__DATA__
Smith, John
Doe, Jack

The file rendered were:
boiler_plate1.txt
Hello, John Smith, how are you
boiler_plate2.txt
Hello, Jack Doe, how are you

Joseph


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to