Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perl Now (students ed.)

Perl Now (students ed.)

Real-life usage of modern Perl features. Students edition.

Vadim Pushtaev

November 19, 2014
Tweet

More Decks by Vadim Pushtaev

Other Decks in Programming

Transcript

  1. PCRE / 8 \ ( \ d \ d \

    d \ ) \ d \ d \ d - \ d \ d - \ d \ d / ; m y $ t e s t = " 2 4 + 3 0 = 5 4 " ; $ t e s t = ~ s { ( \ d + ) ( [ - + * / ] ) ( \ d + ) = ( \ d + ) } { $ 4 = $ 3 $ 2 $ 1 } x ; p r i n t $ t e s t ; # 5 4 = 3 0 + 2 4 4 / 32
  2. PCRE — quiz / . / / [ a -

    z ] / / [ - a z ] / / ( v a d i m ) / / ( ? : v a d i m ) / / ^ v a d i m | k a t y a $ / / V a d i m ( ? ! P u s h t a e v ) / 5 / 32
  3. CPAN Comprehensive Perl Archive Network 138 649 модулей 11 749

    авторов 253 зеркала metacpan.org search.cpan.org 6 / 32
  4. Moose ООП-библиотека. p a c k a g e P

    e r s o n ; u s e M o o s e ; h a s f i r s t _ n a m e = > ( i s = > ' r w ' , i s a = > ' S t r ' , ) ; h a s l a s t _ n a m e = > ( i s = > ' r w ' , i s a = > ' S t r ' , ) ; P e r s o n - > n e w ( f i r s t _ n a m e = > ' V a d i m ' , l a s t _ n a m e = > ' P u s h t a e v ' , ) ; 7 / 32
  5. Moose — наследование p a c k a g e

    U s e r ; u s e M o o s e ; e x t e n d s ' P e r s o n ' ; h a s p a s s w o r d = > ( i s = > ' r o ' , i s a = > ' S t r ' , ) ; 8 / 32
  6. Moose — инициализация BUILD h a s a g e

    = > ( i s = > ' r o ' , i s a = > ' I n t ' , r e q u i r e d = > 1 ) ; h a s i s _ a d u l t = > ( i s = > ' r o ' , i s a = > ' B o o l ' ) ; s u b B U I L D { m y ( $ s e l f ) = @ _ ; $ s e l f - > i s _ a d u l t ( $ s e l f - > a g e > = 1 8 ) ; r e t u r n ; } 9 / 32
  7. Moose — инициализация default h a s a g e

    = > ( i s = > ' r o ' , i s a = > ' I n t ' , r e q u i r e d = > 1 ) ; h a s i s _ a d u l t = > ( i s = > ' r o ' , i s a = > ' B o o l ' , l a z y = > 1 , d e f a u l t = > s u b { m y ( $ s e l f ) = @ _ ; r e t u r n $ s e l f - > a g e > = 1 8 ; } ) ; 10 / 32
  8. Moose — инициализация builder h a s a g e

    = > ( i s = > ' r o ' , i s a = > ' I n t ' , r e q u i r e d = > 1 ) ; h a s i s _ a d u l t = > ( i s = > ' r o ' , i s a = > ' B o o l ' , l a z y = > 1 , b u i l d e r = > ' _ b u i l d _ i s _ a d u l t ' , ) ; s u b _ b u i l d _ i s _ a d u l t { m y ( $ s e l f ) = @ _ ; r e t u r n $ s e l f - > a g e > = 1 8 ; } p a c k a g e S u p e r M a n ; e x t e n d s ' P e r s o n ' ; s u b _ b u i l d _ i s _ a d u l t { r e t u r n 1 ; } 11 / 32
  9. Moose — миксины w i t h ' R o

    l e : : H a s P a s s w o r d ' ; p a c k a g e R o l e : : H a s P a s s w o r d ; u s e M o o s e : : R o l e ; u s e S o m e : : D i g e s t ; h a s p a s s w o r d = > ( i s = > ' r o ' , i s a = > ' S t r ' , ) ; s u b p a s s w o r d _ d i g e s t { m y ( $ s e l f ) = @ _ ; r e t u r n S o m e : : D i g e s t - > n e w ( $ s e l f - > p a s s w o r d ) ; } 12 / 32
  10. Moose — делегирование h a s d o c =

    > ( i s = > ' r o ' , i s a = > ' I t e m ' , h a n d l e s = > [ q w ( r e a d w r i t e s i z e ) ] , ) ; h a s l a s t _ l o g i n = > ( i s = > ' r w ' , i s a = > ' D a t e T i m e ' , h a n d l e s = > { ' d a t e _ o f _ l a s t _ l o g i n ' = > ' d a t e ' } , ) ; 13 / 32
  11. Moose — и т. д. b e f o r

    e ' i s _ a d u l t ' = > s u b { s h i f t - > r e c a l c u l a t e _ a g e } s u b t y p e ' M o d e r n D a t e T i m e ' = > a s ' D a t e T i m e ' = > w h e r e { $ _ - > y e a r ( ) > = 1 9 8 0 } = > m e s s a g e { ' T h e d a t e y o u p r o v i d e d i s n o t m o d e r n e n o u g h ' } ; h a s ' v a l i d _ d a t e s ' = > ( i s = > ' r o ' , i s a = > ' A r r a y R e f [ D a t e T i m e ] ' , ) ; p a c k a g e C o n f i g ; u s e M o o s e X : : S i n g l e t o n ; # i n s t e a d o f M o o s e h a s ' c a c h e _ d i r ' = > ( . . . ) ; 14 / 32
  12. DBIx::Class # S E L E C T * F

    R O M u s e r W H E R E a g e > = 1 8 m y @ a d u l t s = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h ( { a g e = > { ' > = ' = > 1 8 } , } ) ; f o r e a c h m y $ a d u l t ( @ a d u l t s ) { # U P D A T E u s e r S E T f i r e d = N O W ( ) W H E R E i d = . . . $ a d u l t - > u p d a t e ( { f i r e d = > \ ' N O W ( ) ' , } ) ; $ a d u l t - > c r y ( ) ; } 16 / 32
  13. DBIx::Class — схема _ _ P A C K A

    G E _ _ - > t a b l e ( ' u s e r _ i p ' ) ; _ _ P A C K A G E _ _ - > a d d _ c o l u m n s ( ' u s e r _ i d ' , { d a t a _ t y p e = > ' i n t e g e r ' , i s _ f o r e i g n _ k e y = > 1 , i s _ n u l l a b l e = > 0 } , ' i p ' , { d a t a _ t y p e = > ' v a r c h a r ' , i s _ n u l l a b l e = > 0 , s i z e = > 1 2 8 } , ) ; _ _ P A C K A G E _ _ - > s e t _ p r i m a r y _ k e y ( ' u s e r _ i d ' , ' i p ' ) ; _ _ P A C K A G E _ _ - > b e l o n g s _ t o ( ' u s e r ' , ' S c h e m a : : R e s u l t : : U s e r ' , { u s e r _ i d = > ' u s e r _ i d ' } , { i s _ d e f e r r a b l e = > 1 , o n _ d e l e t e = > ' C A S C A D E ' , o n _ u p d a t e = > ' C A S C A D E ' } , ) ; 17 / 32
  14. DBIx::Class — связи # S E L E C T

    * F R O M u s e r W H E R E i d = 8 1 8 5 8 m y $ u s e r = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( 8 1 8 5 8 ) ; m y $ f r e e _ s e r v i c e s = $ u s e r - > a c c o u n t s - > s e a r c h _ r e l a t e d ( ' s e r v i c e ' , { s t a t u s = > { ' < > ' = > $ D E L E T E D _ S T A T U S } , p r i c e = > 0 , } ) ; 18 / 32
  15. DBIx::Class — поиск m y $ m a n =

    $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h ( { ' n a m e ' = > ' В а с я ' , ' c a t . n a m e ' = > ' Б а р с и к ' , ' d o g . n a m e ' = > ' Б о б и к ' , } , { j o i n = > [ ' c a t ' , ' d o g ' ] , } ) ; 19 / 32
  16. DBIx::Class — создание $ p e r s o n

    _ r s - > c r e a t e ( { n a m e = > ' V a d i m P u s h t a e v ' , e m a i l = > ' v a d i m @ p u s h t a e v . r u ' , } ) ; $ a r t i s t _ r s - > c r e a t e ( { a r t i s t i d = > 4 , n a m e = > ' R a g e ' , c d s = > [ { t i t l e = > ' B l a c k i n M i n d ' , y e a r = > 1 9 9 5 } , { t i t l e = > ' X I I I ' , y e a r = > 1 9 9 8 } , { t i t l e = > ' 2 1 ' , y e a r = > 2 0 1 2 } , ] , } ) ; 20 / 32
  17. DBIx::Class — изменение $ s c h e m a

    - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( 8 1 8 5 8 ) - > u p d a t e ( { n a m e = > ' V a d i m ' , } ) ; $ s c h e m a - > r e s u l t s e t ( ' C d ' ) - > s e a r c h ( { t i t l e = > ' R e L o a d ' , } ) - > u p d a t e _ a l l ( { y e a r = > 1 9 9 7 , } ) ; 21 / 32
  18. AnyEvent u s e A n y E v e

    n t ; p r i n t " e n t e r y o u r n a m e > " ; m y $ n a m e ; m y $ w a i t _ f o r _ i n p u t = A n y E v e n t - > i o ( f h = > \ * S T D I N , p o l l = > ' r ' , c b = > s u b { $ n a m e = < S T D I N > ; } ) ; 22 / 32
  19. AnyEvent — condvars m y $ n a m e

    _ r e a d y = A n y E v e n t - > c o n d v a r ; m y $ w a i t _ f o r _ i n p u t = A n y E v e n t - > i o ( f h = > \ * S T D I N , p o l l = > " r " , c b = > s u b { $ n a m e = < S T D I N > ; $ n a m e _ r e a d y - > s e n d ; } ) ; # . . . $ n a m e _ r e a d y - > r e c v ; 23 / 32
  20. AnyEvent — источники m y $ w = A n

    y E v e n t = > t i m e r ( a f t e r = > 1 . 5 , c b = > { ' . . . ' } , ) ; # P O S I X s i g n a l m y $ w = A n y E v e n t - > s i g n a l ( s i g n a l = > " T E R M " , c b = > s u b { ' . . . ' ) , } 24 / 32
  21. Test::Class p a c k a g e T e

    s t : : U t i l s ; u s e b a s e ' T e s t : : C l a s s ' ; u s e U t i l s q w ( c u b e ) ; s u b t e s t _ c u b e : T e s t ( 2 ) { m y ( $ s e l f ) = @ _ ; i s ( c u b e ( - 2 ) , - 8 , ' n e g a t i v e ' ) ; i s ( c u b e ( 2 ) , 8 , ' p o s i t i v e ' ) ; r e t u r n ; } 25 / 32
  22. Test::Deep c m p _ b a g ( [

    7 , ' F r e d ' , { v a d i m = > ' p u s h t a e v ' } ] , [ ' F r e d ' , { v a d i m = > ' p u s h t a e v ' } , 7 ] , ' O K ' ) ; c m p _ d e e p l y ( $ o b j , m e t h o d s ( n a m e = > ' J o h n ' , [ ' f a v o u r i t e ' , ' f o o d ' ] = > ' t a c o ' ) ) ; # $ o b j - > n a m e e q ' J o i n ' ; # $ o b j - > f a v o u r i t e - > f o o d e q ' t a c o ' ; 26 / 32
  23. Test::MockObject u s e T e s t : :

    M o c k O b j e c t ; m y $ m o c k = T e s t : : M o c k O b j e c t - > n e w ( ) ; $ m o c k - > s e t _ t r u e ( ' s o m e m e t h o d ' ) ; o k ( $ m o c k - > s o m e m e t h o d ( ) ) ; $ m o c k - > s e t _ t r u e ( ' D e u t s c h ' ) - > s e t _ f a l s e ( ' E n g l i s h ' ) - > s e t _ s e r i e s ( ' n u m b e r s ' , ' E i n s ' , ' Z w e i ' , ' D r e i ' ) ; 27 / 32
  24. Test::DBIx::Class DBIx::Class::Schema::PopulateMore - G e n d e r :

    f i e l d s : l a b e l d a t a : f e m a l e : f e m a l e m a l e : m a l e - P e r s o n : f i e l d s : - n a m e - a g e - g e n d e r d a t a : j a n e : - j a n e - 4 0 - ' ! I n d e x : G e n d e r . f e m a l e ' j o h n : - j o h n - 3 8 - ' ! I n d e x : G e n d e r . m a l e ' 28 / 32
  25. Perl::Critic m y $ m a x _ c a

    c h e _ s i z e = 4 2 ; m y $ m a x C a c h e S i z e ; $ m a x _ c a c h e _ s i z e + + i f c o n d i t i o n ( ) ; $ o b j - > _ s o m e _ m e t h o d ( ) ; m y @ n a m e s = ( ' P u s h t a e v V a d i m ' , ' P u s h t a e v a E k a t e r i n a ' ) ; 29 / 32
  26. use strict; P e r l : : C r

    i t i c : : P o l i c y : : T e s t i n g A n d D e b u g g i n g : : R e q u i r e U s e S t r i c t p e r l 5 i u n i : : p e r l M o d e r n : : P e r l c o m m o n : : s e n s e 30 / 32
  27. TIMTOWTDI u n l e s s ( $ s

    e r v i c e - > f r e e ) { t a k e _ m o n e y ( $ s e r v i c e - > c o s t ) ; } $ e m p l o y e e - > f i r e ( ) i f $ e m p l o y e e - > s c o r e < 0 ; $ s t o r a g e - > a d d _ u s e r ( $ _ ) f o r e a c h @ u s e r s ; M y : : S t o r a g e - > c o p y ( $ f r o m = > $ t o ) ; h a s ' f i e l d ' = > ( i s = > ' r o ' , # . . . ) ; 31 / 32