Я бы просто превратил структуру данных Perl во что-то другое. Не видя реального файла, может быть, есть дополнительная работа, которую мое решение не выполняет.
Если в файле есть только одно объявление переменной (то есть, нет 1;
в конце и т. Д.), Может быть действительно просто превратить ваш %config
в YAML:
perl -MYAML -le 'print YAML::Dump( { do shift } )' filename
do
возвращает последнее, что он вычислил, поэтому в этом небольшом коде он возвращает список пар ключ-значение хеш-функции. Такие вещи, как YAML :: Dump, любят работать со ссылками, поэтому они получают подсказку о структуре верхнего уровня, поэтому я превращаю это в ссылку на хэш, окружая do
фигурными скобками. Для вашего примера я бы получил вывод YAML:
---
(?-xism:^spam): eggs
color: red
numbers:
- 5
- 8
Хотя я не знаю, как Python понравится это строковое регулярное выражение. У вас действительно есть ключ, который является регулярным выражением? Мне было бы интересно узнать, как это используется как часть конфигурации.
Если в файле есть что-то лишнее, жизнь немного сложнее. Вероятно, есть действительно умный способ обойти это, но я использовал ту же идею, но просто жестко закодировал имя переменной, которое хотел.
Я пробовал это на структуре данных Perl, которую использует модуль CPAN.pm, и, похоже, все получилось хорошо. Единственное уродство - это предварительное знание имени переменной, которую она предоставляет. Теперь, когда вы увидели ошибку конфигурации в коде Perl, избегайте повторения той же ошибки с кодом Python. :)
YAML:
perl -MYAML -le 'do shift; print YAML::Dump( $CPAN::Config )' MyConfig.pm
JSON:
perl -MJSON::Any -le 'do shift; my $j = JSON::Any->new; print $j->objToJson( $CPAN::Config )' MyConfig.pm
или
# suggested by JF Sebastian
perl -MJSON -le 'do shift; print to_json( $CPAN::Config )' MyConfig.pm
XML :: Simple не работает так хорошо, потому что он рассматривал все как атрибут, но, возможно, кто-то может улучшить это:
perl -MXML::Simple -le 'do shift; print XMLout( $CPAN::Config )' MyConfig.pm