groovy vs perl
DESCRIPTION
YAPC Russia 2009 "May Perl 2"TRANSCRIPT
Groovy vs. Perl: .можно скриптовать
Почему захотелось groovy?
www.ivis.ru он же www.eastview.com - .это коллектор периодических изданий
Всё сделано на Java, и только скрипты
, обработки данных из газет журналов
и новостных лент — на Perl.
.Захотелось моноплатформенности
Groovy , ,понравился но испугались
:потому что
1) очень много скриптов
переписывать с Perl- ;а
2) год назад Groovy казался слишком
. молодой технологией
Но за год Groovy 1.5.6 шагнул с версии
1.6.3. regexp- . до А в нём лучше ы
Groovy — это написанный на Java -объектно ориентированный ,скриптовый язык - , компилируемый в байт код исполняемый на JVM.
На Groovy написан Grails - RoR- web-подобный фреймворк.
Достоинства Groovy. Тесная интеграция с Java:
- прямо в Groovy скриптах можно
писать Java- , код потому что GDK - это расширение JDK;
- из java- кода можновызывать
код groovy;- из groovy- кода можно вызывать
код скомпилированных классов java.
4 Существует способа запускать
groovy, если не счиатать
web- :приложения
). а сохранить скрипт в файле и
запустить из командной строки
>./script.groovyпривет>cat script groovy
#!/usr/bin/env groovyprintln ' 'привет
) java- б скомпилировать в класс
javaи запускать с помощью
> groovyc script.groovy> ls *classscript.class> java cp $GROOVY_HOME/embeddable/groovyall1.6.2.jar:. scriptпривет
) 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>
) groovyConsoleд выпонять код в
) , , е делать всё что надо прямо из
, 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
.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 регистре
.3) STDINе обработка каждой строки из
( в переменной line лежит очередная
) строка и печать обработанных
STDOUTстрок в : ключ -p ( вместе с -e). > cat test3.txtИваненкоПетренкоСидоренко
> cat test3.txt | groovy -p -e \'(line =~ /енко\b/).replaceAll("iв")'ИванiвПетрiвСидорiв
.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
(Collections)Структуры даных
(Lists) ArrayListМассивы — на основе
(Maps) HashMap Хэши — на основе
Для массивов определено много
: grep, sort, pop, push,разных методов
remove, intersect, disjoint, removeAll, findAll, isCase, max, min, every, any, join, ...
Массивы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'
yapc = []
yapc += 'Шитов' // добавляем элементassert yapc == ['Шитов']
yapc += ['Капранов', 'Закиров']assert yapc == ['Шитов', 'Капранов', 'Закиров']
yapc << 'Серёжкин' << 'Mons'assert yapc == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons']
assert yapc - ['Капранов', 'Закиров'] == ['Шитов', 'Серёжкин', 'Mons']
assert yapc*2 == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons', 'Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons']
( )Массивы продолжение
( )Массивы продолжение
, то что в 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
( )Массивы продолжение
, то что в perl: split, то и в groovy: split> perl -e 'print "$_\n" for split(/, / ,"Вася, Петя" );'ВасяПетя
> groovy -e "s ='Вася, Петя'; s.split(', ').each{ println it }"ВасяПетя
( )Массивы продолжение
что в 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
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
> 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 }
Сортировка массива замыканием
Результат сортировки массива> groovy cards_sorter.groovy jackqueenkingacejoker
(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] )
(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]
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')
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"]
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'''
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
* 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/
* Про регулярные выражения — 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/