Top Banner
Modern Perl for Non-Perl Programmers Dave Cross [email protected]
172

Modern Perl for Non-Perl Programmers

May 06, 2015

Download

Technology

Dave Cross

Does what it says on the tin. An introduction to Modern Perl programming aimed at programmers who have little or no experience in Perl.

I gave this course at the London Perl Workshop in November 2013.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Modern Perl for Non-Perl Programmers

Modern Perl forNon-Perl

Programmers

Dave [email protected]

Page 2: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Topics

● What is Modern Perl?● Variables● Flow control● Subroutines● References● Context

Page 3: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Topics

● CPAN● Useful Libraries

– Object Oriented Programming

– Database Access

– Web Programming

● Further Information

Page 4: Modern Perl for Non-Perl Programmers

What isModern Perl?

Page 5: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

What is Modern Perl

● Not well defined● Can mean at least two things● Changes to core Perl syntax● Big additions to Perl's toolset

– Moose

– DBIx::Class

– Catalyst

● We will cover both

Page 6: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Releases

● Annual release cycle– Usually in spring

● Minor versions when required● Even major version is stable

– 5.10.x, 5.12.x, 5.14.x, 5.16.x, 5.18.x, etc

● Odd major version is development– 5.9.x, 5.11.x, 5.13.x, 5.15.x, 5.17.x, 5.19.x, etc

Page 7: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Support

● Perl is maintained by volunteers● Support resource is limited● Official support for two major releases

– Currently 5.16 and 5.18

● Support for older releases may be available from vendors

Page 8: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Current Version

● 5.18.1– 12 Aug 2013

● 5.20.0 due next spring– 5.19.6

– 20 Nov 2013

Page 9: Modern Perl for Non-Perl Programmers

Introductionto Perl

Page 10: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Introduction to Perl

● Quick look at some Perl features● Differences from other languages● Variables● Flow control● Subroutines● Context

Page 11: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Variables in Perl

● Perl variables are of three kinds● Scalars● Arrays● Hashes● Filehandles and Subroutines can also be treated

like variables– But we won't be covering that today

Page 12: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Variable Types

● Not the kind of data they store– String, Integer, Float, Boolean

● The amount of data● How it is accessed

Page 13: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Variable Names

● Contain alphanumeric characters and underscores● User-defined variable names may not start with

numbers● Variable names are preceded by a punctuation

mark indicating the type of data

Page 14: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sigils

● Punctuations marks indicate variable type● Scalars use $

– $doctor

● Arrays use @– @time_lords

● Hashes use %– %companions

Page 15: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Declaring variables

● You don't need to declare variables● But it's a very good idea

– Typos

– Scoping

● use strict enforces this

● use strict;my $doctor;

● my ($doctor, @time_lords, %companions);

Page 16: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Scalar Variables

● Store a single item of data● my $name = "Arthur";

● my $whoami = 'Just Another Perl Hacker';

● my $meaning_of_life = 42;

● my $number_less_than_1 = 0.000001;

● my $very_large_number = 3.27e17; # 3.27 times 10 to the power of 17

Page 17: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Type Conversions

● Perl converts between strings and numbers whenever necessary

● Add int to a floating point number● my $sum = $meaning_of_life + $number_less_than_1;

● Putting a number into a string● print "$name says, 'The meaning of life is $sum.'\n";

Page 18: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Quoting Strings

● Single quotes don't expand variables or escape sequences

● my $price = '$9.95';

● Double quotes do● my $invline = "24 widgets @ $price each\n";

Page 19: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Backslashes

● Use a backslash to escape special characters in double quoted strings

● print "He said \"The price is \$300\"";

● This can look ugly

Page 20: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Better Quotes

● This is a tidier alternative● print qq(He said "The price is\$300");

● Also works for single quotes● print q(He said "That's too expensive");

● Doesn't need to be brackets

Page 21: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Choose Your Quotes

● Choose characters to use with q() and qq()● Brackets

– Close with opposite character

– q(...), q[...], q{...}, q<...>

● Non-brackets– Close with same character

– q/.../, q|...|, q+...+, q#...#

● Similar rules for many quote-like operators

Page 22: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Undefined Values

● A scalar that hasn't had data put into it will contain the special value “undef”

● Test for it with defined() function

● if (defined($my_var)) { ... }

● Like NULL in SQL

Page 23: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Array Variables

● Arrays contain an ordered list of scalar values● my @fruit = ('apples', 'oranges', 'guavas', 'passionfruit', 'grapes');

● my @magic_numbers = (23, 42, 69);

● Individual elements can be different types● my @random_scalars = ('mumble', 123.45, 'dave cross', -300, $name);

Page 24: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Array Elements

● Accessing individual elements of an array● print $fruits[0];# prints "apples"

● Note: Indexes start from zero● print $random_scalars[2];# prints "dave cross"

● Note @ changes to $ when accessing single elements

Page 25: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sigil Changes

● Array sigil changes from @ to $● When accessing individual elements● Each element is a scalar● Therefore use scalar sigil● Similar in English

– “These elements” vs “This element”

Page 26: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Array Slices

● Returns a list of elements from an array● print @fruits[0,2,4];# prints "apples", "guavas",# "grapes"

● print @fruits[1 .. 3];# prints "oranges", "guavas",# "passionfruit"

● Note use of @ as we are accessing more than one element of the array– “These elements”

Page 27: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Setting Array Values

● $array[4] = 'something';

● $array[400] = 'something else';

● Also with slices● @array[4, 7 .. 9] = ('four','seven', 'eight','nine');

● @array[1, 2] = @array[2, 1];

Page 28: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Array Size

● $#array is the index of the last element in @array

● Therefore $#array + 1 is the number of elements

● $count = @array;

● Does the same thing and is easier to understand

Page 29: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Array vs List

● Arrays and lists are different● Often confused● Array is a variable

– @array● List is a data literal

– (1, 2, 3, 4)● Like $scalar vs 'string'● Lists can be stored in arrays

– @array = (1, 2, 3, 4);

Page 30: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Hash Variables

● Hashes implement “look-up tables” or “dictionaries”

● Initialised with a list● %french = ('one', 'un', 'two', 'deux', 'three', 'trois');

Page 31: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Fat Comma

● The “fat comma” is easier to understand● %german = (one => 'ein', two => 'zwei', three => 'drei');

Page 32: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Accessing Hash Values

● $three = $french{three};

● print $german{two};

● Note sigil change● For exactly the same reason

Page 33: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Hash Slices

● Just like array slices● Returns a list of elements from a hash● print @french{'one','two','three'};# prints "un", "deux" & "trois"

● Strange sigil change– % becomes @

– A list of values

Page 34: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Setting Hash Values

● $hash{foo} = 'something';

● $hash{bar} = 'something else';

● Also with slices● @hash{'foo', 'bar'} = ('something', 'else');

● @hash{'foo', 'bar'} = @hash{'bar', 'foo'};

Page 35: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

The Default Variable

● Many Perl operations either set $_ or use its value if no other is given

● print; # prints the value of $_

● If a piece of Perl code seems to be missing a variable, then it's probably using $_

● Think of “it” or “that” in English

Page 36: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Using the Default Variable

● while (<$file>) { if (/regex/) { print; }}

● Three uses of $_

– Input

– Match

– Print

Page 37: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Flow Control

● Perl has all the flow control features you'd expect● And some that you might not● Flow is controlled by Boolean logic

Page 38: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Boolean Values in Perl

● Perl has no Boolean data type● All scalar values are either true or false● Small set of false values

– 0, undef, empty string, empty list

● Everything else is true

Page 39: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Comparison Operators

● Compare two values in some way● Are they equal

– $x == $y or $x eq $y

– $x != $y or $x ne $y

● Is one greater than another– $x > $y or $x gt $y

– $x >= $y or $x ge $y

Page 40: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Two Sets of Operators

● Remember Perl converts between types● Is “0” the same as “0.0”?

– As a number it is– As a string it isn't

● Programmer needs to tell Perl the kind of comparison to make● String

– eq, ne, lt, le, gt, ge● Number

– ==, !=, <, <=, >, >=

Page 41: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Comparison Examples

● 62 > 42 # true

● '0' == (3 * 2) - 6 # true

● 'apple' gt 'banana' # false

● 'apple' == 'banana' # true(!)

● 1 + 2 == '3 bears' # true

● 1 + 2 == 'three' # false

Page 42: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Boolean Operators

● Combine conditional expressions● EXPR_1 and EXPR_2

– true if both EXPR_1 and EXPR_2 are true● EXPR_1 or EXPR_2

– true if either EXPR_1 or _EXPR_2 are true

● Alternative syntax && for “and” and || for “or”● Different precedence though

Page 43: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Short-Circuit Logic

● EXPR_1 or EXPR_2● Only need to evaluate EXPR_2 if EXPR_1

evaluates as false● We can use this to make code easier to follow● open my $file, 'something.dat' or die "Can't open file: $!";

● @ARGV == 2 or print $usage_msg;

Page 44: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Flow Control in Perl

● Standard flow control statements– if/elsif/else

– for

– while

● Some less standard ones– unless

– foreach

– until

Page 45: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

If / Else

● if (EXPR) { BLOCK}

● if (EXPR) { BLOCK1} else { BLOCK2}

Page 46: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

If / Else

● if ($lives < 0) { die “Game over”;}

● if ($lives < 0) { die “Game over”;} else { print “You won!”;}

Page 47: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

If / Elsif / Else

● if (EXPR1) { BLOCK1} elsif (EXPR2) { BLOCK2} else { BLOCK3}

● Note spelling of “elsif”● As many elsif clauses as you want● Else clause is optional

Page 48: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

If / Elsif / Else

● if ($temp > 25) { print “Too hot”;} elsif ($temp < 10) { print “Too cold”;} else { print “Just right”;}

Page 49: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

For

● C-style for loop● for ( INIT; EXPR; INCR ) { BLOCK}

– Execute INIT

– If EXPR is false exit loop

– Execute BLOCK and INCR

– Retry EXPR

● Rarely used

Page 50: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

For

● for ( $x = 0; $x <=10 ; ++$x ) { print “$x squared is “, $x * $x;}

Page 51: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

While

● Execute loop while a condition is true● while (EXPR) { BLOCK}

Page 52: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

While

● while ($continue) { if (do_something_useful()) { print $interesting_value; } else { $continue = 0; }}

Page 53: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Unless

● Inverted if● unless ( EXPR ) { BLOCK}

● Exactly the same as● if ( ! EXPR ) { BLOCK}

● Unless/else works– But is usually unhelpful

● There is no elsunless

Page 54: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Unless

● unless ($lives) { die “Game over”;}

Page 55: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Foreach

● Iterate over a list● foreach VAR ( LIST ) { BLOCK}

● For each element in LIST● Put element in VAR● Execute BLOCK● Often simpler than equivalent for loop

Page 56: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Foreach

● foreach my $x ( 1 .. 10 ) { print “$x squared is “, $x * $x;}

Page 57: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Until

● Inverted while● until ( EXPR ) { BLOCK}

● Exactly the same as● while ( ! EXPR ) { BLOCK}

Page 58: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Until

● until ($stop) { if (do_something_useful()) { print $interesting_value; } else { $stop = 1; }}

Page 59: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Common Usage

● A while loop is often used to read from files● while (<$filehandle>) { # Do stuff}

● Reads a record at a time● Stores the record in $_

Page 60: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Statement Modifiers

● Condition at end of statement● Invert logic● Can be more readable

– help_text() if $option eq '-h'

– print “Game over” unless $lives

– print while <$filehandle>

● Omit condition brackets

Page 61: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subroutines

● Perl subroutines work much like other languages● Subroutines have a name and a block of code

● Defined with the sub keyword

● sub a_subroutine { # do something useful}

Page 62: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subroutine Arguments

● Subroutine arguments end up in @_● sub do_stuff { my ($arg1, $arg2) = @_;

# Do something with # $arg1 and $arg2}

● Variable number of arguments

Page 63: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Pass By Reference

● Values in @_ are aliases to external variables● my $x = 10;square($x);print $x; # prints 100

sub square { $_[0] = $_[0] * $_[0];}

● Usually not a good idea

Page 64: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Pass By Value

● Take copies of the arguments● Return changed values● my $x = 10;my $sqr = square($x);print $sqr; # prints 100

sub square { my ($arg) = @_; return $arg * $arg;}

Page 65: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Returning Values

● Subroutines return a list● So it's simple to return a variable number of values● sub is_odd { my @odds; foreach (@_) { push @odd, $_ if $_ % 2; } return @odds;}

Page 66: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subroutine Variables

● Variable can be scoped to within a subroutine● sub with_var { my $count = 0; # scoped to sub print ++$count; # always prints 0}

● Good practice● Variables are recreated each time subroutine is called

Page 67: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Static Variables

● Use state to declare variables that retain values between calls

● sub with_static_var { state $count = 0; # scoped to # sub say ++$count; # increments on # each call}

● Introduced in Perl 5.10.0

Page 68: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Prototypes

● You might see code with prototypes for subroutines● sub with_a_prototype ($$$) { my ($foo, $bar, $baz) = @_; ...}

● Not like prototypes in other languages● Rarely necessary● Often confusing

Page 69: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

References

● Sometimes arrays and hashes are hard to use● Need a reference to a variable● A bit like a pointer

– But cleverer

– A reference knows what type it is a reference to

● Unique identifier to a variable● Always a scalar value

Page 70: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Creating a Reference

● Use \ to get a reference to a variable– my $arr_ref = \@array

– my $hash_ref = \%hash

● Or create an anonymous variable directly– my $arr_ref = [ 'foo', 'bar', 'baz' ]

– my $hash_ref = { one => 1, two => 2 }

Page 71: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Using References

● Use -> to access elements from a reference– $arr_ref->[0]

– $hash_ref->{one}

● Use @ or % to get whole variable– @array = @$arr_ref

– %hash = %$hash_ref

Page 72: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Why Use References

● Arrays and hashes are hard to pass as parameters to subroutines

● my_sub(@arr1, @arr2)

● And then inside subroutine● my (@a1, @a2) = @_

– Doesn't work

– Arrays are flattened in @_

– List assignment works against us

Page 73: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Parameters as References

● Take references instead● my_sub(\@arr1, \@arr2)

● And then inside subroutine● my ($a1, $a2) = @_

– Works as expected

– Array references are scalar values

– List assignment is tamed

Page 74: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

More References

● Printing a reference is unhelpful– ARRAY(0xcce998)

– HASH(0x2504998)

● Use ref to see what type a reference is– ref [ 1, 2, 3 ]

● ARRAY

– ref { foo => 'bar' }● HASH

Page 75: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Advanced References

● Perl objects are usually implemented as hash references– But they are “blessed”

● You can create references to subroutines– my $sub_ref = \&my_sub;$sub_ref->('some', 'parameters');

● Anonymous subroutines– my $sub_ref = sub { print “Boo” };$sub_ref->();

Page 76: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Context

● Perl expressions can evaluate to different values according to context

● The way that they are evaluated● @arr = localtime

– (56, 31, 15, 22, 8, 112, 6, 265, 1)

● $scalar = localtime

– Sat Sep 22 15:31:56 2012

Page 77: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Scalar Context

● Assignment to a scalar variable● Boolean expression

– if (@arr) { ... }

● Some built-in functions that take one parameter● Operands to most operators● Force scalar context with scalar

– print scalar localtime

Page 78: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

List Context

● List assignments– @arr = some_function()

– ($x, $y, $z) = some_function()

– ($x) = some_function()

● Most built-in functions

Page 79: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subroutine Parameters

● A common error● sub something { my $arg = @_; ...}

● Should be● sub something { my ($arg) = @_; ...}

Page 80: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Context Rules

● There are no general rules● Need to learn● Or read documentation

Page 81: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Mind Your Contexts

● The difference can be hard to spot● print “Time: ”, localtime;

● print “Time: ” . localtime;

● Comma imposes list context● Concatenation imposes scalar context

Page 82: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

File Input Contexts

● The file input operator handles different contexts● $line = <$filehandle>;

● @lines = <$filehandle>;

● ($line) = <$filehandle>; # danger!

Page 83: Modern Perl for Non-Perl Programmers

CPAN

Page 84: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

CPAN

● Comprehensive Perl Archive Network● Free Perl modules● Searchable

– metacpan.org● Ecosystem of web sites

– CPAN testers– cpanratings– Annocpan– CPAN deps– Many more...

Page 85: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Installing CPAN Modules

● Try your usual package repositories– yum

– apt-get

– ppm

● May not have the modules you want– Or may have slightly older versions

Page 86: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Installing CPAN Modules

● Various command line tools– CPAN Shell (cpan)

– CPANPLUS (cpanp)

– CPANMinus (cpanm)

● Install dependencies too

Page 87: Modern Perl for Non-Perl Programmers

Useful CPANLibraries

Page 88: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Useful CPAN Libraries

● Powerful CPAN modules● Object-Oriented Programming● Database access

– Object Relational Mapping

● Web Development– MVC frameworks

– Server/application glue

Page 89: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Object Oriented Programming

● Perl has supported OOP since version 5.0– October 1994

● Perl 5 OO sometimes described as appearing “bolted on”

● That's because it was bolted on● Powerful and flexible● Not particularly easy to understand

Page 90: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Enter Moose

● A complete modern object system for Perl 5● Based on experiments with Perl 6 object model● Built on top of Class::MOP

– MOP - Meta Object Protocol

– Set of abstractions for components of an object system

– Classes, Objects, Methods, Attributes

● An example might help

Page 91: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Moose Example

● package Point;use Moose;

has 'x' => (isa => 'Int', is => 'rw');has 'y' => (isa => 'Int', is => 'rw');

sub clear { my $self = shift; $self->x(0); $self->y(0);}

Page 92: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Creating Attributes

● has 'x' => (isa => 'Int', is => 'rw')

– Creates an attribute called 'x'

– Constrained to be an integer

– Read-write

● has 'y' => (isa => 'Int', is => 'rw')

Page 93: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Defining Methods

● sub clear { my $self = shift; $self->x(0); $self->y(0);}

● First parameter is the object– Stored as a blessed hash reference

● Uses generated methods to set x & y

Page 94: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subclassing

● package Point3D;use Moose;

extends 'Point';

has 'z' => (isa => 'Int', is => 'rw');

after 'clear' => sub { my $self = shift; $self->z(0);};

Page 95: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Subclassing

● extends 'Point'

– Define which class we're a subclass of

● has 'z' => ( isa = 'Int', is => 'rw')

– Adds new attribute 'z'

Page 96: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Extending Methods

● after 'clear' => sub { my $self = shift; $self->z(0);};

● New clear method for subclass● Called after method for superclass

Page 97: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Using Moose Classes

● Moose classes are used just like any other Perl class● $point = Point->new(x => 1, y => 2);say $point->x;

● $p3d = Point3D->new(x => 1, y => 2, z => 3);$p3d->clear;

Page 98: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

More About Attributes

● Use the has keyword to define your class's attributes

● has 'first_name' => ( is => 'rw' );

● Use is to define rw or ro

Page 99: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Getting & Setting

● By default each attribute creates a method of the same name.

● Used for both getting and setting the attribute● $dave->first_name('Dave');

● say $dave->first_name;

Page 100: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Required Attributes

● By default Moose class attributes are optional● Change this with required

● has 'name' => ( is => 'ro', required => 1,);

● Forces constructor to expect a name

● Although that name could be undef

Page 101: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Attribute Defaults

● Set a default value for an attribute with default● has 'size' => ( is => 'rw', default => 'medium',);

● Can use a subroutine reference● has 'size' => ( is => 'rw', default => \&rand_size,);

Page 102: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

More Attribute Properties

● lazy– Only populate attribute when queried

● trigger– Subroutine called after the attribute is set

● isa– Set the type of an attribute

● Many more

Page 103: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

More Moose

● Many more options● Support for concepts like delegation and roles● Powerful plugin support

– MooseX::*● Lots of work going on in this area

Page 104: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Database Access

● Perl has standard tools for accessing databases● DBI (Database Interface)

– Standardised interface

● DBD (Database Driver)– Specific support for particular database engine

Page 105: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Good and Bad

● Good– Standardised

– Supports many databases

● Bad– SQL

Page 106: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Object Relational Mapping

● Databases map well to OO● Tables are classes● Rows are objects● Columns are attributes● Not a new idea

Page 107: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

DBIx::Class

● DBI extension● Define classes in Perl● We write Perl● DBIx::Class writes the SQL

Page 108: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

No More SQL

● Old style● my $sql = 'update thing set foo = “new foo” where id = 10';my $sth = $dbh->prepare($sql);$sth->execute;

Page 109: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

No More SQL

● New style● my $things = $schema->resultset('Thing');my $thing = $foo->find(10);$thing->foo('new foo');$thing->update;

Page 110: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

ORM Basics

● Each class needs some information● The table it represents● The columns in that table● The types of those columns● Which column is the primary key● Which columns are foreign keys

Page 111: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Artist Class

● package CD::Schema::Result::Artist;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');__PACKAGE__->add_columns(qw/ id name /);__PACKAGE__->set_primary_key('id');__PACKAGE__->has_many(cds => 'CD::Schema::Result::CD', 'artist'); 1;

Page 112: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Artist Class

● package CD::Schema::Result::Artist;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');__PACKAGE__->add_columns(qw/ id name /);__PACKAGE__->set_primary_key('id');__PACKAGE__->has_many(cds => 'CD::Schema::Result::CD', 'artist'); 1;

Page 113: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Artist Class

● package CD::Schema::Result::Artist;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');__PACKAGE__->add_columns(qw/ id name /);__PACKAGE__->set_primary_key('id');__PACKAGE__->has_many(cds => 'CD::Schema::Result::CD', 'artist'); 1;

Page 114: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Artist Class

● package CD::Schema::Result::Artist;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');__PACKAGE__->add_columns(qw/ id name /);__PACKAGE__->set_primary_key('id');__PACKAGE__->has_many(cds => 'CD::Schema::Result::CD', 'artist'); 1;

Page 115: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Artist Class

● package CD::Schema::Result::Artist;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('artist');__PACKAGE__->add_columns(qw/ id name /);__PACKAGE__->set_primary_key('id');__PACKAGE__->has_many(cds => 'CD::Schema::Result::CD', 'artist'); 1;

Page 116: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample CD Class

● package CD::Schema::Result::CD;use base qw/DBIx::Class::Core/;

__PACKAGE__->table('cd');__PACKAGE__->add_columns(qw/ id artist title year /);__PACKAGE__->set_primary_key('cd');__PACKAGE__->belongs_to(artist => 'CD::Schema::Result::Artist', 'artist');

1;

Page 117: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Sample Schema Class

● package CD::Schema;use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_namespaces();

1;

Page 118: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Listing Artists

● use CD::Schema;my $sch = CD::Schema->connect( $dbi_dsn, $user, $pass);

my $artists_rs = $sch->resultset('Artist');

my @artists = $artists_rs->all;

Page 119: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Listing Artists

● foreach my $artist (@artists) { say $artist->name;

foreach my $cd ($artist->cds) { say “\t”, $cd->title, ' (', $cd->year, ')'; }}

Page 120: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Searching Artists

● my @davids = $artist_rs->search({ name => { like => 'David %' },});

● Powerful searching syntax

Page 121: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Adding CD

● my $bowie = $artist_rs->single({ name = 'David Bowie',});

my $toy = $bowie->add_to_cds({ title => 'The Next Day', year => 2013,});

Page 122: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Auto-Generating Schema

● Writing schema classes is boring● Need to stay in step with database● Easy to make a mistake● Or to forget to update it● Auto-generate from database metadata

Page 123: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

ORM Basics

● Each class needs some information● The table it represents● The columns in that table● The types of those columns● Which column is the primary key● Which columns are foreign keys● Database knows all of these

Page 124: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

DBIx::Class::Schema::Loader

● Connects to database● Queries metadata● Generates class definitions● Writes them to disk● Command line program

– dbicdump

Page 125: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Schema Loader Example

● CREATE DATABASE CD;

CREATE TABLE artist ( id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(200)) ENGINE=InnoDB;

CREATE TABLE cd ( id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, artist INTEGER, title VARCHAR(200), year INTEGER, FOREIGN KEY (artist) REFERENCES artist (id)) ENGINE=InnoDB;

Page 126: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Schema Loader Example

● $ mysql -uuser -ppass -Dcd < cd.sql

● $ dbicdump CD::Schema dbi:mysql:database=cd root ''Dumping manual schema for CD::Schema to directory . ...Schema dump completed.

● $ find CDCDCD/SchemaCD/Schema/ResultCD/Schema/Result/Cd.pmCD/Schema/Result/Artist.pmCD/Schema.pm

Page 127: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Web Development

● Writing a web application is always harder than you think it will be

● A good framework makes things easier● Takes care of the boring things

– Authentication/Authorisation

– Session management

– Logging

– Etc...

Page 128: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Web Frameworks

● Plenty to choose from on CPAN● Web::Simple

– Simple to install and use

● Dancer– Lightweight and flexible

● Mojolicious– “Next Generation Web Framework”

● Catalyst– Extremely powerful

Page 129: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Building on Existing Tools

● Frameworks build on existing tools● Template Toolkit

– Generating HTML

● DBIx::Class● Moose● Not mandatory

– Not opinionated software

Page 130: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Dancer

● Route-based framework● use Dancer;

get '/' => sub { return 'Hello World”;};

dance;

● bin/app.pl

Page 131: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Catalyst

● MVC framework– Model, View, Controller

● Most popular Perl web framework● Powerful● Flexible

Page 132: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI & Plack

● PSGI is the future of Perl web development– But it's here now

● PSGI is a protocol specification● Plack is a toolkit

Page 133: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

What's the Problem?

● Web apps run in many environments● CGI● mod_perl handler● FCGI● Etc...● All have different interfaces

Page 134: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

What's the Problem?

● There are many Perl web frameworks● They all need to support all of the web

environments● Duplication of effort

– Catalyst supports mod_perl

– Dancer supports mod_perl

– Web::Simple supports mod_perl

– Etc...

Page 135: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI

● Perl Server Gateway Interface● Defines interaction between web application and

web server● A bit like CGI● A lot like WSGI

Page 136: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

What's the Advantage?

● Web frameworks only support PSGI interface● One PSGI interface per web environment● Less duplication of effort● Bonus● Easily portable code

Page 137: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Other Advantages

● Standardised development servers● Easier testing● Middleware

Page 138: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI Definition

● A PSGI application is● A reference to a subroutine● Input is a hash

– Actually a hash reference

● Output is a three-element array– HTTP status code

– Headers

– Body

Page 139: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Reference to Subroutine

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 140: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Reference to Subroutine

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 141: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Hash Reference

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 142: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Hash Reference

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 143: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Return Array Reference

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 144: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Return Array Reference

● my $app = sub { my $env = shift;

return [ 200, [ ‘Content-Type’,‘text/plain’ ], [ ‘Hello World’ ], ];};

Page 145: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Plack

● PSGI is just a specification● Plack is a bundle of tools for working with that

specification– Available from CPAN

– A lot like Rack

● Many useful modules and programs

Page 146: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

plackup

● Test PSGI server● $ plackup app.psgiHTTP::Server::PSGI: Accepting connections at http://localhost:5000/

Page 147: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Middleware

● Middleware wraps around an application● Returns another PSGI application● Simple spec makes this easy● Plack::Middleware::*● Plack::Builder adds middleware configuration

language

Page 148: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Middleware Example

● use Plack::Builder;use Plack::Middleware::Runtime;

my $app = sub { my $env = shift;

return [ 200, [ 'Content-type', 'text/plain' ], [ 'Hello world' ], ]};

builder { enable 'Runtime'; $app;}

Page 149: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Middleware Example

● $ HEAD http://localhost:5000200 OKDate: Tue, 20 Jul 2010 20:25:52 GMTServer: HTTP::Server::PSGIContent-Length: 11Content-Type: text/plainClient-Date: Tue, 20 Jul 2010 20:25:52 GMTClient-Peer: 127.0.0.1:5000Client-Response-Num: 1X-Runtime: 0.000050

Page 150: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Plack::App::*

● Ready-made solutions for common situations● Plack::App::CGIBin

– cgi-bin replacement

● Plack::App::Directory– Serve files with directory index

● Plack::App::URLMap– Map apps to different paths

Page 151: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Application Example

● use Plack::App::CGIBin;use Plack::Builder;

my $app = Plack::App::CGIBin->new( root => '/var/www/cgi-bin')->to_app;

builder { mount '/cgi-bin' => $app;};

Page 152: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Framework Support

● Most modern Perl frameworks already support PSGI

● Catalyst, CGI::Application, Dancer, Jifty, Mason, Maypole, Mojolicious, Squatting, Web::Simple

● Many more

Page 153: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI Server Support

● nginx support● mod_psgi● Plack::Handler::Apache2

Page 154: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI Server Support

● Many new web servers support PSGI● Starman, Starlet, Twiggy, Corona,

HTTP::Server::Simple::PSGI● Perlbal::Plugin::PSGI

Page 155: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

PSGI/Plack Summary

● PSGI is a specification● Plack is an implementation● PSGI makes your life easier● Most of the frameworks and servers you use

already support PSGI● No excuse not to use it

Page 156: Modern Perl for Non-Perl Programmers

FurtherInformation

Page 157: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Further Information

● Very high-level overview● Lots of information available

– Perl documentation

– Books

– Web sites

– Mailing lists

– User groups

– Conferences

Page 158: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Documentation

● Perl comes with a huge documentation set● Access it via “perldoc”● perldoc perl● perldoc perltoc● perldoc perlfaq● perldoc perldoc

Page 159: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perldoc Options

● Documentation for a particular function– perldoc -f print

● Documentation for a particular variable– perldoc -v @_

● Search the FAQ for a keyword– perldoc -q sort

Page 160: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Books

● Essential Perl books● Learning Perl (6ed)

– Schwartz, Phoenix and foy

● Programming Perl (4ed)– Wall, Christiansen, Orwant and foy

● Perl Best Practices– Damian Conway

Page 161: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Books

● Effective Perl Programming– Hall, McAdams and foy

● Intermediate Perl (2ed)– Schwartz, foy and Phoenix

● Mastering Perl– brian d foy

Page 162: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Books

● Beginning Perl– Curtis Poe

● Perl Testing – A Developers Notebook– Langworth, chromatic

Page 163: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Books

● Modern Perl– chromatic

● Definitive Guide to Catalyst– Diment, Trout

Page 164: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Web Sites

● Perl home page– www.perl.org

● Perl documentation– perldoc.perl.org

● CPAN– metacpan.org

Page 165: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Web Sites

● Perl News– perlnews.org

● Perl Blogs– blogs.perl.org

– ironman.enlightenedperl.org

● Perl Foundation– perlfoundation.org

Page 166: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Web Sites

● Perl User Groups (Perl Mongers)– www.pm.org

● Perl Help– perlmonks.org

– stackoverflow.com/questions/tagged/perl

● Perl Tutorials– perl-tutorial.org

Page 167: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Mailing Lists

● Dozens of lists– lists.perl.org

● Perl Weekly– perlweekly.com

Page 168: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl User Groups

● Perl user groups are called “Perl Mongers”● Hundreds of groups worldwide

– www.pm.org

● London.pm one of the largest groups– london.pm.org

● Monthly social meetings● Bi-monthly (ish) technical meetings● Mailing list

Page 169: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Conferences

● OSCON (Open Source Convention)– Originally The Perl Conference

– 20 – 24 July 2014, Portland OR

● YAPC (Yet Another Perl Conference)– 23 – 25 June 2014, Orlando FL

– August 2014, Sofia, Bulgaria

Page 170: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

Perl Workshops

● Low cost (free)● One-day● Many cities all over the world● London Perl Workshop

– londonperlworkshop.org.uk

– Nov/Dec

Page 171: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013

The End

● Thank you for coming● Hope you enjoyed it● Hope it was useful● Any questions?

Page 172: Modern Perl for Non-Perl Programmers

London Perl Workshop30th November 2013