Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Charlotte Perl Mongers Kickoff
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Jason A. Crome
January 10, 2019
Programming
0
28
Charlotte Perl Mongers Kickoff
The restart of Charlotte Perl Mongers, with a graceful introduction to Modern Perl programming.
Jason A. Crome
January 10, 2019
Tweet
Share
More Decks by Jason A. Crome
See All by Jason A. Crome
Constructing Command Line Applications in Perl
cromedome
0
91
Accessibility in Web Sites
cromedome
0
23
Building a Honeypot
cromedome
0
54
Dependency Management with Carton
cromedome
0
39
Scraping Tumblr
cromedome
0
54
wEdge for Treasurers (and everyone else, too!)
cromedome
0
38
Integration Points for Property Tax, CAMA, & GIS
cromedome
0
270
Other Decks in Programming
See All in Programming
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
190
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
CSC307 Lecture 10
javiergs
PRO
1
660
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
620
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.4k
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
100
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
What does AI have to do with Human Rights?
axbom
PRO
0
2k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
66
37k
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
Git: the NoSQL Database
bkeepers
PRO
432
66k
sira's awesome portfolio website redesign presentation
elsirapls
0
150
A better future with KSS
kneath
240
18k
Optimizing for Happiness
mojombo
379
71k
RailsConf 2023
tenderlove
30
1.3k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Transcript
Welcome to Charlotte Perl Mongers! Jason A. Crome Senior Perl
Developer, Empowered January 10, 2019 Copyright (C) 2019, Jason A. Crome
Who are we?
What is Perl Mongers? • Grassroots organization for promoting Perl
• Run by volunteers (and zealots like me!) • Share and disseminate information about Perl and the community • Welcome to Charlotte.pm!
Engage with us! • Us = all of you! •
Use our Meetup • charlottedevs.slack.com#perl • irc.perl.org#charlotte.pm
What is Modern Perl?
What is Modern Perl? • First-class OO programming • Great
Testing Infrastructure • Deployment and Configuration Toolchain • Active user community • Modern language features • Modern frameworks
Who’s Using Modern Perl? • ZipRecruiter • Booking.com • Craigslist
• Ticketmaster • Amazon • BBC • NASA • Rent.com • DuckDuckGo • IMDB • Empowered • ShutterStock • ServerCentral • Pinboard
What is Modern Perl? • First-class OO programming • Great
Testing Infrastructure • Deployment and Configuration Toolchain • Active user community • Modern language features • Modern frameworks
Object Oriented • Moose • Moo • Mouse
package Point; sub new { my ($class, $x, $y) =
@_; my $self = { x => $x, y => $y, }; return bless $self, $class; } sub get_x { return $_[0]->{x}; } sub set_x { return $_[0]->{x} = $_[1]; } sub get_y { return $_[0]->{y}; } sub set_y { return $_[0]->{y} = $_[1]; } 1;
package Point; use Moose; has 'x' => (isa => 'Int',
is => 'rw', required => 1); has 'y' => (isa => 'Int', is => 'rw', required => 1); sub clear { my $self = shift; $self->x(0); $self->y(0); } package Point3D; use Moose; extends 'Point'; has 'z' => (isa => 'Int', is => 'rw', required => 1); after 'clear' => sub { my $self = shift; $self->z(0); };
# hash or hashrefs are ok for the constructor my
$point1 = Point->new(x => 5, y => 7); my $point2 = Point->new({x => 5, y => 7}); my $point3d = Point3D->new(x => 5, y => 42, z => -5); Using the Point Class
Roles with Moose package MyApp::CLI::SetPassword; use strictures 2; use MooseX::App::Command;
extends qw( MyApp::CLI ); with qw( MyApp::Role::CLI::WithPassword MyApp::Role::CLI::WithUsername MyApp::Role::CLI::WithUser ); use MyApp::Module; sub run ( $self ) { $self->_say( "Changing password for " . $self->username . '...' ); $self->user->password( $self->password ); $self->user->update; say "Done!"; } 1;
Testing Infrastructure • Test2 • Test::Class::Moose • prove • TAP
Deployment/Configuration • Plack/PSGI • cpanfile • Carton • Pinto •
perlbrew • plenv
Community • Perl’s greatest strength • Perl Mongers • YAPC
/ TPC • (Meta)CPAN
MetaCPAN
Modern Language Features/Tools • Named parameters/sub signatures • Meta-object protocol
• XS • Pod • Perlcritic • Perltidy
Named params/sub signatures sub clear( $self ) { $self->x(0); $self->y(0);
} after 'clear' => sub( $self ) { $self->z(0); }; sub set( $self, $x, $y, $z?) { $self->x( $x ); $self->y( $y ); $self->z( $z ) if $z; }
Modern Frameworks • Object Frameworks • ORMs • Templating Frameworks
• Web App Frameworks
ORMs • Class::DBI • DBIx::Class • Rose::DB
DBIx::Class $user = $schema->resultset('User')->find( { email => $self->email } );
$user = $schema->resultset('User')->create( { username => $self->username, password => $self->password, email => $self->email, } ); my $user_rs = $schema->resultset('User')->search({ email => { like => '%example.com' }, },{ order_by => { username => 'ASC' }, } );
Templating Frameworks • HTML::Template • Mason • Template Toolkit •
Mustache • XSlate • And many, many others…
Web App Frameworks
And now, live coding and swag!
Questions?
Thanks! https://empowered.net jcrome@empoweredbenefits.com Twitter: @cromedome