Hi,
sorry for the lengthy post.
I recently wrote a Perl script to convert 8-bit characters to LaTeX commands. The
first version (which works just fine) looks like this (the ... indicates more lines to
follow):
>#!/usr/bin/perl -pw
>
>s/â/{\\glqq}/g;
>s/â/{\\grqq}/g;
>s/Ã/\\'{a}/g;
>s/Ã/\\`{a}/g;
>s/Ã/\\^{a}/g;
>s/Ã/\\"{a}/g;
>....
Now I tried to use a hash instead of consecutive replacement commands. The second
version looked like this:
>#!/usr/bin/perl -w
>
>%enctabelle = ("â"=>"{\\glqq}",
>"â"=>"{\\grqq}",
>"Ã"=>"\\'{a}",
>"Ã"=>"\\`{a}",
>"Ã"=>"\\^{a}",
>....
>
>while (<>) {
> $zeile = $_;
> foreach $char (keys %enctabelle) {
> $zeile =~ s/$char/$enctabelle{$char}/g;
> }
> print $zeile;
>}
This worked, too, but it was extremely slow, obviously since the variables where
compiled over and over again.
I gave it a third try like this (code taken from someone else's script):
>%enctabelle = ("â"=>"{\\glqq}",
>"â"=>"{\\grqq}",
>"Ã"=>"\\'{a}",
>"Ã"=>"\\`{a}",
>"Ã"=>"\\^{a}",
>....
>
>while (<>) {
> s/(.)/exists $enctabelle{$1} ? $enctabelle{$1} : $1/geo;
> print;
>}
This did not change the text at all. When I removed the ternary operator
>s/(.)/exists $enctabelle{$1}/g;
I got an error message like this:
>Line 208: Use of uninitialized value in substitution iterator <> line 1.
Obviously, Perl cannot interpolate variable names like $enctabelle{Ã}. Both the
script and the file to convert are UTF-8 encoded. What's the problem here?
On another list, I got a rather complicated snippet I did not fully understand:
>#!perl
>
>%enctabelle = (...);
>
>my $re = '(' . join('|', map quotemeta($_), keys %enctabelle) . ')';
>$re = qr/$re/;
>
>while (<>) {
> s/$re/$enctabelle{$1}/g;
> print;
>}
Maybe the quotemeta part is what helps identifying the corresponding value?
Any hints are greatly appreciated,
Jan
--
Hanlon's Razor: Never attribute to malice that which can be adequately explained by
stupidity.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>