Перевод Perl к Python

Как насчет:

int sgn = x/fabs(x);

это должно получиться довольно хорошо.

21
задан Community 23 May 2017 в 11:46
поделиться

6 ответов

Вот довольно дословный перевод с минимумом очевидных изменений стиля (размещение всего кода в функции с использованием строковых, а не повторных операций там, где это возможно).

import re, fileinput

def main():
  for line in fileinput.input():
    process = False
    for nope in ('BEGIN TRANSACTION','COMMIT',
                 'sqlite_sequence','CREATE UNIQUE INDEX'):
      if nope in line: break
    else:
      process = True
    if not process: continue
    m = re.search('CREATE TABLE "([a-z_]*)"(.*)', line)
    if m:
      name, sub = m.groups()
      line = '''DROP TABLE IF EXISTS %(name)s;
CREATE TABLE IF NOT EXISTS %(name)s%(sub)s
'''
      line = line % dict(name=name, sub=sub)
    else:
      m = re.search('INSERT INTO "([a-z_]*)"(.*)', line)
      if m:
        line = 'INSERT INTO %s%s\n' % m.groups()
        line = line.replace('"', r'\"')
        line = line.replace('"', "'")
    line = re.sub(r"([^'])'t'(.)", r"\1THIS_IS_TRUE\2", line)
    line = line.replace('THIS_IS_TRUE', '1')
    line = re.sub(r"([^'])'f'(.)", r"\1THIS_IS_FALSE\2", line)
    line = line.replace('THIS_IS_FALSE', '0')
    line = line.replace('AUTOINCREMENT', 'AUTO_INCREMENT')
    print line,

main()
50
ответ дан 29 November 2019 в 06:14
поделиться

Я не уверен, что так трудно понять в этом, что это требует ехидного замечания, как в вашем комментарий выше. Обратите внимание, что <> называется ромбовидным оператором. s /// - оператор подстановки, а // - оператор сопоставления m // .

3
ответ дан 29 November 2019 в 06:14
поделиться

Самый короткий? Тильда обозначает регулярное выражение в Perl. "импортировать ре" и идти оттуда. Единственное ключевое отличие состоит в том, что вы будете использовать \ 1 и \ 2 вместо $ 1 и $ 2 при присвоении значений, и вы будете использовать% s, когда вы заменяете совпадения регулярного выражения внутри строк.

1
ответ дан 29 November 2019 в 06:14
поделиться

У Safeway есть пример, в котором есть два счета:

Safeway 810 004030 Пример

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

group (1), m.group (2)) .
3
ответ дан 29 November 2019 в 06:14
поделиться

Настоящая проблема в том, знаете ли вы, как перенести базу данных? Представлен цикл поиска и замены.

2
ответ дан 29 November 2019 в 06:14
поделиться

Вот немного лучшая версия оригинала.

#! /usr/bin/perl
use strict;
use warnings;
use 5.010; # for s/\K//;

while( <> ){
  next if m'
    BEGIN TRANSACTION   |
    COMMIT              |
    sqlite_sequence     |
    CREATE UNIQUE INDEX
  'x;

  if( my($name,$sub) = m'CREATE TABLE \"([a-z_]*)\"(.*)' ){
    # remove "
    $sub =~ s/\"//g; #"
    $_ = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";

  }elsif( /INSERT INTO \"([a-z_]*)\"(.*)/ ){
    $_ = "INSERT INTO $1$2\n";

    # " => \"
    s/\"/\\\"/g; #"
    # " => '
    s/\"/\'/g; #"

  }else{
    # '' => \'
    s/\'\'/\\\'/g; #'
  }

  # 't' => 1
  s/[^\\']\K\'t\'/1/g; #'

  # 'f' => 0
  s/[^\\']\K\'f\'/0/g; #'

  s/AUTOINCREMENT/AUTO_INCREMENT/g;
  print;
}
7
ответ дан 29 November 2019 в 06:14
поделиться