Introducció a Perl 6

Alex Muntada

Perl Mongers de Barcelona


Història de Perl


Camèlia

»ö« ...oi que és simpàtica? :)


Perl 6, Rakudo i Parrot


Exemple clàssic

Tal com es faria en Perl 5

    say "hello, world";
    
    say 42;


Exemple clàssic alternatiu

En Perl 6 també però ara, a més tot és un objecte

    "hello, world".say;
    
    42.say;


Tipus de variables

    my $string = "hello, world";
    my $number = 42;
    
    my @array  = 1, 2, 3;
    say @array[1];
    # 2
    
    my %hash   = key => 'value';
    say %hash{'key'};
    # value


Comprovació de tipus

    my Int $i = 42; $i = "hello, world";
    # Type check failed for assignment
    
    my Str $s = "hello, world"; $s = 42;
    # Type check failed for assignment
    
    my Str $s = "hello, world"; $s = 42.Str; $s.perl.say;
    # "42"


Tot és un objecte i una referència

    say ~[42.WHAT, 'string'.WHAT, (3/7).WHAT, /foo.*/.WHAT];
    # Int() Str() Rat() Regex()
    
    'string'.^methods.sort[40..45];
    # atanh bless bytes can capitalize ceiling
    
    "the big brown fox".split(' ').grep(/^b/).join(' and ');
    # big and brown
    
    my $a = { foo => [1,2,3] };
    $a<foo>.push(4);


Funcions i paràmetres

    sub func (Str $what, Int $times = 1) {
        say $what x $times
    }
    
    func "hello", 3; # hellohellohello
    func "hello";    # hello
    func;            # Not enough positional parameters passed;
                     # got 0 but expected between 1 and 2


Junctions

    say 'ok' if 5 == any(3,5,7);
    say 'ok' if 5 == 3|5|7;
    say 'ok' if 5 == none(4,6,8);
    
    my Junction $x = 3|5;
    say 'ok' if $x == 5;
    
    my @scores = 32, 41, 73, 99, 52;
    say 'ok' if all(@scores) > 30;


Sèries

    my $even = (2, 4 ... *);
    $even[^10].perl.say;
    # (2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
    
    my $fib = (1, 1, *+* ... *);
    $fib[^5].perl.say;
    # (1, 1, 2, 3, 5)


Orientació a objecte

    class Point {
        has Int $.x is rw;
        has Int $.y is rw;
        
        method clear {
            $.x = 0;
            $.y = 0;
        }
    }
    class Point3D is Point {
        has Int $.z is rw;
        
        method clear {
            nextsame;
            $.z = 0;
        }
    }


Gramàtiques

    grammar URI {
        token TOP {
            <schema> '://'
            [<hostname> | <ip> ]
            [ ':' <port>]?
            <path>?
        }
        token byte {
            (\d**{1..3}) <?{ $0 < 256 }>
        }
        token ip {
            <byte> [\. <byte> ] ** 3
        }
        token schema {
            \w+
        }
        token hostname {
            (\w+) ( \. \w+ )*
        }
        token port {
            \d+
        }
        token path {
            '/' <[ a..z A..Z 0..9 _\-.!~*'():@&=+$,/ ]>+
        }
    }
    
    my $match = URI.parse('http://perl6.org/documentation/');
    say $match<hostname>;  # perl6.org
    say $match<path>;      # documentation


Informació

http://perl6.org/
http://rakudo.org/
http://parrot.org/
http://barcelona.pm.org/