Issue with s///

Discussion in 'Perl' started by Phil Jacobson, Aug 4, 2003.

  1. Good afternoon everyone.

    I'm trying to help a friend out with a client of his and I'm running
    into an issue with Perl's s/// operator. We've got about 100 pages of
    a simple shopping site. Each page has about 50-100 items on it.
    Originally the customer wanted prices posted online, but now he's
    decided he wants to have his customers call him for pricing. The
    existing pages look like this:

    <TD>1/6hp 115/1 R12</TD>
    <TD><A HREF="/cgi-bin/addtocart?item=AEA3414AXAXA&page=cndu.htm">
    <FONT COLOR="BLUE">$604.29</FONT></A></TD></TR>

    <TD>1/6hp 115/1 R134A</TD>
    <TD><A HREF="/cgi-bin/addtocart?item=AEA3414YXAXA&page=cndu.htm">
    <FONT COLOR="BLUE">$638.57</FONT></A></TD></TR>

    The first cell in each row is the part number. The second cell is the
    description of the part and the third cell is a link containing the
    price. The link will add the item to the user's shopping cart. I put
    in some carriage returns to make it easier to read, but in the actual
    HTML source, each table row is on one entire line with no carriage
    returns. What I'd like to do is extract just the link and replace it
    with "Call" which would look like this:

    <TR><TD>AEA3414AXAXA</TD><TD>1/6hp 115/1 R12</TD><TD>Call</TD></TR>
    <TR><TD>AEA3414YXAXA</TD><TD>1/6hp 115/1 R134A</TD><TD>Call</TD></TR>

    Because of the amount of links on each individual page, I couldn't
    just match the opening and closing <a> tag, I had to be more specific.
    I loaded the existing page into an array (@file) and chomped it, then
    I tried this code:

    1. foreach my $line (@file)
    2. {
    3. if ($line =~ /(<a href="\/cgi-bin\/addtocart\?item=.+<\/a>)/i)
    4. {
    5. my $found = $1;
    6. my $replacewith = "Call";
    7. my $newline = $line;
    8. $newline =~ s/$found/$replacewith/i;
    9. print TO "$newline\n";
    10. }
    11. else
    12. {
    13. print TO "$line\n";
    14. }
    15. }

    It didn't work. I ran the code again printing out the value in $found.
    The value in $found contains the exact string I'm trying to replace,
    but for some reason, the s/// operator won't do the swap. I started
    tinkering with line 3 and I noticed something peculiar, this will
    match and swap properly:

    3. if ($line =~ /(<a href="\/cgi-bin\/addtocart\?)/i)

    and this will match but not swap:

    3. if ($line =~ /(<a href="\/cgi-bin\/addtocart\?item)/i)

    Once I go past that question mark in the match, nothing swaps
    properly. I've tried using all the modifiers in the manuals and I've
    tried escaping and not escaping practically everything in the string.
    We're using Perl 5.8.0 build 805 by Activestate on XP with SP1. Any
    suggestions would be greatly appreciated. Thank you for your time.

    Phil Jacobson
    Phil Jacobson, Aug 4, 2003
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. JohnFol
    Aug 6, 2003
  2. Satinderpal Singh

    AppDomain Issue...

    Satinderpal Singh, Oct 27, 2003, in forum: ASP .Net
    Dan Ignatov
    Oct 27, 2003
  3. Catherine Jones

    rich text box issue

    Catherine Jones, Dec 11, 2003, in forum: ASP .Net
    Robert Jacobson
    Dec 11, 2003
  4. AJ

    Datatype issue

    AJ, Jan 12, 2004, in forum: ASP .Net
    Mattias Sjögren
    Jan 12, 2004
  5. Srini
    Arne Vajhøj
    Jun 1, 2008

Share This Page