This video was recorded at the Italian Perl Workshop in Pisa, Italy. The video contains many slides that are hard to read so these have been added in a scrollable box at the bottom of the page - each slide is seperated with a ----, you can move the slides in time to the presentation
    The video source can be found at:
    
    http://www.shadowcat.co.uk/archive/conference-video/ipw-2009/antiquated/video/-antiq-perl.flv
    
  
          This text will be replaced
      
        
Antiquated Perl
----
Modern Perl?
----
Post Modern Perl
----
Enlightened Perl
----
everybody knows
----
Catalyst Moose DBIx::Class
----
Modern Perl?
----
perl5 v10
----
  given ($x) {
   when (3) {
  ...
----
~~
----
what's the opposite?
----
Old Perl?
----
if it works
----
Legacy Perl?
----
not interesting
----
Stupid Perl
----
*$&^*(^ FormMail.PL
----
Antiquated Perl
----
Antique
----
Old *and* beautiful
----
Simple Elegant
----
$|++
----
use IO::Handle; STDOUT->autoflush(1);
----
it's core. it's fine.
----
but why think?
----
select((select(FOO),$|++)[0])
----
(select(FOO),$|++) -> ($old_selected_fh,$|)
----
(select(FOO),$|++)[0] -> $old_select_fh
----
select((select(FOO),$|++)[0]) -> use IO::Handle; FOO->autoflush(1)
----
~~
----
~~@x
----
~(~(@x))
----
bitwise negation
----
so ...
----
~@x -> ~(scalar @x)
----
~~$number -> $number
----
~~@x -> scalar @x
----
perl -MMoose -e'print ~~keys %INC' 84
----
overload::constant
----
lets you affect parsing
----
numbers strings
----
q qq qr t s qw
----
i18n.pm
----
~~"$foo bar"
loc("_[0] bar", $foo)
----
for
----
  for ($foo) {
    /bar/ and ...
----
  for ($foo) {
    /bar/ and return do {
      <code here>
    }
----
/foo/gc
----
/\Gbar/gc
----
  sub parse {
    my ($self, $str) = @_;
    for ($str) {
      /match1/gc and return
        $self->_subparse_1($_)
----
  sub _subparse_1 {
    my ($self) = @_;
    for ($_[1]) {
      /\Gsubmatch1/gc ...
----
prototypes
----
  sub foo (&) {
----
  foo {
    ...
  };
----
prototype \&foo
----
typeglobs
----
  *{"${package}::${name}"}
    = sub { ... }
----
local
----
local $_
----
  local *Carp::croak
    = \&Carp::confess;
----
  do {
    local (@ARGV, $/) = $file;
    <>
  }
----
strict and warnings
----
strict->import
----
affects compilation scope
----
  sub strict_and_warnings::import {
    strict->import;
    warnings->import;
  }
----
use strict_and_warnings;
----
$^H %^H
----
  $^H |= 0x120000;
  $^H{'foo'}
    = bless($foo, 'My::Foo');
----
  sub My::Foo::DESTROY {
----
  delete ${$package}{myimport}
----
B::Hooks::EndOfScope
----
tie
----
tie $var, 'Foo';
----
sub FETCH sub STORE
----
Scalar Array Hash Handle
----
now ...
----
mst: destruction testing technology since March 1983
----
3 days old
----
2 weeks early
----
incubator
----
glass box plastic tray heater
----
design flaw
----
BANG
----
so ...
----
interesting fact
----
prototypes only warn when parsed
----
error when compiled
----
so ...
----
  dispatch [
    sub (GET + /) { ... },
    sub (GET + /user/*) { ... }
  ];
----
  foreach my $sub (@$dispatch) {
    my $proto = prototype $sub;
    $parser->parse($proto);
    ...
----
  PARSE: { do {
    push @match, $self->_parse_spec_section($spec)
      or $self->_blam("Unable to work out what the next section is");
    last PARSE if (pos == length);
    /\G\+/gc or $self->_blam('Spec sections must be separated by +');
  } until (pos == length) };
----
  sub _blam {
    my ($self, $error) = @_;
    my $hat = (' ' x pos).'^';
    die "Error parsing dispatch specification: ${error}\n
  ${_}
  ${hat} here\n";
  }
----
  Error parsing ...
  GET+/foo
     ^ here
----
  sub (GET + /user/*) {
   my ($self, $user) = @_;
----
I hate fetching $self
----
  *{"${app}::self"}
    = \${"${app}::self"};
----
use vars
----
  sub _run_with_self {
    my ($self, $run, @args) = @_;
    my $class = ref($self);
    no strict 'refs';
    local *{"${class}::self"} = \$self;
    $self->$run(@args);
  }
----
HTML output
----
templates
----
HTML is NOT TEXT
----
  <div>,
    $text,
  </div>;
----
<div>
----
<$fh>
----
  tie *{"${app}::${name}"},
    'XML::Tags::TIEHANDLE',
    "<${name}>";
----
  sub TIEHANDLE { my $str = $_[1]; bless \$str, $_[0] }
  sub READLINE { ${$_[0]} }
----
  sub DESTROY {
    my ($into, @names) = @$_[0];
    no strict 'refs';
    delete ${$into}{$_}
      for @names;
  }
----
</div>
----
glob('/div');
----
  *CORE::GLOBAL::glob
    = sub { ... };
----
  delete
    ${CORE::GLOBAL::}{glob};
----
  sub foo {
    use XML::Tags qw(div);
    <div>, "foo!", </div>;
  }
----
what about interpolation
----
my $stuff = 'foo"bar'; <a href="$stuff">
----
hmm ...
----
overload::constant!
----
  glob('a href="'.$stuff.'"');
----
  glob(
    bless(\'a href="', 'MagicTag')
    .$stuff
    .bless(\'"', 'MagicTag')
  )
----
  use overload
    '.' => 'concat';
   sub concat {
----
hooking it up
----
  sub (.html) {
    filter_response {
      $self->render_html($_[1])
    }
  }
----
  bless(
    $_[1],
    'Web::Simple::ResponseFilter'
  );
----
  if ($self->_is_response_filter($result)) {
    return $self->_run_with_self(
      $result,
      $self->_run_dispatch_for($new_env, \@disp)
    );
  }
----
and the result?
----
goto &demo;
----
questions?
----
thank you
 
 
  



