Question

Semicolon in PERL replace string

Asked by: hutter

I'd like to replace all "@" in returned FORM input values by HTML "@":

$value =~ s/\@/@/g;

Problem is: the semicolon seems to terminate the line. I tried "\;" but that won't work either. I guess it's simple, but I can't find the clue...

TIA!

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2003-09-17 at 01:54:59ID20741035
Tags

perl

,

replace

,

string

Topic

CGI Scripting

Participating Experts
5
Points
500
Comments
17

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. semicolon after for  statement
    I have the following 3 for loops with a semicolon after each. Im not sure how each affects the other for loops ... does it act like nested loops? Thanx for (i=0; !isspace(src); i++); for ( ; isspace(src); i++); for (j = 1; !isspace(src) && src; dst[j++] = src[i++]); ...
  2. semicolon separated parameter url
    how can asp file identify a semicolon separated parameter in url. AS perl thier iis setting for this. ASP understand only & separated parameter in url. any body face this problem. plesae advise me what to do for this . either any setting in iis or any where in asp prog...
  3. URGENT: Missing semicolon (;) at end of SQL stateme…
    Hey Experts, I have a table with the fields: id and idCustomer An insert into this table ( nnOrder ) fails insert into nnOrder (idCustomer) values (6) where id = 68 Error message is Missing semicolon (;) at end of SQL statement. what's the problem? TIA

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: zero303Posted on 2003-09-17 at 04:23:46ID: 9377167

$value =~ s/\@/&#64/g;
$value.=";";



 

by: ChunkBlowerPosted on 2003-09-17 at 09:34:25ID: 9379449

Zero's code will not work if there is more than one replacement needed, as it will only add 1 semicolon to the very end, not one to the end of each '@' replaced.

This will work:
$value =~ s|@|@|g;

Remember, you're not bound to using forward slashes.

 

by: ahoffmannPosted on 2003-09-17 at 14:17:06ID: 9381718

$value =~ s/@/@/g;

should work too, except you have set

$value = "aa@bb";if in doubt, insert:

use strict;

 

by: TintinPosted on 2003-09-17 at 15:00:54ID: 9382048

In general, if you want to HTML escape any values, use escapeHTML from the CGI module, eg:

$field = $q->escapeHTML(param{field});

 

by: hutterPosted on 2003-09-17 at 23:26:15ID: 9384135

Hi all,

thanks a lot for the input.

ChunkBlower: I don't see what the use of "|" instead of "/" should change. In fact: it simply doesn't work...
ahoffmann: It should? But it doesn't. I mean, I am no PERL expert... All substitutions in this area of my code are executed. Just the @-sign doesn't get removed. And I guess that's because the ";" terminates the line prematurely. Perhaps it has another reason? - What do you mean by

except you have set $value = "aa@bb"; ?

Of course the email address is of this type. But does the value of $value affect my code?

use strict; definitely is no option for now. I'd have to rewrite tons of lines of code...

Tintin: could you elaborate a bit more on that escapeHTML? Is this module available on every machine? What is $q? What is param{field}?

Tia

 

by: ahoffmannPosted on 2003-09-18 at 00:11:54ID: 9384349

> Of course the email address is of this type.
and
> use strict; definitely is no option for now

try it, and you get a full description whats wrong with "aa@bb". I'm pretty shure that this is your problem. Define
  $value="aa\@bb"
then it should work.

> .. could you elaborate a bit more on that escapeHTML ..
i.g. use CGI is a good idea:

use CGI;
my $q =new CGI;
$value=$q->escapeHTML($value);

 

by: hutterPosted on 2003-09-18 at 03:55:22ID: 9385177

On my local machine (Win XP) your code doesn't work. Using the command line I get no error messages, but with http the response is an empty page.

I guess it would be the easiest way to parse the string char by char and replace the @ "by hand".

Any more ideas, anyone?

 

by: zero303Posted on 2003-09-18 at 04:00:56ID: 9385192

would this work?


$check = "@";
$value =~ s/\@/$check/g;

 

by: djplaistowPosted on 2003-09-18 at 08:20:29ID: 9386952

#-----------------------------------------------------
use URI::Escape;

my $value = qw[jim@myCo.com];
print "$value\n";
$value = uri_escape( $value );
print "$value\n";
#-----------------------------------------------------
The above script will print:
jim@myCo.com
jim%40myCo.com

It is perfectly acceptable to escape '@' with "%40" according to RFC 1738. The primary thing that other solutions have been missing is the use of qw. It works alot of magic here.  If you remove qw, i.e. change the second line to:
       my $value = "jim@myCo.com";
you should notice that the results then become:

jim.com
jim.com

This is because the perl interpreter  performs variable interpolation before the assignment happens. That is, it replaces the array, @myCo, with its current value; which of course is nothing. I am sure this is the source of your problem. You could of course change the script to get exactly what you asked for, but I think the more general solution, as Tintin was suggesting, provided by URI::Escape or escapeHTML is preferable. The script modified to give exactly what you requested (notice that it uses your original regex; there was never anything wrong with it):

#-----------------------------------------------------
use URI::Escape;

my $value = qw[jim@myCo.com];
print "$value\n";
$value =~ s/\@/@/g;
print "$value\n";
#-----------------------------------------------------

 

by: ahoffmannPosted on 2003-09-18 at 13:28:41ID: 9389241

djplaistow, are you aware that uri_escape() is different to escapeHTML()?
 > On my local machine (Win XP) your code doesn't work.
hutter, my code works! even on some strange M$ boxes.
Either the culprit is your M$ XP, or your version of perl, or whteveryoucanthinkofinconjunctiontoM$

PLease use my example in a single file, start it from command line (cmd.exe) and post complete result.

 

by: djplaistowPosted on 2003-09-18 at 13:57:59ID: 9389435

Of course everyone is aware that uri_escape() and escapeHTML() are two different things; hence the two different names. I suppose there is no harm in stating the obvious. However, the point was to prefer the generic solution provided by URI::Escape    ----- OR -----    escapeHTML to a solution that will only work for a single character. I tested my code on my Win2000 box with a version ActiveState Perl and The OpenPerlIDE; it works fine.

I don't think ahoffman's solution is viable whether it works in our contrived examples or not. The problem is that hutter is getting the email address from a web form. There are an infinite number of possibilities, and hutter can't escape the '@' manually for all of them. qw seems to be the only reasonable solution to inhibiting  the interpreter's variable interpolation.

 

by: ahoffmannPosted on 2003-09-18 at 14:34:51ID: 9389656

uri_escape() and escapeHTML() do different things!
One is for HTTP, the other for HTML.

> The problem is that hutter is getting the email address from a web form.
hmm, don't think so, 'cause hutter posted that it is et like:
  $variable="aa@bb";
If it is from the form, perl quotes the value propper, and won't complain, usually.

 

by: djplaistowPosted on 2003-09-18 at 15:02:34ID: 9389802

ahoffmann>  uri_escape() and escapeHTML() do different things!
Yes, I'll say it again:
      "uri_escape() and escapeHTML() are two different things; hence the two different names"
Did you catch that when I said it earlier? Do you realize that I am agreeing with you?

What they have in common is that they both provide generic solutions, that was my whole point; prefer generic solutions to specific ones.

ahoffmann>hmm, don't think so
Read hutter's first sentence in his original post. What does he mean by: "in returned FORM input values" ? Of course he is not trying to find out how to do it in this one specific instance. If he was, then all he would need to do is set $value to "aa@bb" and not worry about programatically replacing the '@'

 

by: ahoffmannPosted on 2003-09-18 at 23:32:44ID: 9391473

> Did you catch that when I said it earlier?
yes. but could be read otherwise too. Sorry for misunderstanding.

> What does he mean by: "in returned FORM input values"?
seems to be clear for everyone.
But in a following post we read: "Of course the email address is of this type. But does the value of $value affect my code?"

So best would be posting the relevant code parts:
  1. code which sets $value initially
  2. code which changes $value
and: which version of perl? which other options are used (like -T)

 

by: hutterPosted on 2003-09-19 at 01:05:57ID: 9391857

I had prepared a long reply with all facts, then decided to do some more testing...

Strange enough: It simply works. With my original code. Don't ask me why. Maybe I just didn't see the substitution (as @ is an HTML-entity and is displayed as an @-sign (in fact that's what it's all about...). Although I am sure I looked at the source code. Anyway. The problem was definitely not the lacking "qw", as the value made its way safely into my script. Sorry to have bothered you. I will share the points between you.

 

by: zero303Posted on 2003-09-19 at 01:11:32ID: 9391870

Didn't share with me :(

 

by: hutterPosted on 2003-09-19 at 01:27:25ID: 9391917

Puzzle solved!

To update you on the full story: The script that was in question was part of a guestbook.  As I got lots of junk entries from people advertising their business I added a confirmation form that passes the original values to the guestbook after the user enters a generated random number. This second form converted my "@" back to "%40".

Solution: Move the substitution code from script A to script B. Done...

Thanks a lot for your assistance, even if I didn't give you any idea of the *real* problem.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...