At 01:38 PM 1/16/2004, James Edward Gray II wrote: >I have a problem I just cant seem to get my head around, so any help is appreciated. > >I have a string. It could contain anything a Perl string can contain. >I have to print this string to a file and later bring it back in exactly as it was. >However, because of the file format, the string in the file may not contain \n >characters. That's the only difference between the two representations of this >string. > >Okay, obviously I need to replace all \n characters. Let's say I want to follow >Perl's example and use a literal \ followed by a literal n. >Then I would also need to escape \ characters. Okay, again we'll use Perl's \ and >another \. Does that cover everything if \n is the only illegal character in my file >format? I believe, so, but please correct me if I'm wrong. > >The to file conversion seems simple given the above: > >$string =~ s/\\/\\\\/g; >$string =~ s/\n/\\n/g; > >Does that work as good as I think it does? > >Now I have to get it back out of the file and that's where it falls apart on me. >I've tried things like: > >$string =~ s/((?:^|[^\\])(?:\\\\)*)\\n/$1\n/g; >$string =~ s/\\\\/\\/g; > >While that gets close, it doesn't seem to work on everything. Here's an example >(one-liner reformatted for easier reading): > >perl -e ' $test = "\tFunky \"String\"\\\n\n"; > print "String: $test\n"; > $test =~ s/\\/\\\\/g; > $test =~ s/\n/\\n/g; > print "To File: $test\n"; > $test =~ s/((?:^|[^\\])(?:\\\\)*)\\n/$1\n/g; > $test =~ s/\\\\/\\/g; > print "From File: $test\n" ' >String: Funky "String"\ > > >To File: Funky "String"\\\n\n > From File: Funky "String"\ >\n > >Any advice is appreciated.
I just had to do something like this yesterday, and I couldn't figure out how to do it in just one regex, but I did find a way that you could use. I have a database giving me single and double quotes in variables as their octal equivalent. I get a variable from the database as: Dan\047s \042Baby\042 and I need the variable converted back to: Dan's "Baby" So, I did the following, @words is a list of variables to convert # change octal \0nn to the appropriate character foreach (@words) { while ($_ =~ /\\(0\d{2})/) { my $myChar = chr(oct $1); $_ =~ s/\\$1/$myChar/g; } } This works, but I am sure there is a better way to code this, and I was thinking of asking that when I had time. To use it, instead of coverting newlines to \n, convert them to \012. -Mark -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>