Web::S...tedPerl(3pm)
π NAME π
Web::Simple::AntiquatedPerl β the slides from the talk. That's the whole name, bestie. π
β¨ WHAT? β¨
Okay so Web::Simple was originally introduced in a talk at the Italian Perl Workshop, and the talk was called Antiquated Perl. The video is on the Shadowcat site: <http://www.shadowcat.co.uk/archive/conference-video/ipw-2009/antiquated>. If you don't want to watch me confusing a bunch of Italian perl mongers, the slides are reproduced below. You're welcome. π«Ά
π SLIDES π
Here's the whole deck, slide by slide. No skips, no cuts, periodt. β¨
- 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
*$&^*(^andFormMail.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 qrandt 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;
$^Hand%^H
$^H |= 0x20000;
$^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
π AUTHOR π
Matt S. Trout <mst@shadowcat.co.uk> β the icon himself. π
π COPYRIGHT π
Copyright (c) 2011 Matt S. Trout <mst@shadowcat.co.uk>
π LICENSE π
This text is free documentation under the same license as perl itself.
And that's a wrap, bestie! This was perl v5.34.0, dated 2022-06-28, from Web::S...tedPerl(3pm). Stay iconic. π
β¨
π¦ where this page comes from
- debian bookworm: libweb-simple-perl 0.033-2 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- debian trixie: libweb-simple-perl 0.033-2 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu noble: libweb-simple-perl 0.033-2 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu resolute: libweb-simple-perl 0.033-2 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu stonking: libweb-simple-perl 0.033-2 Β· Artistic-1.0-Perl OR GPL-1.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms