SlideShare une entreprise Scribd logo
1  sur  135
Salt Lake Perl Mongers
http://saltlake.pm.org
David Oswald
daoswald@gmail.com
Add Perl To Your Toolbelt
Salt Lake Perl Mongers
http://saltlake.pm.org
David Oswald
daoswald@gmail.com
Add Perl To Your Toolbelt
Salt Lake Perl Mongers
http://saltlake.pm.org
David Oswald
daoswald@gmail.com
Add Perl To Your Toolbelt
Salt Lake Perl Mongers
● The local “Perl Community”
– Monthly meetings.
– Partnership discounts.
– Job announcements.
– Everyone learns and grows.
– For the love of Perl!
● http://saltlake.pm.org
Who am I?
●
Dave Oswald.
● Studied Economics and Computer Science at U of U.
– Also CS in High School, SLCC, LAVC, and self-guided.
● Endurance International Group / Bluehost.
– Focus on back-end development with Perl.
●
Solving problems programatically is my hobby. Gratifyingly, it's also my job.
● daoswald@gmail.com - david.oswald@endurance.com
● Salt Lake Perl Mongers
– http://saltlake.pm.org
Our Goal
● Learn how (and why) to get started with Perl...
...in about two days.
But...But...
“It's an old language.”
First Appeared Most Recent Standard / Version
C 1972 2011 C11
Java 1995 2016 (est) JSE9
Objective-C 1983 2014? 2.0
C++ 1983 2014 C++14
Visual Basic 1991 2015 14.0 (.net)
C# 2000 2015 6.0
PHP 1995 2016 7.0.4
Python 1991
Python 2 2015 2.7.11
Python 3 2015 3.5.1
JavaScript 1995 2011 1.8.5
ECMAScript 1997 2015 6
Perl 1987
Perl 5 1994 2015 5.22.1 (5.24 due in June 2016)
Conclusion
We can't draw useful conclusions based on a
programming language's age.
Should I just wait for Perl 6?
Should I just wait for Perl 6?
(No, they're different languages.)
● Perl5
– In use in production.
– Ships with Linux.
– Performant.
– Stable.
– Ongoing maintenance.
– Ongoing new features.
– CPAN.
– Often steals features from
Perl 6.
● Perl 6
– Still lives in its lab cage.
– Can be compiled / installed.
– Still not well optimized.
– Still in flux.
– Not yet feature complete.
– Many.
– Some key libraries.
– Invents revolutionary
concepts.
“The syntax is ugly.”
Quotes:
● “I'm supposed to learn___________for work ... it's really
bugging me. I don't think I've ever seen such an ugly
programming language.
Quotes:
● “I'm supposed to learn Objective-C for work ... it's really
bugging me. I don't think I've ever seen such an ugly
programming language.
Quotes:
● The Homoiconic nature of ____
means that one cannot tell by
looking at the code alone whether
something is a data structure or a
function. You have to read and
understand the context. Other
languages make it pretty clear
because they use different
symbols and syntax for each.
Quotes:
● The Homoiconic nature of Lisp
means that one cannot tell by
looking at the code alone whether
something is a data structure or a
function. You have to read and
understand the context. Other
languages make it pretty clear
because they use different
symbols and syntax for each.
Do we need to talk about C++ and C syntax?
We can't draw conclusions based on
perceived syntactic beauty.
“Perl lacks subroutine signatures, or named
parameters.”
my( $who, $cares ) = @_;
my( $who, $cares ) = @_;
(This is real Perl 
5.20 syntax)
...see?
use v5.20;
use feature 'signatures';
sub foo ($left, $right) {
    return $left + $right;
}
So, why Perl?
The Three Virtues
The Three Virtues...
● “The Triumph of the Virtues”
– Andrea Mantegna, 1497
● Justice!
● Temperance!
● Fortitude!
The Three Virtues...
● “The Triumph of the Virtues”
– Andrea Mantegna, 1497
● Justice!
● Temperance!
● Fortitude!
The Three Virtues...of Programmers
The Three Virtues...of Programmers
● Laziness
The Three Virtues...of Programmers
● Laziness
– The quality that
makes you go to
great effort to
reduce overall
energy expenditure.
Impatience!
The Three Virtues...of Programmers
● Laziness
● Impatience
The Three Virtues...of Programmers
● Laziness
● Impatience
– The anger you feel when
the computer is being
lazy, which happens
when another
programmer is not lazy.
The Three Virtues...of Programmers
● Laziness
● Impatience
● Hubris
The Three Virtues...of Programmers
● Laziness
● Impatience
● Hubris
– The pride that makes
you write and maintain
programs that you can
be proud of, and that
your peers will admire.
The Three Virtues...of Programmers
● Laziness
– ...makes you go to great effort to reduce
your overall energy expenditure.
– …makes you write robust, modular, well-
documented programs so you can reuse
[the effort].
● Impatience
– ...anger you feel when the computer is being lazy, which
happens when another programmer is not lazy.
– ...makes you write programs that use minimal code so they’re
fast, efficient, and anticipate what needs to be done.
● Hubris
– ...pride that makes you write and maintain
programs that you and your peers will
admire.
– ...uncontrolled or undeserved, it can also
get you in trouble.
So... Who am I?
●
Dave Oswald.
● Studied Economics and Computer Science at U of U.
– Also CS in High School, SLCC, LAVC, Independent.
● Endurance International Group / Bluehost.
– Focus on back-end development with Perl.
●
Solving problems programatically is my hobby. Gratifyingly, it's also my job.
● daoswald@gmail.com – david.oswald@endurance.com
● Salt Lake Perl Mongers
– http://saltlake.pm.org
I am...
● Dave Oswald.
● Studied Economics and Computer Science at U of U.
– Also CS in High School, SLCC, LAVC, Independent.
● Endurance International Group / Bluehost.
– Focus on Back-end development with Perl.
● Solving problems programatically is my hobby. Gratifyingly, it's also my job.
● daoswald@gmail.com
● Salt Lake Perl Mongers
– http://saltlake.pm.org
● Aspiring to be:
– Lazy
– Impatient
– Hubristic
So, why Perl?
Because...
Like vi(m), you probably already have it.
With Perl you can...With Perl you can...
...get the job done quickly....get the job done quickly.
With Perl you can...With Perl you can...
●
Be Expressive.Be Expressive.
Perl is...Perl is...
●
Powerful, with finesse.Powerful, with finesse.
Perl isPerl is
FUN!FUN!
Why Perl?
● It will get the job done quickly.
● It's expressive.
● It's powerful.
● It's fun.
● CPAN.
“...easy things should be easy, and hard things
should be possible.”
– Programming Perl, 4th
ed.
Obtaining Perl
Obtaining Perl
● Often it's already installed
– Your “System Perl”
Obtaining Perl
● Often it's already installed
– Your “System Perl”
● Package managers
– .rpm's, .deb's
Obtaining Perl
● Often it's already installed
– Your “System Perl”
● Package managers
– .rpm's, .deb's
● Perlbrew
– http://perlbrew.pl
Obtaining Perl
● Often it's already installed
– Your “System Perl”
● Package managers
– .rpm's, .deb's
● Perlbrew
– http://perlbrew.pl
● Strawberry Perl
– MS Windows
– http://strawberryperl.com
Obtaining Perl
● Often it's already installed
– Your “System Perl”
● Package managers
– .rpm's, .deb's
● Perlbrew
– http://perlbrew.pl
● Strawberry Perl
– MS Windows
– http://strawberryperl.com
● Active State
– Windows
– Support
Becoming ProductiveBecoming Productive
with Perlwith Perl
“What you must do - in any language - is to pick a
subset, get working writing code, and gradually
learn more of the language, its libraries, and its
tools.”
– Bjarne Stroustrup
http://www.stroustrup.com/bs_faq.html#big
Our Subset
● Structure
●
Data types
●
Operators
●
Lexical variables
●
Loops
● Conditionals
●
Subroutines
●
Files and Basic IO
●
Using objects
●
Using CPAN
But first, perlintro
The Format
● A simple text file
– Whitespace is mostly insignificant, but encouraged.
#!/usr/bin/env perl
# comments
use Quantum::Superpositions 'eigenstates';
use constant PI => 3.141592654;
# Your app for world domination goes here.
The obligatory Hello World!
#!/usr/bin/perl
print “Hello world!n”;
– Save as 'hello', set executable, and invoke as: ./hello
● or...
perl ­e 'print “Hello world!n”'
perl ­E 'say “Hello world!”'
perl ­e 'printf “%sn”, “Hello world!”'
Be Strict!
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use diagnostics;
Be Modern!
#!/usr/bin/env perl
use strict;
use warnings;
use diagnostics;
use autodie;
use feature ':5.22';     # or use 5.022;
Containers
● Scalar containers start with $, and hold one thing.
my $num = 1;
my $string = “Hello”
my $ref = $num;
Containers
● Scalars
● Array containers start with @, and hold zero or more scalars,
indexed by integers.
my @things = qw( this that and the other );
my @refs = ( $x, $y, [@z] );
print “$things[0]n”; # this
print “$things[-1]n; # other
Containers
● Scalars
● Arrays
● Hashes start with %, and hold zero or more values, indexed by keys.
my %set = ( seat => 5, hp => 250, fuel => 'reg' );
print “The car has $set{hp} horsepower.n”;
print “There are “, scalar keys %set, “ elements.n”;
my @keynames = keys %set;
my @vals = values %set;
if( exists $set{fuel} ) { ... }
Containers
● Scalars
– Single items.
● Arrays
– Lists of items.
● Hashes
– Collections of values indexed by keys.
Aggregate vs Scalar
● Aggregate types: @, %
● Scalar types: $
The Sigil expresses the container type
● $scalar # Scalar containers start with $
● @array # Array containers start with @
● $array[5] # Array elements are scalar containers: $
● %hash # Hashes start with %
● $hash{key} # Hash elements are scalar containers: $
Containers can hold references
@structure = (
[ 'a', 'b', 'c' ],
[ 'd', 'e', 'f' ],
{ 'g' => 42 },
);
print “$structure[2]{g}n”;
Containers can hold references
@structure = (
[ 'a', 'b', 'c' ],
[ 'd', 'e', 'f' ],
{ 'g' => 42 },
);
print “$structure[2]{g}n”; # 42
Hash of arrays
%hash = (
names => [ qw/ bob frank joe / ],
ages => [ 34, 26, 46 ],
);
print $hash{names}[0], “n”;
print $hash{ages}[0], “n”;
Hash of arrays
%hash = (
names => [ qw/ bob frank joe / ],
ages => [ 34, 26, 46 ],
);
print $hash{names}[0], “n”; # bob
print $hash{ages}[0], “n”; # 34
Array of hashes
@array = (
{ name => joe, age => 34 },
{ name => pete, age => 26 }
);
print $array[0]{name}, “n”;
Array of hashes
@array = (
{ name => joe, age => 34 },
{ name => pete, age => 26 }
);
print $array[0]{name}, “n”; # joe
Hash of hashes
%hash = (
bob => { age => 34, sex => 'm' },
joe => { age => 26, sex => 'm' },
jane => { age => 30, sex => 'f' },
);
print $hash{bob}{age}, “n”;
print $hash{joe}{sex}, “n”;
Hash of hashes
%hash = (
bob => { age => 34, sex => 'm' },
joe => { age => 26, sex => 'm' },
jane => { age => 30, sex => 'f' },
);
print $hash{bob}{age}, “n”; # 34
print $hash{joe}{sex}, “n”; # f
Scalar references to an arrays
my $aref =
[ qw/ a b c / ];
print “$aref->[1]n”;
$aref = @array;
Scalar references to an arrays
my $aref =
[ qw/ a b c / ];
print “$aref->[1]n”;
# b
$aref = @array;
Reference Constructors
● 
– Takes a reference to some
entity.
● [ … ]
– Constructs a reference to an
anonymous array.
● { … }
– Constructs a reference to an
anonymous hash.
Topic containers
● $_ : The “it” or “topic” variable.
for( 1 .. 100 ) { print “$_n”; }
● @_ : The “subroutine parameters” variable.
sub sum {
my $acc;
$acc += shift @_ while @_;
return $acc;
}
Many functions operate on $_ by default
● print $_ for 1 .. 10
● print for 1 .. 10
● while(<>) { chomp; print; }
● print if m/pattern/
Many functions operate on $_ by default
● print $_ for 1 .. 10 #12345678910
● print for 1 .. 10 # 12345678910
● while(<>) { chomp; print; }
● print if m/pattern/
Data Types
Perl Data Types
● Strings
– “Hello world!n”
– 'Good morning Starshine...'
– '42'
● Numbers
42
3.141592654
2.9979e+08
0xFF
0655
A few others
● References
– Created with , [...], or {...}
– Dereferenced with ${...}, @{...}, %{...}, or ->
● File handles
– Internally implemented as Typeglobs.
● Typeglobs
– Mostly for when we want to deal with the man behind the curtain.
Perl Data Types DWYM
● (Do What You Mean)
– Duck Typing
say '42' – 42;
0
say substr(42,0,1)
4
say 'oops' if '0';
– (String '0' is Boolean false)
Booleans: What is the truth?
● 0 : (Numeric 0) False
● “0” : (String 0) False
● “” : (Empty string) False
● undef : (Undefined values) False
● Everything that is not false is true.
– Including the string “0E0”
Structure
Subroutines
sub add {
my @param = @_;
return $param[0] + $param[1];
}
sub fact {
my $n = shift();
return 1 if $n <= 1;
return $n * fact ( $n-1 );
}
Namespaces
package Foo;
sub bar { return 1; }
our $baz = “Hello.”;
package main;
print $Foo::baz, “ “, Foo::bar();
Namespaces
package Foo;
sub bar { return 1; }
our $baz = “Hello.”;
package main;
print $Foo::baz, “ “, Foo::bar();
# Hello. 1
Package Globals
● Variables that aren't lexical (my) are package globals.
– Declare with 'our'.
our @family = qw( Dave Aileen Nathaniel Noelle );
– Available within the same package.
● print “@familyn”;
– Available globally via fully qualified name.
● print “@main::familyn”;
LoopingLooping
Loops (foreach and for)
foreach my $item (@list) {print “$itemn”;}
for (my $i=0; $i!=10; ++$i) {print “$in”;}
say for 1 .. 10;
Loops (foreach and for)
foreach my $item (@list) {print “$itemn”;}
for (my $i=0; $i!=10; ++$i) {print “$in”;}
say for 1 .. 10; # say what?
Loops (foreach and for)
foreach my $item (@list) {print “$itemn”;}
for (my $i=0; $i!=10; ++$i) {print “$in”;}
say for 1 .. 10; # Implicit $_
Loops (while and until)
while(rand(5) > 3) {print “Unlucky.n”;}
print while <>;
do {print “Greetings.n”} while (guests());
print “42n” until end_of_time();
Breakout!
for(1 .. 10) {
next if $_ == 5;
print $_, “n”;
last if $_ == 8;
}
Breakout!
for(1 .. 10) {
next if $_ == 5;
print $_, “n”;
last if $_ == 8;
}
● 1 2 3 4 6 7 8
Files
open my $in_fh, '<', 'myfile.txt' or die $!;
while( my $line = <in_fh> ) {
chomp $line;
print “$linen” if $line eq 'Hello!';
}
Conditionals (if)
if(alive()) {
live_life();
}
elsif (dead()) {
haunt();
}
else {
# Undead?
drink_blood();
}
Conditionals
unless (dead()) {stayin_alive()}
snore() if $sleeping;
sleep() unless $time > $wakeup_time;
$can_continue and live(); # Logical short circuit
live() or die “trying.”; # Logical Short circuit
String vs Numeric Relational Operators
● 3 < 5
● 6.7 == 42
● “abcd” lt “bcde”
● “abcd” eq “abcd”
● Numeric:
==, <, >, <=, >=, !=, <=>
● Stringwise:
eq, lt, gt, le, ge, ne, cmp
String vs Numeric Relational Operators
● 3 < 5 # true
● 6.7 == 42 # false
● “abcd” lt “bcde” #true
● “abcd” eq “abcd” # true
● Numeric:
==, <, >, <=, >=, !=, <=>
● Stringwise:
eq, lt, gt, le, ge, ne, cmp
Context: Scalar, or List
my $quantity = @camels;   # Scalar context.
my @elements = @array;    # List context.
my $item = qw/ a b c /; # c (Scalar context.)
my ($item) = qw/ a b c /; # a (List context.)
foreach(@array) {…
while($condition) { …
Context
● @array: List of elements, or element count.
● %hash: List of keys=>values, or Boolean “populated/empty”
● (1,2,3): List: (1,2,3), Scalar: 3
● foreach( list )...
● while( scalar )...
● Most operators impose scalar context on operands.
● Comma doesn't.
Scope
my $foo = 10;
{
my $foo = 100;
print $foo, “n”;
sub closure {return $foo}
print closure(), “n”;
}
print $foo, “n”;
print closure(), “n”;
Scope
my $foo = 10;
{
my $foo = 100;
print $foo, “n”;         # 100
sub closure {return $foo}
print closure(), “n”;    # 100
}
print $foo, “n”;        # 10
print closure(), “n”;   # 100
Functional loops
my @times_five = map {$_ * 5} @numbers;
my @filtered = grep {$_ =~ /^Y/i} @strings;
my @sorted = sort {$b <=> $a} @unsorted;
Is it Perl or Lisp?
my @sorted = 
map  { $_­>[0]             } 
sort { $a­>[1] cmp $b­>[1] } 
map  { [ $_ => lc $_ ]     } 
@unsorted;
Schwartzian Transform:
decorate/sort/undecorate idiom
my @sorted = 
map  { $_­>[0]             } 
sort { $a­>[1] cmp $b­>[1] } 
map  { [ $_ => lc $_ ]     } 
@unsorted;
Regular Expressions
Regular Expressions
$string =~ m/pattern/ #matching
$_      =~ m/pattern/
           m/pattern/
            /pattern/
$string =~ s/pattern/replacement/ #substitution
$_      =~ s/pattern/replacement/
           s/pattern/replacement/
It's the “It” variable again: $_
m/pattern/ matches against $_ by default.
s/pattern/replacement/ substitutes within $_ by default.
Binding other variables: =~
$string =~ m/pattern/
$string =~ /pattern/ # “m” is usually optional.
$string =~ s/pattern/replacement/
In scalar context: Boolean
if( $string =~ m/^Hello/ ) {
print “Hello to you to!n”;
}
In scalar context: Boolean
$string = 'You said “Hello.”';
if( $string =~ m/^Hello/ ) {
print “Hello to you to!n”;
}
Captures returned in list context
say for “abcde” =~ m/(.)(.)(.)/;
Captures returned in list context
say for “abcde” =~ m/(.)(.)(.)/;
a
b
c
Captures also populate $1, $2 ...
my $string = “abcde”;
if( $string =~ m/(.)(.)(.)/ ) {
print “$1$2$3n”;
}
Captures also populate $1, $2 ...
my $string = “abcde”;
if( $string =~ m/(.)(.)(.)/ ) {
print “$1$2$3n”;
}
abc
/g modifier
while( “abcde” =~ m/(.)/g ) {
print “$1n”;
}
/g modifier
while( “abcde” =~ m/(.)/g ) {
print “$1n”;
}
a
b
c
d
e
Using Core Modules
use strict;
use warnings;
use feature qw(say);
use List::Util 'reduce';
say reduce { $a + $b } ( 0,1, 2, 3, 4, 5 );
Using Core Modules
use strict;
use warnings;
use feature qw(say);
use List::Util 'reduce';
say reduce { $a + $b } ( 0,1, 2, 3, 4, 5 ); # 15
CPANCPAN
Search CPAN
Using CPAN
$ cpan install Mojolicious;
#!/usr/bin/env perl
use Mojolicous::Lite;
get '/' => { text => 'Hello world!' };
app->start;
Using CPAN
$ cpan install
Mojolicious;
#!/usr/bin/env perl
use Mojolicous::Lite;
get '/' => {
text => 'Hello world!'
};
app->start;
~/perlws/mymojoapp daemon
curl http://localhost:3000
Hello world!
“A concept is valid in Perl only if it can be shown to work in one line.”
perl ­Mojo ­E 'a("/" => {text => "Hello World!"})­>start' daemon
curl http://localhost:3000
Hello World!
Reading
● Learning Perl
● Intermediate Perl
● Programming Perl
● Modern Perl
● perldoc
“You can sometimes write faster code in C, but
you can always write code faster in Perl.”
– perldoc perlembed
Slides available on Slide Share: http://www.slideshare.net/daoswald/toolbelt
David Oswald: daoswald@gmail.com
Add Perl to Your Toolbelt
Add Perl to Your Toolbelt

Contenu connexe

Tendances

Tendances (20)

Let's Learn Ruby - Basic
Let's Learn Ruby - BasicLet's Learn Ruby - Basic
Let's Learn Ruby - Basic
 
Ruby For Java Programmers
Ruby For Java ProgrammersRuby For Java Programmers
Ruby For Java Programmers
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
Introduction to Ruby
Introduction to RubyIntroduction to Ruby
Introduction to Ruby
 
DSLs in JavaScript
DSLs in JavaScriptDSLs in JavaScript
DSLs in JavaScript
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Low-Maintenance Perl
Low-Maintenance PerlLow-Maintenance Perl
Low-Maintenance Perl
 
Java script
Java scriptJava script
Java script
 
Ruby Presentation
Ruby Presentation Ruby Presentation
Ruby Presentation
 
Smalltalk on rubinius
Smalltalk on rubiniusSmalltalk on rubinius
Smalltalk on rubinius
 
Drupal Front End PHP
Drupal Front End PHPDrupal Front End PHP
Drupal Front End PHP
 
Start dart
Start dartStart dart
Start dart
 
Php converted pdf
Php converted pdfPhp converted pdf
Php converted pdf
 
Ppt php
Ppt phpPpt php
Ppt php
 
Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)
 
SOLID Ruby, SOLID Rails
SOLID Ruby, SOLID RailsSOLID Ruby, SOLID Rails
SOLID Ruby, SOLID Rails
 
The Dark Art of Rails Plugins (2008)
The Dark Art of Rails Plugins (2008)The Dark Art of Rails Plugins (2008)
The Dark Art of Rails Plugins (2008)
 
Perl Basics for Pentesters Part 1
Perl Basics for Pentesters Part 1Perl Basics for Pentesters Part 1
Perl Basics for Pentesters Part 1
 
Agile DSL Development in Ruby
Agile DSL Development in RubyAgile DSL Development in Ruby
Agile DSL Development in Ruby
 
Your First Scala Web Application using Play 2.1
Your First Scala Web Application using Play 2.1Your First Scala Web Application using Play 2.1
Your First Scala Web Application using Play 2.1
 

Similaire à Add Perl to Your Toolbelt

I18nize Scala programs à la gettext
I18nize Scala programs à la gettextI18nize Scala programs à la gettext
I18nize Scala programs à la gettextNgoc Dao
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Codeeddiehaber
 
The Essential Perl Hacker's Toolkit
The Essential Perl Hacker's ToolkitThe Essential Perl Hacker's Toolkit
The Essential Perl Hacker's ToolkitStephen Scaffidi
 
Natural Language Processing Tools for the Digital Humanities
Natural Language Processing Tools for the Digital HumanitiesNatural Language Processing Tools for the Digital Humanities
Natural Language Processing Tools for the Digital HumanitiesXiang Li
 
Striving towards better PHP code
Striving towards better PHP codeStriving towards better PHP code
Striving towards better PHP codeSteve Maraspin
 
Introduction to rails
Introduction to railsIntroduction to rails
Introduction to railsGo Asgard
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocolsDonny Wals
 
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...RootedCON
 
Managing a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandManaging a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandEmma Jane Hogbin Westby
 
Effective entrepreneurship for developers
Effective entrepreneurship for developersEffective entrepreneurship for developers
Effective entrepreneurship for developersCarlos Ble
 
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi Krzysztof (Chris) Ozog
 

Similaire à Add Perl to Your Toolbelt (20)

I18nize Scala programs à la gettext
I18nize Scala programs à la gettextI18nize Scala programs à la gettext
I18nize Scala programs à la gettext
 
Mlw
MlwMlw
Mlw
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Code
 
rubyonrails
rubyonrailsrubyonrails
rubyonrails
 
rubyonrails
rubyonrailsrubyonrails
rubyonrails
 
Script presentation
Script presentationScript presentation
Script presentation
 
The Essential Perl Hacker's Toolkit
The Essential Perl Hacker's ToolkitThe Essential Perl Hacker's Toolkit
The Essential Perl Hacker's Toolkit
 
Natural Language Processing Tools for the Digital Humanities
Natural Language Processing Tools for the Digital HumanitiesNatural Language Processing Tools for the Digital Humanities
Natural Language Processing Tools for the Digital Humanities
 
Striving towards better PHP code
Striving towards better PHP codeStriving towards better PHP code
Striving towards better PHP code
 
Automate Yo' Self
Automate Yo' SelfAutomate Yo' Self
Automate Yo' Self
 
Scala.js
Scala.js Scala.js
Scala.js
 
Introduction to rails
Introduction to railsIntroduction to rails
Introduction to rails
 
Unix - Shell Scripts
Unix - Shell ScriptsUnix - Shell Scripts
Unix - Shell Scripts
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocols
 
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
Joxean Koret - Interactive Static Analysis Tools for Vulnerability Discovery ...
 
Managing a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days IrelandManaging a Project the Drupal Way - Drupal Open Days Ireland
Managing a Project the Drupal Way - Drupal Open Days Ireland
 
Effective entrepreneurship for developers
Effective entrepreneurship for developersEffective entrepreneurship for developers
Effective entrepreneurship for developers
 
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi
Code Camp NYC 2017 - How to deal with everything... | Chris Ozog - Codesushi
 
Writing engaging tutorials
Writing engaging tutorialsWriting engaging tutorials
Writing engaging tutorials
 

Plus de daoswald

Perl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal DarkpanPerl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal Darkpandaoswald
 
Speaking at Tech Events
Speaking at Tech EventsSpeaking at Tech Events
Speaking at Tech Eventsdaoswald
 
Perl one-liners
Perl one-linersPerl one-liners
Perl one-linersdaoswald
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perldaoswald
 
Perls Functional functions
Perls Functional functionsPerls Functional functions
Perls Functional functionsdaoswald
 
30 Minutes To CPAN
30 Minutes To CPAN30 Minutes To CPAN
30 Minutes To CPANdaoswald
 
Deploying Perl apps on dotCloud
Deploying Perl apps on dotCloudDeploying Perl apps on dotCloud
Deploying Perl apps on dotClouddaoswald
 

Plus de daoswald (7)

Perl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal DarkpanPerl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal Darkpan
 
Speaking at Tech Events
Speaking at Tech EventsSpeaking at Tech Events
Speaking at Tech Events
 
Perl one-liners
Perl one-linersPerl one-liners
Perl one-liners
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perl
 
Perls Functional functions
Perls Functional functionsPerls Functional functions
Perls Functional functions
 
30 Minutes To CPAN
30 Minutes To CPAN30 Minutes To CPAN
30 Minutes To CPAN
 
Deploying Perl apps on dotCloud
Deploying Perl apps on dotCloudDeploying Perl apps on dotCloud
Deploying Perl apps on dotCloud
 

Dernier

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 

Dernier (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 

Add Perl to Your Toolbelt

Notes de l'éditeur

  1. Let&amp;apos;s stop here and try.
  2. When should we use a hash? An array?
  3. Arrays are ordered. Hashes are not.