Groovy Vs Perl
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Groovy Vs Perl

on

  • 3,057 views

YAPC Russia 2009 "May Perl 2"

YAPC Russia 2009 "May Perl 2"

Statistics

Views

Total Views
3,057
Views on SlideShare
3,055
Embed Views
2

Actions

Likes
1
Downloads
10
Comments
0

1 Embed 2

http://www.slideshare.net 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Groovy Vs Perl Presentation Transcript

  • 1. Groovy vs. Perl: можно скриптовать. Почему захотелось groovy? www.ivis.ru он же www.eastview.com - это коллектор периодических изданий. Всё сделано на Java, и только скрипты обработки данных из газет, журналов и новостных лент — на Perl.    
  • 2. Захотелось моноплатформенности. Groovy понравился, но испугались, потому что: 1) очень много скриптов переписывать с Perl-а; 2) год назад Groovy казался слишком молодой технологией. Но за год Groovy шагнул с версии 1.5.6 до 1.6.3. А в нём лучше regexp-ы.    
  • 3. Groovy — это  написанный на Java  объектно-ориентированный  скриптовый язык,  компилируемый в байт-код,  исполняемый на JVM. На Groovy написан Grails -   RoR-подобный web-фреймворк.  
  • 4. Достоинства Groovy. Тесная интеграция с Java: - прямо в Groovy скриптах можно писать Java-код, потому что GDK - это расширение JDK; - из java-кода можновызывать код groovy; - из groovy-кода можно вызывать код скомпилированных классов java.    
  • 5. Существует 4 способа запускать groovy, если не счиатать web-приложения: а). сохранить скрипт в файле и запустить из командной строки >./script.groovy привет >cat script groovy #!/usr/bin/env groovy println 'привет'    
  • 6. б) скомпилировать в java-класс и запускать с помощью java > groovyc script.groovy                 > ls *class script.class > java ­cp $GROOVY_HOME/embeddable/groovy­all­1.6.2.jar:. script привет    
  • 7. в) выполнять код groovy с помощью groovy shell >groovysh Groovy 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 какТебяЗовут(){ quot;Меня зовут ${Имя} ${Фамилия}quot; } groovy:004> } ===> true groovy:000> Дизайнер = new ФИ (Фамилия: quot;Ивановquot;, Имя: quot;Иванquot; ) ===> ФИ@652110 groovy:000> Дизайнер.какТебяЗовут() ===> Меня зовут Иван Иванов groovy:000>    
  • 8. д) выпонять код в groovyConsole    
  • 9. е) делать всё, что надо, прямо из командной строки, как в Perl: inline scripting. е.1) ключ -e - исполнение кода, записанного в командной строке: > groovy -e quot;println 'Hi, YAPC'quot; Hi, YAPC > groovy -e quot;println 'Hi, ' + args[0]quot; YAPC Hi, YAPC > groovy -e quot;println 'Hi, ' + args.join('::') + ' 2009'quot; > YAPC Russia   Hi, YAPC::Russia 2009  
  • 10. е.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 quot;${++k} quot; + it; }' 1 строка 2в 3 нижнем   4 регистре  
  • 11. е.3) обработка каждой строки из STDIN (в переменной line лежит очередная строка ) и печать обработанных строк в STDOUT: ключ -p (вместе с -e). > cat test3.txt Иваненко Петренко Сидоренко > cat test3.txt | groovy -p -e '(line =~ /енкоb/).replaceAll(quot;iвquot;)' Иванiв Петрiв  Сидорiв  
  • 12. е.4) обработка файла «in place' с созданием резервной копии (.bak) исходного файла: ключ -i (-p -e). > cat test3.txt Иваненко Петренко Сидоренко > groovy -p -i .bak -e '(line =~ /енкоb/).replaceAll(quot;iвquot;)' test3.txt > cat test3.txt Иванiв Петрiв Сидорiв > ls test3*   test3.txt test3.txt.bak  
  • 13. Структуры даных (Collections)  Массивы (Lists) — на основе ArrayList  Хэши (Maps) — на основе HashMap Для массивов определено много разных методов: grep, sort, pop, push, remove, intersect, disjoint, removeAll, findAll, isCase, max, min, every, any, join, ...    
  • 14. Массивы myList = ['a', 'bc', 3] assert myList.size() == 3 assert 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'
  • 15. Массивы (продолжение) yapc = [] yapc += 'Шитов' // добавляем элемент assert yapc == ['Шитов'] yapc += ['Капранов', 'Закиров'] assert yapc == ['Шитов', 'Капранов', 'Закиров'] yapc << 'Серёжкин' << 'Mons' assert yapc == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons'] assert yapc - ['Капранов', 'Закиров'] == ['Шитов', 'Серёжкин', 'Mons'] assert yapc*2 == ['Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons',     'Шитов', 'Капранов', 'Закиров', 'Серёжкин', 'Mons']
  • 16. Массивы (продолжение) то, что в perl: map то в groovy: each > perl -e 'print quot;$_nquot; for map { $_ + 7 } (1,2,3);' 8 9 10 > groovy -e '[1,2,3].each{ println it + 7 }' 8 9 10    
  • 17. Массивы (продолжение) то, что в perl: split, то и в groovy: split > perl -e 'print quot;$_nquot; for split(/, / ,quot;Вася, Петяquot; );' Вася Петя > groovy -e quot;s ='Вася, Петя'; s.split(', ').each{ println it }quot; Вася Петя    
  • 18. Массивы (продолжение) что в perl grep, то и в groovy grep > perl -e 'print quot;$_nquot; for grep { /шка$/ } qw(шишка ёлка);' шишка > groovy -e quot;['шишка', 'ёлка'].grep(~/.*шка$/).each{println it}quot; шишка В groovy имеется unique > groovy -e '[1,1,1,2,2].unique().each{println it}' 1 2    
  • 19. perl sort и groovy sort похожи > perl -e 'print quot;$_nquot; for sort {$a <=> $b} (111,10,11,1,2,5);' 1 2 5 10 11 111 > groovy -e '[111,10,11,1,2,5].sort{x,y -> x<=>y}.each{println it}' 1 2 5 10 11 111    
  • 20. Сортировка массива замыканием > 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 }
  • 21. Результат сортировки массива > groovy cards_sorter.groovy jack queen king ace joker    
  • 22. Хэши (maps) def myMap = [x:1, y:2, z:3] def herMap = [z:3, x:1, y: 2] def hisMap = [э:3, ю:2, я:3] assert myMap == herMap hisMap.putAll(herMap) //добавление одного хэша в другой assert hisMap == [э:3, ю:2, я:3, z:3, x:1, y: 2] assert hisMap.isEmpty() == false assert hisMap.size() == 6 assert hisMap.containsKey('ю') == true assert 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] )  
  • 23. Хэши (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]    
  • 24. Регулярные выражения в groovy assert quot;32.99quot; == '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 quot;33quot; == roundedAmount('Total Amount: $32.99') assert quot;44quot; == roundedAmount('I paid $44.28 for it')    
  • 25. Регулярные выражения в groovy (продолжение) // чтобы найти все совпадения - findAll def string = quot;Moe Fine, Howard Fine, and Larry Finequot; def stooges = string.findAll(/(w+) Fine/) assert stooges == [quot;Moe Finequot;, quot;Howard Finequot;, quot;Larry Finequot;] // чтобы захватывать группы — используют запыкания def string = quot;Moe Fine, Howard Fine, and Larry Finequot; def firstNames = string.findAll(/(w+) Fine/) { match, firstName -> firstName } assert firstNames == [quot;Moequot;,  quot;Howardquot;, quot;Larryquot;]  
  • 26. Регулярные выражения в groovy (продолжение) foo = 42 str = '''blah #foo# blah''' re = '''(?xm) # to enable whitespace and comments # # a pound sign (w+) # the variable name # # another pound sign ''' finder = str =~ re found = finder[0] out = str.replaceAll(found[0], evaluate(found[1]).toString()) assert out == '''blah   42   blah'''
  • 27. Что читать про groovy 'Groovy in Action', Manning, 2007 Dierk Koenig, Andrew Glover, Paul King, Guillaume Laforge, Jon Skeet 'Groovy Recipes: Greasing the Wheels of Java' Pragmatic Bookshelf, 2008 Scott Davis    
  • 28. * 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/    
  • 29. * Про регулярные выражения — 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/