Ich bin gerade dabei, einige Perl-Skripte nach Python zu migrieren. Dazu will ich den Quellcode für einen Hash automatisch in Code für ein dictionary umwandeln.
Quelldatei:
Code: Alles auswählen
$bla{'123'}=456;
$bla{'789'}=23;
Code: Alles auswählen
import re
with open("hash.pl", "r") as infile:
instring = infile.read()
outstring = re.sub(u"\$bla\{'([0-9]+)'\}=([0-9]+);", u"bla['\1'] = \2", instring)
# outstring = re.sub("\$bla\{'(\d+)'\}=(\d+);", "bla['\1'] = \2", instring)
# outstring = re.sub("\$bla\{'([^}]+)'\}=([^)]+);", "bla['\1'] = \2", instring)
print outstring
Der Output:
Code: Alles auswählen
$ python hash2dict.py
bla[''] =
bla[''] =
Andererseits produziert das entsprechende Perl-Skript:
Code: Alles auswählen
use strict;
use warnings;
use File::Slurp;
my $infile = read_file('hash.pl');
$infile =~ s/\$bla\{'(\d+)'\}=(\d+);/bla['\1'] = \2/g;
print $infile;
Code: Alles auswählen
$ perl hash2dict.pl
\1 better written as $1 at hash2dict.pl line 7.
\2 better written as $2 at hash2dict.pl line 7.
bla['123'] = 456
bla['789'] = 23
Auf den ersten Blick sieht es nach einem encoding-Problem aus. Allerdings finde ich es unwahrscheinlich, dass einfache Ziffern zu nicht darstellbaren Zeichen werden, indem man sie mit einer Regex matcht. Was macht python da anders als perl?