← Timeline
Avatar
Shmuel Leib Melamud

Почему я до сих пользуюсь Perl? Потому что заменить эту швейцарскую армейскую бензопилу нечем.

Возьмём задачу. Есть вот такой YAML. Мне надо взять из каждого блока name и title (те блоки, в которых нет name или title - пропускать). В name заменить все точки на подчёркивания и заключить в кавычки. title тоже заключить в кавычки, если нужно. И сделать из этого кусок JSON в стиле

<name>: <title>,

Делается это таким вот скриптом:

$name = '';
while (<>) {
    $name = $1 if /^- name: (.*)$/;
    if (/^\s*title: (.*)$/) {
        next if $name eq '';
        $name =~ tr/./_/;
        $title = $1;
        $title = "\"$title\"" unless $title =~ /^"/;
        print "\"$name\": $title,\n";
        $name = '';
    }
}

Написано в vi за минуту.

Попробовали бы они такое в Питоне.

To react or comment  View in Web Client
Comments (11)
Avatar

За минуту перевел на питон

import sys, re
name = None
for line in sys.stdin.readlines():
    m = re.match(r'^- name: (.*)$', line)
    if m:
        name = m.group(1)
    else:
        m = re.match(r'^\s+title: (.*)$', line)
        if m and name:
            title = m.group(1)
            if title[0]!='"': title = '"'+title+'"'
            print('"'+name+'": '+title)
            name = None
👍1
Avatar

Чуть красивше с форматными строками (не привык пока к ним)

import sys, re
name = None
for line in sys.stdin.readlines():
    m = re.match(r'^- name: (.*)$', line)
    if m:
        name = m.group(1)
    else:
        m = re.match(r'^\s+title: (.*)$', line)
        if m and name:
            title = m.group(1)
            if title[0]!='"': title = f'"{title}"'
            print(f'"{name}": {title}')
            name = None
👍1
Avatar

Пропущена замена символов в name. И <> - это не только stdin 😉

Но лучше, чем я ожидал, если с форматными строками. Хотя всё равно длинно.

Avatar

Интересно, найдется ли тут знающий awk, который утрёт нам тут всем нос? 😉

😀1
Avatar

Есть у меня знакомый любитель J. Хотя, конечно, для парсинга текстов он не очень подходит

😮1
Avatar placeholder

Вот за это перл и не любят (когда не любят). Была задача собрать ключи из элементов yaml в один объект json, начинаете вы думать на perl, и во что она превращается? Ехала кавычка через бэкслеш погоняя регэкспом! А потом окажется, что под name: на верхем уровне могут быть ещё подобъекты с title внутри, и этот title нам не нужен -- и перловое решение неожиданно сломается (и так 15 раз).

(defun y2j-moera (yaml)                                                         
  (st-json:write-json-to-string                                                 
   (apply #'st-json:jso                                                         
          (loop for item across (nyaml:parse yaml)                              
                for name = (gethash "name" item)                                
                and title = (gethash "title" item)                              
                when (and name title)                                           
                  collect (substitute #\_ #\. name)                             
                  and collect title)
👍4
Avatar
Avatar

Понятное дело, будь у меня задача сделать что-то универсальное, не на один раз, я бы Perl не брал и разбирал по-человечески.

Avatar

Что ты такое??

😀2
Avatar

Ну вот выше вполне себе питонячее решение.
Как по мне, питон может и длиннее, но всяко читабельнее перловки.

Avatar

Я уже бросил. На питоне не сильно длиннее, но все эти переменные по умолчанию и <> начали меня раздражать. С таким количеством синтаксического сахара и диабет II типа можно заработать 😃

To react or comment  View in Web Client