groovy vs perl

29
 Groovy vs. Perl: . можно скриптовать Почему захотелось groovy? www.ivis.ru он же www.eastview.com - . это коллектор периодических изданий Всё сделано на Java, и только скрипты , обработки данных из газет журналов и новостных лент — на Perl.

Upload: mayperl

Post on 17-May-2015

1.712 views

Category:

Technology


0 download

DESCRIPTION

YAPC Russia 2009 "May Perl 2"

TRANSCRIPT

Page 1: Groovy Vs Perl

   

Groovy vs. Perl: .можно скриптовать

Почему захотелось groovy?

www.ivis.ru он же www.eastview.com - .это коллектор периодических изданий

Всё сделано на Java, и только скрипты

, обработки данных из газет журналов

и новостных лент — на Perl.

Page 2: Groovy Vs Perl

   

.Захотелось моноплатформенности

Groovy , ,понравился но испугались

:потому что

1) очень много скриптов

переписывать с Perl- ;а

2) год назад Groovy казался слишком

. молодой технологией

Но за год Groovy 1.5.6 шагнул с версии

1.6.3. regexp- . до А в нём лучше ы

Page 3: Groovy Vs Perl

   

Groovy — это написанный на Java -объектно ориентированный ,скриптовый язык - , компилируемый в байт код исполняемый на JVM.

На Groovy написан Grails - RoR- web-подобный фреймворк.

Page 4: Groovy Vs Perl

   

Достоинства Groovy. Тесная интеграция с Java:

- прямо в Groovy скриптах можно

писать Java- , код потому что GDK - это расширение JDK;

- из java- кода можновызывать

код groovy;- из groovy- кода можно вызывать

код скомпилированных классов java.

Page 5: Groovy Vs Perl

   

4 Существует способа запускать

groovy, если не счиатать

web- :приложения

). а сохранить скрипт в файле и

запустить из командной строки

>./script.groovyпривет>cat script groovy

#!/usr/bin/env groovyprintln ' 'привет

Page 6: Groovy Vs Perl

   

) java- б скомпилировать в класс

javaи запускать с помощью

                > groovyc script.groovy> ls *classscript.class> java ­cp $GROOVY_HOME/embeddable/groovy­all­1.6.2.jar:. scriptпривет

Page 7: Groovy Vs Perl

   

) groovy в выполнять код с помощью

groovy shell>groovyshGroovy Shell (1.6.2, JVM: 1.6.0_07)Type 'help' or '\h' for help.-------------------------------------groovy:000> class ФИ { groovy:001> def Фамилия groovy:002> def Имя groovy:003> def какТебяЗовут(){ "Меня зовут ${Имя} ${Фамилия}" }groovy:004> } ===> truegroovy:000> Дизайнер = new ФИ (Фамилия: "Иванов", Имя: "Иван" ) ===> ФИ@652110groovy:000> Дизайнер.какТебяЗовут()===> Меня зовут Иван Ивановgroovy:000>

Page 8: Groovy Vs Perl

   

) groovyConsoleд выпонять код в

Page 9: Groovy Vs Perl

   

) , , е делать всё что надо прямо из

, Perl:командной строки как в

inline scripting..1) е ключ -e - , исполнение кода

: записанного в командной строке> groovy -e "println 'Hi, YAPC'"Hi, YAPC> groovy -e "println 'Hi, ' + args[0]" YAPCHi, YAPC> groovy -e "println 'Hi, ' + args.join('::') + ' 2009'" \> YAPC RussiaHi, YAPC::Russia 2009

Page 10: Groovy Vs Perl

   

.2) е обработка каждой строки из

: входного потока

переменная line и ключ -n ( вместе с -e)> cat test2.txtстрока в нижнем регистре

> cat test2.txt | groovy -n -e 'println line.toUpperCase()'СТРОКА В НИЖНЕМ РЕГИСТРЕ

> cat test2.txt | groovy -n -e \> 'k=0; line.split(/\s+/).each{ println "${++k} " + it; }'1 строка2 в3 нижнем4 регистре

Page 11: Groovy Vs Perl

   

.3) STDINе обработка каждой строки из

( в переменной line лежит очередная

) строка и печать обработанных

STDOUTстрок в : ключ -p ( вместе с -e). > cat test3.txtИваненкоПетренкоСидоренко

> cat test3.txt | groovy -p -e \'(line =~ /енко\b/).replaceAll("iв")'ИванiвПетрiвСидорiв

Page 12: Groovy Vs Perl

   

.4) «in place' е обработка файла

(.bak)с созданием резервной копии

: исходного файла ключ -i (-p -e).> cat test3.txtИваненкоПетренкоСидоренко> groovy -p -i .bak -e \ '(line =~ /енко\b/).replaceAll("iв")' test3.txt> cat test3.txtИванiвПетрiвСидорiв> ls test3*test3.txt test3.txt.bak

Page 13: Groovy Vs Perl

   

(Collections)Структуры даных

(Lists) ArrayListМассивы — на основе

(Maps) HashMap Хэши — на основе

Для массивов определено много

: grep, sort, pop, push,разных методов

remove, intersect, disjoint, removeAll, findAll, isCase, max, min, every, any, join, ...

Page 14: Groovy Vs Perl

   

МассивыmyList = ['a', 'bc', 3]assert myList.size() == 3assert myList[1] == 'bc'

assert myList.reverse() == [3, 'bc', 'a']

// из диапазона делаем массивdiap = (1..10).toList()assert diap[4] == 5

myList.push('u'); myList.push('v'); myList.push('w');assert myList == ['a', 'bc', 3, 'u','v','w']

assert myList[1..3] == [ 'bc', 3, 'u' ] assert myList[2, 4] == [3, 'v']

top = myList.pop()assert top == 'w'

Page 15: Groovy Vs Perl

   

yapc = []

yapc += 'Шитов' // добавляем элементassert yapc == ['Шитов']

yapc += ['Капранов', 'Закиров']assert yapc == ['Шитов', 'Капранов', 'Закиров']

yapc << 'Серёжкин' << 'Mons'assert yapc == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons']

assert yapc - ['Капранов', 'Закиров'] == ['Шитов', 'Серёжкин', 'Mons']

assert yapc*2 == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons', 'Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons']

( )Массивы продолжение

Page 16: Groovy Vs Perl

   

( )Массивы продолжение

, то что в perl: map то в groovy: each

> perl -e 'print "$_\n" for map { $_ + 7 } (1,2,3);'8910

> groovy -e '[1,2,3].each{ println it + 7 }' 8910

Page 17: Groovy Vs Perl

   

( )Массивы продолжение

, то что в perl: split, то и в groovy: split> perl -e 'print "$_\n" for split(/, / ,"Вася, Петя" );'ВасяПетя

> groovy -e "s ='Вася, Петя'; s.split(', ').each{ println it }"ВасяПетя

Page 18: Groovy Vs Perl

   

( )Массивы продолжение

что в perl grep, то и в groovy grep> perl -e 'print "$_\n" for grep { /шка$/ } qw(шишка ёлка);' шишка

> groovy -e "['шишка', 'ёлка'].grep(~/.*шка$/).each{println it}"шишка

В groovy имеется unique > groovy -e '[1,1,1,2,2].unique().each{println it}'12

Page 19: Groovy Vs Perl

   

perl sort и groovy sort похожи

> perl -e 'print "$_\n" for sort {$a <=> $b} (111,10,11,1,2,5);' 1251011111

> groovy -e '[111,10,11,1,2,5].sort{x,y -> x<=>y}.each{println it}' 1251011111

Page 20: Groovy Vs Perl

   

> cat cards_sorter.groovy def cards = ['ace', 'queen', 'jack', 'joker', 'king']

def cardWeight = ['jack': 10, 'queen':20, 'king':30, 'ace':40, 'joker':50 ]

def compareCards = { x, y ->

if( cardWeight[x] < cardWeight[y] ) return -1 else if (cardWeight[x] > cardWeight[y]) return 1 else return 0 }

cards.sort{ x,y -> compareCards(x, y) }.each{ println it }

Сортировка массива замыканием

Page 21: Groovy Vs Perl

   

Результат сортировки массива> groovy cards_sorter.groovy jackqueenkingacejoker

Page 22: Groovy Vs Perl

   

(maps)Хэшиdef myMap = [x:1, y:2, z:3]def herMap = [z:3, x:1, y: 2]def hisMap = [э:3, ю:2, я:3]

assert myMap == herMaphisMap.putAll(herMap) //добавление одного хэша в другой

assert hisMap == [э:3, ю:2, я:3, z:3, x:1, y: 2]assert hisMap.isEmpty() == falseassert hisMap.size() == 6assert hisMap.containsKey('ю') == trueassert hisMap.containsValue(1) == true

def toSet(list) { new java.util.HashSet(list) }

assert herMap.keySet() == toSet(['x','y','z'])assert toSet( herMap.values() ) == toSet( [1, 2, 3] )

Page 23: Groovy Vs Perl

   

(maps) - Хэши продолжениеdef myMap = [x:1, y:2, z:3]

assert myMap.any {entry -> entry.value > 2}assert myMap.every {entry -> entry.key > 'a'}

def mySubMap = myMap.subMap( [ 'x', 'y' ] )assert mySubMap == [x:1, y:2 ]

def greater_then_1 = myMap.findAll{ elem -> elem.value > 1 }assert greater_then_1 == [ 'y':2, 'z':3 ]

def f = myMap.find {elem -> elem.value == 1}assert f.key == 'x'assert f.value == 1

myMap.remove('x')assert myMap == [y:2, z:3]

Page 24: Groovy Vs Perl

   

groovyРегулярные выражения в

assert "32.99" == 'Total Amount: $32.99'.find(/(\d+).(\d{2})/)

// захват групп с помощью замыканияdef roundedAmount(value) {

value.find(/(\d+).(\d{2})/) { fullMatch, dollars, cents -> return dollars.toInteger() + ( cents.toInteger() > 50 ? 1 : 0 ) }

} assert "33" == roundedAmount('Total Amount: $32.99')assert "44" == roundedAmount('I paid $44.28 for it')

Page 25: Groovy Vs Perl

   

groovyРегулярные выражения в

( )продолжение// чтобы найти все совпадения - findAlldef string = "Moe Fine, Howard Fine, and Larry Fine"def stooges = string.findAll(/(\w+) Fine/) assert stooges == ["Moe Fine", "Howard Fine", "Larry Fine"]

// чтобы захватывать группы — используют запыканияdef string = "Moe Fine, Howard Fine, and Larry Fine"def firstNames = string.findAll(/(\w+) Fine/) { match, firstName -> firstName } assert firstNames == ["Moe", "Howard", "Larry"]

Page 26: Groovy Vs Perl

   

groovyРегулярные выражения в

( )продолжение

foo = 42str = '''blah #foo# blah'''re = '''(?xm) # to enable whitespace and comments \\# # a pound sign (\\w+) # the variable name \\# # another pound sign '''finder = str =~ refound = finder[0]out = str.replaceAll(found[0], evaluate(found[1]).toString())assert out == '''blah 42 blah'''

Page 27: Groovy Vs Perl

   

groovy Что читать про

'Groovy in Action', Manning, 2007Dierk Koenig, Andrew Glover, Paul King, Guillaume Laforge, Jon Skeet

'Groovy Recipes: Greasing the Wheels of Java'

Pragmatic Bookshelf, 2008

Scott Davis

Page 28: Groovy Vs Perl

   

* http://groovy.codehaus.org/ - домашняя страница groovy

* http://voituk.kiev.ua - блог Вадима Войтюка «Записки искателей»

* http://pleac.sourceforge.net/pleac_groovy/index.html PLEAC - Programming Language Examples Alike Cookbook

* http://blog.alno.name/2008/06/using-groovy/ - блог Алексея Носкова

* циклы статей Эндрю Гловера на ibm.com, например:- 'Практически Groovy: Разметка с помощью Groovy Builders' http://www.ibm.com/developerworks/ru/library/j-pg04125/

- Практически Groovy : MOP и мини-языки http://www.ibm.com/developerworks/ru/library/j-pg09205/

Page 29: Groovy Vs Perl

   

* Про регулярные выражения — blog of Ted Nailed 'Groovy: Don’t Fear the RegExp' http://naleid.com/blog/2008/05/19/dont-fear-the-regexp/

'Groovy 1.6.1 released with new find and findAll regexp methods on String' http://naleid.com/blog/2009/04/07/groovy-161-released-with-new-find-and-findall-regexp-methods-on-string/