=head1 NAME Web::Simple::AntiquatedPerl - the slides from the talk =head1 WHAT? Web::Simple was originally introduced in a talk at the Italian Perl Workshop, entitled Antiquated Perl. The video is available on the Shadowcat site: If you don't particularly want to watch me confusing a bunch of Italian perl mongers, the slides are reproduced below. =head1 SLIDES 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 { } ---- /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 ----
, $text,
; ----
---- <$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; } ----
---- glob('/div'); ---- *CORE::GLOBAL::glob = sub { ... }; ---- delete ${CORE::GLOBAL::}{glob}; ---- sub foo { use XML::Tags qw(div);
, "foo!",
; } ---- what about interpolation ---- my $stuff = 'foo"bar'; ---- 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 =head1 AUTHOR Matt S. Trout =head1 COPYRIGHT Copyright (c) 2010 Matt S. Trout =head1 LICENSE This text may be distributed under the GPL (v2 or later), the Artistic License (v1 or later), the Creative Commons Attribution (CC BY v3 or later), the Mozilla Public License (v1 or later, in honour of the license of the takahashi.xul system I used to write these slides originally), or the WTFPL (see ). If you'd like me to add another license, please ask. =cut