Каковы различия между Perl, Python, AWK и sed? [закрытый]

В Swift 2:

import Foundation

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{Int($0)}
  }
}

let ans = myArray.sort {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В Swift 1:

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{$0.toInt()}
  }
}

let ans = myArray.sorted {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В обоих случаях этот массив:

let myArray = [
  "Step 6" ,
  "Step 12",
  "Step 5" ,
  "Step 14",
  "Step 4" ,
  "Step 11",
  "Step 16",
  "Step 9" ,
  "Step 3" ,
  "Step 13",
  "Step 8" ,
  "Step 2" ,
  "Step 10",
  "Step 7" ,
  "Step 1" ,
  "Step 15"
]

даст вам этот ответ:

["Step 1", "Step 2", "Step 3", "Step 4", "Step 5", "Step 6", "Step 7", "Step 8", "Step 9", "Step 10", "Step 11", "Step 12", "Step 13", "Step 14", "Step 15", "Step 16"]

(В версии Swift 2.0 вы должны быть в состоянии сделать last.flatMap(Int.init), но по какой-то причине это не работает для меня. ["1", "2"].flatMap(Int.init) разбивает мою игровую площадку. Похож на ошибку.)

244
задан Leon Timmermans 15 December 2008 в 02:30
поделиться

5 ответов

В порядке появления языки sed, awk, perl, python.

sed программа является потоковым редактором и разработана для применения действий от сценария до каждой строки (или, в более общем плане, к указанным диапазонам строк) входного файла или файлов. Его язык основан ed, редактор Unix, и хотя это имеет условные выражения и так далее, трудно работать с для сложных задач. Можно работать незначительные чудеса с ним - но по стоимости для волос на голове. Однако это является, вероятно, самым быстрым из программ при пробовании выполнить задач в его сфере компетенции. (Это имеет наименее мощные регулярные выражения обсужденных программ - достаточный для многих целей, но конечно не PCRE - Совместимые с Perl Регулярные выражения)

awk программа (имя от инициалов его авторов - Aho, Weinberger и Kernighan) является инструментом первоначально для форматирования отчетов. Это может использоваться в качестве souped sed; в его более свежих версиях это в вычислительном отношении завершено. Это использует интересную идею - программа основана 'на шаблонах подобранные' и 'меры, принятые, когда шаблон соответствует'. Шаблоны довольно мощны (Расширенные регулярные выражения). Язык для действий подобен C. Одна из основных характеристик awk - то, что это разделяет входные строки на поля автоматически.

Perl был записан частично как awk-уничтожитель и sed-уничтожитель. Две из программ, которым предоставляют его, a2p и s2p для преобразования awk сценарии и sed сценарии в Perl. Perl является одним из самых ранних из следующего поколения языков сценариев (Tcl/Tk может, вероятно, требовать первенства). Это имеет мощную интегрированную обработку регулярного выражения со значительно более мощным языком. Это обеспечивает доступ почти ко всем системным вызовам и имеет расширяемость модулей CPAN. (Ни awk, ни sed расширяемо.) Одним из девизов Perl является "TMTOWTDI - существует больше чем один способ сделать это" (объявленный "tim-подхалимом"). Perl имеет 'объекты', но это - больше дополнения, чем фундаментальная часть языка.

Python был записан в последний раз, и вероятно частично как реакция на Perl. Это имеет некоторые интересные синтаксические идеи (делающий отступ для указания на уровни - никакие фигурные скобки или эквиваленты). Это более существенно объектно-ориентировано, чем Perl; это столь же расширяемо как Perl.

хорошо - когда использовать каждого?

  • sed - когда необходимо сделать, простой текст преобразовывает на файлах.
  • awk - когда Вам только нужны простое форматирование и реферирование или преобразование данных.
  • жемчуг - почти для любой задачи, но особенно когда задаче нужны сложные регулярные выражения.
  • Python - для тех же задач, для которых Вы могли использовать Perl.

я не знаю ни о чем, что может сделать Perl, тот Python не может, ни наоборот. Выбор между этими двумя зависел бы от других факторов. Я изучил Perl, прежде чем был Python, таким образом, я склонен использовать его. Python меньше аккумулировал синтаксис и обычно несколько более прост учиться. Perl 6, когда это станет доступным, будет захватывающей разработкой.

(Отмечают, что 'обзоры' Perl и Python, в частности, являются горестно неполными; целые книги могли быть записаны по теме.)

535
ответ дан kvantour 4 November 2019 в 12:41
поделиться

Я не назвал бы sed абсолютным языком программирования, это - потоковый редактор с конструкциями языка, нацеленными на редактирование текстовых файлов программно.

Awk является немного больше языка общего назначения, но это все еще подходит лучше всего для обработки текста.

Perl и Python полностью оперены, языки программирования общего назначения. Perl имеет свои корни в обработке текста и имеет много подобных awk конструкций (существует даже awk-to-perl сценарий, плавающий вокруг в сети). Существует много различий между Perl и Python, Ваш лучший выбор состоит в том, чтобы, вероятно, прочитать сводки обоих языков на чем-то как Википедия для надевания хорошего схватывания, каковы они.

21
ответ дан Robert Gamble 4 November 2019 в 12:41
поделиться

Во-первых, существует две несвязанных вещи в списке "Perl, Python awk и sed".

Вещь 1 - упрощенные текстовые инструменты управления.

  • sed. Это имеет фиксированный, относительно простой объем работ, определенный идеей считать и исследовать каждую строку файла. sed не разработан, чтобы быть особенно читаемым. Это разработано, чтобы быть очень маленьким и очень эффективным на очень крошечных серверах Unix.

  • awk. Это имеет немного менее фиксированный, менее простой объем работ. Однако основной цикл awk программы определяется неявным чтением строк исходного файла.

Это не "полные" языки программирования. В то время как Вы можете - с некоторой работой - пишут довольно сложные программы в awk, она быстро является сложной и трудной читать.

Вещь 2 - языки программирования общих целей. Они имеют богатое множество типов оператора, многочисленных встроенных структур данных, и не соединенный проводом - в предположениях или ярлыках для разговора о.

  • Perl.

  • Python.

, Когда использовать их.

  • sed. Никогда. Это действительно не имеет никакого значения в современную эру компьютеров с больше, чем 32K памяти. Perl или Python делают то же самое более ясно.

  • awk. Никогда. Как sed, это отражает более раннюю эру вычисления. Вместо того, чтобы поддерживать этот язык (в дополнение ко всем другим необходимым для успешной системы), более приятно просто сделать все на одном приятном языке.

  • Perl. Любая проблема программирования любого вида. Если Вам нравится вольнодумный синтаксис, где существуют многие, много способов сделать то же самое, жемчуг является забавой.

  • Python. Любая проблема программирования любого вида. Если Вам нравится справедливо ограниченный синтаксис, где существует меньше вариантов, меньше тонкости, и (возможно) больше ясности. Объектно-ориентированный характер Python делает его более подходящим для больших, сложных проблем.

Фон - я не колочу sed и awk из незнания. Я изучил awk более чем 20 лет назад. Сделал много вещей с ним; используемый для обучения его как базового навыка Unix. Я изучил Perl приблизительно 15 лет назад. Сделал много сложных вещей с ним. Я оставил и потому что я могу сделать то же самое в Python - и это более просто и более ясно.

существует две серьезных проблемы с sed и awk, ни один из которых их возраст.

  1. неполнота их реализации. Все, что делают sed и awk, может быть сделано в Python или Perl, часто проще и иногда быстрее, также. Конвейер оболочки имеет некоторые преимущества производительности из-за своей многопроцессорной обработки. Python предлагает subprocess модуль, чтобы позволить мне восстанавливать те преимущества.

  2. потребность выучить еще один язык. Путем выполнения вещей в Python (или Perl) реализация зависит от меньшего количества языков с получающимся увеличением ясности.

19
ответ дан brian d foy 4 November 2019 в 12:41
поделиться

Когда их использовать: awk - никогда - С. Лотт.

Я думаю, что С. Лотт немного ошибся с этой рекомендацией. Дело в том, что в Linux и других средах UNIX awk - это полезный инструмент, который можно использовать вместе с bash, sh и ksh для быстрой обработки текста. Сама идея скриптинга заключается в том, что вы решаете свою проблему путем склеивания этого инструмента и того инструмента. Поэтому в административных скриптах обычно используются ls, grep, |, awk, time, ps и т.д. Каждый из них - это инструмент, который скриптер соединяет, как строитель кирпичик за кирпичиком, чтобы закончить здание (решить поставленную задачу).

Например, я являюсь членом команды, управляющей поставками пейнтбольного снаряжения dotcom. Этот сайт электронной коммерции основан на стеке LAMP. Для автоматизированной обработки и нормализации данных, поступающих от различных поставщиков в базу данных, мы используем и поддерживаем разнообразные скрипты, включая bash, perl, php и даже expect. Каждый из них имеет свои сильные стороны, основанные на доступных модулях и API. В сценариях bash мы быстро сопоставляем шаблоны и выполняем соответствующие действия по мере необходимости с помощью awk без необходимости переходить на PERL. Я также хотел бы отметить одну вещь, которая не была подчеркнута в этой теме, это то, что довольно много этих скриптов были куплены или получены из открытых источников. Если скрипт пришел как Perl, мы поддерживаем его как Perl; если скрипт пришел как Php, мы поддерживаем его как Php; если он пришел как bash, мы поддерживаем его как bash; мы не переписываем его на другой язык только потому, что считаем его менее эффективным на исходном языке.

13
ответ дан 23 November 2019 в 03:07
поделиться

Освоив несколько десятков языков, вы устаете от таких людей, как С. Лотт (см. Его неоднозначный ответ на этот вопрос, почти вдвое меньше голосов против, чем за (+ 45 / -22 ) через шесть лет после ответа).

Sed - лучший инструмент для чрезвычайно простых конвейеров командной строки. В руках мастера sed он подходит для разовых работ произвольной сложности, но его не следует использовать в производственном коде, за исключением очень простых конвейеров подстановки. Такие вещи, как 's / this / that /.'

Gawk (GNU awk), безусловно, лучший выбор для сложного переформатирования данных, когда есть только один входной источник и один выход (или несколько выходов записываются последовательно) . Так как этому описанию соответствует большая часть реальной работы, а хороший программист может выучить gawk за два часа, это лучший выбор. На этой планете проще и быстрее лучше!

Perl или Python намного лучше, чем любая версия awk или sed, когда у вас очень сложные сценарии ввода / вывода. Чем сложнее проблема, тем лучше вы используете python с точки зрения обслуживания и удобочитаемости.Однако обратите внимание, что хороший программист может писать читаемый код на любом языке, а плохой программист может писать непослушную чушь на любом полезном языке, поэтому выбор perl или python можно безопасно оставить на усмотрение программиста, если этот программист умелый и умный.

89
ответ дан 23 November 2019 в 03:07
поделиться