Jeff, et al --

...and then Jeff 'japhy' Pinyan said...
% 
% On Aug 17, David T-G said:
% 
% >% That's good of you to show how you'd do it in another language (yes, even
% >% if that language is PHP ;) ), because it clears up what you want to do.
% >
% >Indeed.  It was the most succinct way to explain it :-)
% 
% This list (and many others) often receives questions about code without

Heh.  I know; I used to hang out here much more :-)


% ever showing even pseudo-code.  PHP has similar-enough syntax to Perl, so
% it's fine.

Indeed.  In fact, it was a breeze to pick up because I kn[oe]w perl.


% 
% >The
% >
% >  s{#(.*?)#}
% >
% >appears to look for my template strings.  And so then the {}ge part looks
% >similar to a standard s///ge, so that's probably where it's doing the
% >real work.
% 
% Yes.  I'm using s{}{} instead of s///.  I prefer the use of {} delimiters
% when I'm doing a s///e, because it better represents the "code" aspect of
% the replacement.

Ohhhhhhh...  Slick.  Can I use () or perhaps even [] as well?


% 
...
% >  { $xlate{$1} }
% >
% >means to return that to the caller, even though it isn't return()ed or
% >print()ed or whatever.
% 
% Yes; perhaps I should have been more explicit and said 'return ...'.

OK; as long as I'm still hanging on it's fine :-)


% 
...
% >  #key
% >
% >back out or the #$1 means something that I don't get.
% 
% Sorry, that was my typo.  It should be

*whew*


% 
%   else { return "#$1#" }
% 
% That is, if the text found between #'s isn't a key in the hash, just
% return the text with the #'s on either side of it.

Good deal.  So I followed the whole thing.  Awesome! :-)


% 
...
% >It's that funky map thing, though.  I don't have much experience with
% >that :-)
% 
% A simple way to look at map() and grep() is that they are merely for-loops
% that automatically build up a return list for you.  Here's a brief look at
% their equivalence:
[snip]

Thanks for the clear explanation.  That's a lot of help.

Hey, map is slick :-)


% 
% Compounded to this is the fact that both functions can be called with an
% EXPRESSION, rather than a BLOCK:
% 
%   @halves = map $_/2, @numbers;
%   @halves = map { $_/2 } @numbers;
% 
% mean the same thing really.  I used the 'expression' syntax.

Yep.  Very perl-ish and not surprising.


% 
...
% >  s/#(NAME_FIRST|NAME_LAST...)#/...
% >
% >and the replacement is the bucket value of the key in the hash.  Hey,
% >that's slick.
% 
% Exactly.

Neat.


% 
% >So why the map?  Is that just a way to apply quotemeta to each key in the
% >hash?
% 
% Yes.  If we wrote the map() as a for loop:
% 
%   my @safe;
%   for (keys %xlate) {
%     push @safe, quotemeta;  # it's default arg is $_
%   }
%   my $pattern = join '|', @safe;

So I see.  Very cool.

And my code runs!  It now looks like

  ...
     42 ### loop thru list
     43 while ( my @row = $result->fetchrow_array )
     44 {
     45   my ($ascii, $html, $flag, $email, $fn, $ln) = @row ;
     46   my $body =
     47     parseit
     48     (
     49       {ASCII=>$ascii,HTML=>$html},
     50       {flag=>$flag,EMAIL=>$email,NAME_FIRST=>$fn,NAME_LAST=>$ln}
     51     ) ;
     52     print "I got '$body' for .$row[3].\n";
     53 }
  ...
     62 # parse function
     63 sub parseit
     64 {
     65   my ($t,$u) = @_ ;
     66   my %template = %$t ;
     67   my %userdata = %$u ;
     68   my $body =
     69     $userdata{flag} ?
     70       $template{HTML} : $template{ASCII} ;
     71   my $keys = join('|',map(quotemeta,keys(%userdata))) ;
     72   $body =~ s/#($keys)#/$userdata{$1}/g ;
     73   return $body ;
     74 }
  ...

and works dandily :-)  I could probably clean up the two hashes I send to
parseit.  Hey, I wonder if

  my ($template{ASCII},$template{HTML},
    $userdata{flag},$userdata{EMAIL},$userdata{NAME_FIRST},
      $userdata{NAME_LAST}) = @row

because each of those is a single value...
/me wanders off muttering, but gleefully


Thanks again & HAND

:-D
-- 
David T-G                      * There is too much animal courage in 
(play) [EMAIL PROTECTED] * society and not sufficient moral courage.
(work) [EMAIL PROTECTED]  -- Mary Baker Eddy, "Science and Health"
http://justpickone.org/davidtg/      Shpx gur Pbzzhavpngvbaf Qrprapl Npg!

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to