Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 351
  • Last Modified:

Perl Substitution Table

I need to translate chunks of html that have made it into my text file, into just text. I am thinking of creating a text file that has two columns in it. One, with the html "'", and the other with the text to be inserted "'". Is there a way to have perl go through a text file, and use a text file as a translation reference. I am not sure how many things I am going to need to change, which is why I was thinking of using a text file, as it could handle 2 - 1000 changes...

Any thoughts on how to do this, without the ability to install any modules on the system?
0
stakor
Asked:
stakor
  • 3
  • 3
  • 2
1 Solution
 
wilcoxonCommented:
Sure.  Something like this should work (assumes text columns are separated by tabs).
use strict;
use warnings;
use File::Copy qw(mv);
open TXT, 'translate.txt' or die "could not open translate.txt: $!";
my %xlate;
while (<TXT>) {
    chomp;
    my ($old, $new) = split /\t+/;
    $xlate{$old} = $new;
}
close TXT;
my $fil = shift or die "Usage: $0 file_with_bad_text\n";
open IN, $fil or die "could not open $fil: $!";
while (<IN>) {
    foreach my $pat (keys %xlate) {
        s{$pat}{$xlate{$path}}g; # possibly \b$pat\b or \Q$pat - see what works for you
    }
    print;
}
close IN;

Open in new window

0
 
stakorAuthor Commented:
This seems to be close, but I am seeing the mark up characters disappear, instead.

The translate.txt file:
&#39;   '
&amp;quot; "

Open in new window


The Source file:
 boss&#39;s
as &amp;quot;This Test&amp;quot;.

Open in new window

0
 
wilcoxonCommented:
I see one typo that should have crashed the code (unless you removed the use strict and/or use warnings).

Line 16 should be $xlate{$pat} - not $xlate{$path}

Also, you can remove line 3 (use File::Copy qw(mv)) - I didn't end up using it.
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
stakorAuthor Commented:
The output now looks like:

boss's
as &amp;quot;This Test&amp;quot;.

The program looks like:
use strict;
use warnings;
open TXT, 'translate.txt' or die "could not open translate.txt: $!";
my %xlate;
while (<TXT>) {
    chomp;
    my ($old, $new) = split /\t+/;
    $xlate{$old} = $new;
}
close TXT;
my $fil = shift or die "Usage: $0 file_with_bad_text\n";
open IN, $fil or die "could not open $fil: $!";
while (<IN>) {
    foreach my $pat (keys %xlate) {
        s{$pat}{$xlate{$pat}}g; # possibly \b$pat\b or \Q$pat - see what works for you
    }
    print;
}
close IN;

Open in new window


The Translate text looks like:
&#39;   '
&amp;quot; "

Open in new window


So, the 's looks good, but the " does not yet.
0
 
ozoCommented:
see
perldoc -q "How do I efficiently match many regular expressions at once?"
0
 
stakorAuthor Commented:
I have found:

http://perldoc.perl.org/5.10.1/perlfaq6.html#How-do-I-efficiently-match-many-regular-expressions-at-once%3f

But honestly am not that good at perl yet. I think I can accomplish what I need with a set of sed commands. So, I will see if I can get that to work out for this project.
0
 
wilcoxonCommented:
You can certainly do it with a series of sed commands.

Did you ever get the code I provided working completely?  If not, are you still interested in it?  If so, I'll take a look sometime "soon" (I've been busy lately).
0
 
ozoCommented:
#!/usr/bin/perl
use strict;
use warnings;
@ARGV or die "Usage: $0 file_with_bad_text\n";
my $xlate;
{local @ARGV=qw(translate.txt);
  my $s;
  while( <> ){
      $s.="s{\\Q$1\\E}{$2}g;" if /(\S+)\s+(\S+)/;
  }
  die if $!;
  $xlate = eval "sub{$s}"
}
while( <> ){
    &$xlate;
    print;
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

  • 3
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now