Как я могу считать структуры данных Perl из Python?

Создайте объект, который имеет закрытый метод для создания соединения с базой данных, и публичный метод GetData, который принимает строку sql и возвращает набор записей, используя это закрытое соединение.

Private conn as ado.connection
Private sub OpenConn() 
   'code to set conn
    if not conn.state = adostateopen then
         conn.connectionstring = "put your string here" 
         conn.open
    end if
end sub

Public function GetData(s as string) as recordset
openconn
dim rs as recordset
set rs = conn.execute s
end function

(реплики с жалобами на то, что они не очищают входные данные и не работают с базой данных и т. Д.)

11
задан brian d foy 24 December 2008 в 01:45
поделиться

4 ответа

Не уверенный, каков вариант использования. Вот мое предположение: Вы собираетесь сделать одноразовое преобразование от Perl до Python.

Perl имеет это

%config = (
    'color' => 'red',
    'numbers' => [5, 8],
    qr/^spam/ => 'eggs'
);

В Python это было бы

config = {
    'color' : 'red',
    'numbers' : [5, 8],
    re.compile( "^spam" ) : 'eggs'
}

Так, я предполагаю, что это - набор Ре для замены

  • %variable = ( с variable = {
  • ); с }
  • variable => value с variable : value
  • qr/.../ => с re.compile( r"..." ) : value

Однако встроенный Python dict не делает ничего необычного с regex как ключ хеша. Для этого необходимо было бы записать собственный подкласс dict, и переопределение __getitem__ проверять ключи REGEX отдельно.

class PerlLikeDict( dict ):
    pattern_type= type(re.compile(""))
    def __getitem__( self, key ):
        if key in self:
            return super( PerlLikeDict, self ).__getitem__( key )
        for k in self:
            if type(k) == self.pattern_type:
                if k.match(key):
                    return self[k]
        raise KeyError( "key %r not found" % ( key, ) )

Вот пример использования подобного Perl dict.

>>> pat= re.compile( "hi" )
>>> a = { pat : 'eggs' } # native dict, no features.
>>> x=PerlLikeDict( a )
>>> x['b']= 'c'
>>> x
{<_sre.SRE_Pattern object at 0x75250>: 'eggs', 'b': 'c'}
>>> x['b']
'c'
>>> x['ji']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in __getitem__
KeyError: "key 'ji' not found"
>>> x['hi']
'eggs'
7
ответ дан 3 December 2019 в 01:34
поделиться

Действительно ли использование чистого Python является требованием? В противном случае можно загрузить его в Perl и преобразовать его в YAML или JSON. Затем используйте PyYAML или что-то подобное для загрузки их в Python.

18
ответ дан 3 December 2019 в 01:34
поделиться

Я также нашел PyPerl, но это, кажется, не сохраняется. Я предполагаю, что что-то вроде этого - то, что я искал - модуль, который сделал некоторую основную интерпретацию Perl и передал результат как объект Python. Интерпретатор Perl, который перестал работать на чем-либо слишком сложном, будет прекрасен.:-)

0
ответ дан 3 December 2019 в 01:34
поделиться

Я просто превратил бы структуру данных Perl во что-то еще. Не видя фактический файл, могла бы быть некоторая дополнительная работа, которую не делает мое решение.

Если единственной вещью, это находится в файле, является одно объявление переменной (так, нет 1; в конце, и так далее), может быть действительно просто повернуть Ваш %config это в YAML:

perl -MYAML -le 'print YAML::Dump( { do shift } )' filename 

do возвращает последнюю вещь, которую это оценило, таким образом, в этом небольшом коде это возвращает список пар "ключ-значение" хеша. Вещи, такие как YAML:: Дампу нравится работать со ссылками, таким образом, они получают подсказку о структуре верхнего уровня, таким образом, я превращаю это в ссылку хеша путем окружения do с фигурными скобками. Для Вашего примера я получил бы этот вывод YAML:

---
(?-xism:^spam): eggs
color: red
numbers:
  - 5
  - 8

Я не знаю, как Python понравится это stringified regex, все же. У Вас действительно есть ключ, который является regex? Мне было бы любопытно знать, как это используется в качестве части конфигурации.


Если существует дополнительный материал в файле, жизнь немного более жестка. Существует, вероятно, действительно умный способ обойти это, но я использовал ту же идею, но просто трудно кодированный имя переменной, которое я хотел.

Я попробовал это на структуре данных 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:: Простой не удается так хорошо, потому что это рассматривало все как атрибут, но возможно кто-то может изменить к лучшему это:

perl -MXML::Simple -le 'do shift; print XMLout( $CPAN::Config )' MyConfig.pm
14
ответ дан 3 December 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: