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
Perl 5.16 for the Working Programmer
Search
Ricardo Signes
June 13, 2012
Programming
0
79
Perl 5.16 for the Working Programmer
This presentation covers the useful-everyday stuff from Perl 5.16, as well as Perl 5.10 - 5.14.
Ricardo Signes
June 13, 2012
Tweet
Share
More Decks by Ricardo Signes
See All by Ricardo Signes
Perl 5.22 and You
rjbs
0
59
Perl 5 at 20: Perl v5.20.0
rjbs
1
80
1.21 Gigawatts
rjbs
3
510
Perl 5: Postcards from the Edge
rjbs
1
970
Perl: Today, Tomorrow, and Christmas
rjbs
0
110
Perl 5.14 for Pragmatists
rjbs
0
69
Perl 5.12 for Everyday Use
rjbs
0
190
Dist::Zilla — raaaaaaaaar!
rjbs
1
490
Validating Data Everywhere with Rx
rjbs
0
130
Other Decks in Programming
See All in Programming
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
440
受け取る人から提供する人になるということ
little_rubyist
0
210
C++でシェーダを書く
fadis
6
4k
RubyLSPのマルチバイト文字対応
notfounds
0
100
Better Code Design in PHP
afilina
PRO
0
120
CPython 인터프리터 구조 파헤치기 - PyCon Korea 24
kennethanceyer
0
250
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
640
CSC509 Lecture 11
javiergs
PRO
0
180
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
280
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.2k
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
810
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
210
Featured
See All Featured
Unsuck your backbone
ammeep
668
57k
4 Signs Your Business is Dying
shpigford
180
21k
Being A Developer After 40
akosma
86
590k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
A designer walks into a library…
pauljervisheath
202
24k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
The Invisible Side of Design
smashingmag
297
50k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Ruby is Unlike a Banana
tanoku
96
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
700
Transcript
Perl 5.16 for the working programmer
Perl 5 what's new?
Perl 5.10 for people who are not totally insane
Perl 5.12 for everyday use
Perl 5.14 for pragmatists
Perl 5.16 for the working programmer
Lexical Semantics!
use feature ‘say’; say “This is a test!”; { no
feature ‘say’; say “This is fatal!”; }
use 5.16.0; say “This is a test!”; { no feature
‘say’; say “This is fatal!”; }
#!/usr/bin/perl use strict; use warnings; use 5.16.0; # use feature
‘:5.16’; my $x = Reticulator->new; $x->reticulate(@splines);
#!/usr/bin/perl use strict; use warnings; # no feature; my $x
= Reticulator->new; $x->reticulate(@splines);
#!/usr/bin/perl use strict; use warnings; # use feature ‘:default’ my
$x = Reticulator->new; $x->reticulate(@splines);
array_base: $[
Cool New Features!
perldiag $str = “Greetings, $name. Your last login was $last.
It is now $time.”; Better Error Message(s)
perldiag $str = “Greetings, $name. Your last login was $last.
It is now $time.”; Better Error Message(s) Use of uninitialized value in concatenation (.) or string at hello.plx line 9.
perldiag Better Error Message(s) Use of uninitialized value $time in
concatenation (.) or string at hello.plx line 9. $str = “Greetings, $name. Your last login was $last. It is now $time.”;
perlsub my $LINES_READ = 0; sub read_line { $LINES_READ++; ...
} State Variables
perlsub { my $LINES_READ = 0; sub read_line { $LINES_READ++;
... } } State Variables
perlsub sub read_line { state $LINES_READ = 0; $LINES_READ++; ...
} State Variables
perlop truth and definedness
perlop truth and definedness sub record_sale {
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_;
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount || $product->price;
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount || $product->price; ...
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount || $product->price; ... }
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; $price = defined $amount ? $amount : $product->price; ... }
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount || $product->price; ... }
perlop truth and definedness sub record_sale { my ($product, $amount)
= @_; my $price = $amount // $product->price; ... }
perlop the new OR operator sub record_sale { my ($product,
$amount) = @_; $amount //= $product->cost; ... }
perlfunc - new built-in, say - it’s like print -
but it adds a newline for you say $what
perlfunc say $what
perlfunc say $what print “Hello, world!\n”;
perlfunc say $what print “Hello, world!\n”; print “$message\n”;
perlfunc say $what print “Hello, world!\n”; print “$message\n”; print “$_\n”
for @lines;
perlfunc say $what print “Hello, world!\n”; print “$message\n”; print “$_\n”
for @lines; say “Hello, world!”;
perlfunc say $what print “Hello, world!\n”; print “$message\n”; print “$_\n”
for @lines; say “Hello, world!”; say $message;
perlfunc say $what print “Hello, world!\n”; print “$message\n”; print “$_\n”
for @lines; say “Hello, world!”; say $message; say for @lines;
None
$ perl -e ‘print “Foo\n”’
$ perl -e ‘print “Foo\n”’ $ perl -E ‘say “Foo”’
sub fact { my ($x) = @_; # must be
+int return $x if $x == 1; return $x * fact($x - 1); } Recursion!
sub fact { my ($x) = @_; # must be
+int return $x if $x == 1; return $x * fact($x - 1); } Recursion!
my $fact = sub { my ($x) = @_; #
must be +int return $x if $x == 1; return $x * $fact->($x - 1); }; Recursion!
my $fact = sub { my ($x) = @_; #
must be +int return $x if $x == 1; return $x * $fact->($x - 1); }; Recursion!
my $fact; $fact = sub { my ($x) = @_;
# must be +int return $x if $x == 1; return $x * $fact->($x - 1); }; Recursion!
my $fact; $fact = sub { my ($x) = @_;
# must be +int return $x if $x == 1; return $x * $fact->($x - 1); }; Recursion!
use Scalar::Util qw(weaken); my $fact = do { my $f1;
my $f2 = $f1 = sub { my ($x) = @_; return $x if $x == 1; return $x * $f1->($x - 1); }; weaken($f1); $f1; }; Recursion!
use 5.16.0; # current_sub my $fact = sub { my
($x) = @_; # must be +int return $x if $x == 1; return $x * __SUB__->($x - 1); }; Recursion!
Filehandles!
autodie autodie open my $fh, ‘<‘, $filename; while (<$fh>) {
... } close $fh;
autodie autodie open my $fh, ‘<‘, $filename or die “couldn’t
open $filename: $!”; while (<$fh>) { ... } close $fh or die “couldn’t close $filename: $!”;
autodie autodie use autodie; open my $fh, ‘<‘, $filename; while
(<$fh>) { ... } close $fh;
autodie autodie use autodie; open my $fh, ‘<‘, $filename; while
(<$fh>) { no autodie; rmdir or warn “couldn’t remove $_: $!”; } close $fh;
autodie autodie use autodie; sub foo { my $filename =
shift; open my $fh, ‘<‘, $filename; while (<$fh>) { ... } } # this implicit close DID NOT AUTODIE
perlopentut IO::File sub stream_to_fh { my ($self, $fh) = @_;
fileno $fh or die “can’t stream to closed fh”; while (my $hunk = $self->next_hunk) { print {$fh} $hunk; } close $fh or die “error closing: $!”; }
perlopentut IO::File sub stream_to_fh { my ($self, $fh) = @_;
$fh->fileno or die “can’t stream to closed fh”; while (my $hunk = $self->next_hunk) { $fh->print($hunk); } $fh->close or die “error closing: $!”; }
perlopentut IO::File sub stream_to_fh { ... $fh->print($hunk); ... $fh->close or
die “error closing: $!”; } open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket: $!”; stream_to_fh($target);
perlopentut IO::File use IO::File; sub stream_to_fh { ... $fh->print($hunk); ...
$fh->close or die “error closing: $!”; } open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket: $!”; stream_to_fh($target);
perlopentut IO::File use 5.14.0; sub stream_to_fh { ... $fh->print($hunk); ...
$fh->close or die “error closing: $!”; } open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket: $!”; stream_to_fh($target);
perlopentut IO::File use 5.14.0; use autodie; sub stream_to_fh { ...
$fh->print($hunk); ... $fh->close or die “error closing: $!”; } open my $target, ‘>’, ‘/dev/null’ or die “can’t open bit bucket: $!”; stream_to_fh($target);
perlfunc Package Blocks package Library::Awesome; our $VERSION = 1.234; sub
foo { ... } 1;
perlfunc Package Blocks use 5.12.0; package Library::Awesome 1.234; sub foo
{ ... } 1;
perlfunc Package Blocks use 5.12.0; package Library::Awesome 1.234-alpha; sub foo
{ ... } 1;
perlfunc Package Blocks package Library::Awesome 1.234 { sub foo {
... } } 1;
perldoc overloading - the -x overload - the qr overload
- "no overloading" - unknown overload warns
Other New Features!
smrt match
if ($x ~~ $y) { ... } smrt match
perldoc smrt match
perldoc smrt match - if $x and $y are unknown,
there are 23 possible dispatch paths
perldoc smrt match - if $x and $y are unknown,
there are 23 possible dispatch paths - and some of them redispatch recursively
perldoc smrt match - if $x and $y are unknown,
there are 23 possible dispatch paths - and some of them redispatch recursively - no, you won't remember them all
perldoc smrt match - if $x and $y are unknown,
there are 23 possible dispatch paths - and some of them redispatch recursively - no, you won't remember them all - ...and they can't be intuited
Matching
if ($x ~~ $y) {...} Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
if ($str ~~ @arr) {...} Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
if ($str ~~ @arr) {...} if ($str ~~ [ \%h, ...]) {...} Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
if ($str ~~ @arr) {...} if ($str ~~ [ \%h, ...]) {...} if (%hash ~~ %h) {...} Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
if ($str ~~ @arr) {...} if ($str ~~ [ \%h, ...]) {...} if (%hash ~~ %h) {...} if (%hash ~~ @arr) {...} Matching
if ($x ~~ $y) {...} if ($str ~~ %hash) {...}
if ($str ~~ @arr) {...} if ($str ~~ [ \%h, ...]) {...} if (%hash ~~ %h) {...} if (%hash ~~ @arr) {...} if (%hash ~~ [ \%h,...]) {...} Matching
given ($x) { when ($y) { ... } when ($z)
{ ... } }
given ($x) { when ($y) { try { ... }
catch { warn “error: $_”; return undef; } } }
each @array
while (my ($i, $v) = each @array) { say “$i:
$v”; } each @array
push $aref, @etc;
Now With Fewer Bugs!
y2038
None
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038 ~$ perl5.10.0 -E ‘say scalar localtime 2**31’
~$ perl5.10.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038 ~$ perl5.10.0 -E ‘say scalar localtime 2**31’ Fri Dec 13 15:45:52 1901
None
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038 ~$ perl5.12.0 -E ‘say scalar localtime 2**31’
~$ perl5.12.0 -E ‘say scalar localtime 2**31-1’ Mon Jan 18
22:14:07 2038 ~$ perl5.12.0 -E ‘say scalar localtime 2**31’ Mon Jan 18 22:14:08 2038
perlvar $@
Try::Tiny $@
Try::Tiny $@ - Well, actually, you use Try::Tiny, right?
Try::Tiny $@ - Well, actually, you use Try::Tiny, right? -
But this makes Try::Tiny more reliable, too!
Try::Tiny $@ - Well, actually, you use Try::Tiny, right? -
But this makes Try::Tiny more reliable, too! - You see, eval and $@ are totally awful
perlfunc use 5.12.0; { package X; sub DESTROY { eval
{ } } } eval { my $x = bless {} => ‘X’; die “DEATH!!”; }; warn “ERROR: $@”;
perlfunc use 5.12.0; { package X; sub DESTROY { eval
{ } } } eval { my $x = bless {} => ‘X’; die “DEATH!!”; }; warn “ERROR: $@”; $ perl5.12.4 test.pl ERROR:
perlfunc use 5.14.0; { package X; sub DESTROY { eval
{ } } } eval { my $x = bless {} => ‘X’; die “DEATH!!”; }; warn “ERROR: $@”;
perlfunc use 5.14.0; { package X; sub DESTROY { eval
{ } } } eval { my $x = bless {} => ‘X’; die “DEATH!!”; }; warn “ERROR: $@”; $ perl5.14.1 test.pl ERROR: DEATH!!
None
perl -le ‘print $^X’
perl -le ‘print $^X’ 10.0: perl
perl -le ‘print $^X’ 10.0: perl 10.1: perl
perl -le ‘print $^X’ 10.0: perl 10.1: perl 12.0: perl
perl -le ‘print $^X’ 10.0: perl 10.1: perl 12.0: perl
14.0: perl
perl -le ‘print $^X’ 10.0: perl 10.1: perl 12.0: perl
14.0: perl 16.0: /Users/rjbs/perl5/perlbrew/perls/16.0/bin/perl
Simpler Strings
perlunicode Perl is Good at Unicode
perlunicode Perl 5.16 is Better
perlunicode Perl 5.16 is Better - Unicode 6.1
perlunicode Perl 5.16 is Better - Unicode 6.1 - every
character property is available
perlunicode Perl 5.16 is Better - Unicode 6.1 - every
character property is available - \X in regex is more sensible
perlunicode “The Unicode Bug”
perlunicode “The Unicode Bug” - strings aren’t always treated as
Unicode
perlunicode “The Unicode Bug” - strings aren’t always treated as
Unicode - this causes weird bugs that take ages to find
perlunicode “The Unicode Bug” - strings aren’t always treated as
Unicode - this causes weird bugs that take ages to find - use feature ‘unicode_strings’;
perlunicode “The Unicode Bug” - strings aren’t always treated as
Unicode - this causes weird bugs that take ages to find - use feature ‘unicode_strings’; - or use 5.12.0
perldoc Unicode eval - eval $str - is that octets
or chars? - what if it includes "use utf8" - or you're under "use utf8"?
perldoc Unicode eval - evalbytes $str - unicode_eval
perldiag My Favorite 5.12-ism? if (length $input->{new_email}) { $user->update_email(...); }
perldiag My Favorite 5.12-ism? Use of uninitialized value in length
at - line 3120. if (length $input->{new_email}) { $user->update_email(...); }
perldiag My Favorite 5.12-ism? if (length $input->{new_email}) { $user->update_email(...); }
perlsyn say “I \o{23145} Perl 5.14!”;
perlsyn say “I \o{23145} Perl 5.14!”; I — Perl 5.14!
perlsyn say “I \23145 Perl 5.14!”; I ?45 Perl 5.14!
perlsyn say “I \023145 Perl 5.14!”; I 145 Perl 5.14!
perlre qr{ (1) (2) (3) (4) \7 \10 (5) (6)
(7) (8) (9) \7 \10 (10) \7 \10 }x;
perlre qr{ (1) (2) (3) (4) \o{7} \o{10} (5) (6)
(7) (8) (9) \o{7} \o{10} (10) \g{7} \g{10} }x;
charnames Unicode 6.1
charnames Unicode 6.1
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
charnames Unicode 6
use 5.16.0; say “I \N{HEAVY BLACK HEART} Queensr” . “\N{LATIN
SMALL LETTER Y WITH DIAERESIS}” . “che!”; \N{...}
case folding
if (lc $foo eq lc $bar) { ... } Case
Folding
if (fc $foo eq fc $bar) { ... } Case
Folding
Case Folding
lc ‘ς‘ ➔ ‘ς‘ Case Folding
lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ Case Folding
lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘
➔ ‘σ‘ Case Folding
lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘
➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ Case Folding
lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘
➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ Case Folding
lc ‘ς‘ ➔ ‘ς‘ uc ‘ς‘ ➔ ‘Σ‘ fc ‘ς‘
➔ ‘σ‘ lc ‘ß’ ➔ ‘ß’ uc ‘ß’ ➔ ‘SS’ fc ‘ß’ ➔ ‘ss’ Case Folding
Case Folding
“file under: \L$name” Case Folding
“file under: \L$name” “file under: \F$name” Case Folding
Better Regex
named captures
perlre Regex: Named Captures
perlre Regex: Named Captures - find matches by name, not
position
perlre Regex: Named Captures - find matches by name, not
position - avoid the dreaded $1
perlre Regex: Named Captures - find matches by name, not
position - avoid the dreaded $1 - no longer second to Python or .Net!
perlre # our hypothetical format section:property = value Regex: Named
Captures
perlre $line =~ /(\w+):(\w+) = (\w+)/; $section = $1 $name
= $2; $value = $3; Regex: Named Captures
perlre Regex: Named Captures $line =~ / (?<section> \w+): (?<name>
\w+) \s* = \s* (?<value> \w+) /x; $section = $+{section}; $name = $+{name}; $value = $+{value};
perlre New Regex Modifiers my $hostname = get_hostname; $hostname =~
s/\..*//s;
perlre New Regex Modifiers my $hostname = get_hostname =~ s/\..*//s;
perlre New Regex Modifiers (my $hostname = get_hostname) =~ s/\..*//s;
perlre New Regex Modifiers my $hostname = get_hostname =~ s/\..*//sr;
perlre New Regex Modifiers my @short_names = map { s/\..*//s;
} @long_names;
perlre New Regex Modifiers my @short_names = map { s/\..*//s;
$_ } @long_names;
perlre New Regex Modifiers my @short_names = map { my
$x = $_; $x =~ s/\..*//s; $x } @long_names;
perlre New Regex Modifiers my @short_names = map { s/\..*//sr
} @long_names;
perlre New Regex Modifiers my @short_names = map s/\..*//sr, @long_names;
perldoc New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perldoc /u /a /aa /d /l "൮" =~ /\d/ ✓
❌ ❌ ¿? ¿? "ð" =~ /\w/ ✓ ❌ ❌ ¿? ¿? "ff" =~ /ff/i ✓ ✓ ❌ ¿? ¿? "ff" =~ /pL/i ✓ ✓ ✓ ¿? ¿? New Regex Modifiers
perlre New Regex Modifiers # To be really ASCII-only: die
“funny un-American characters” if $str =~ /\P{ASCII}/; $str =~ /...actual pattern.../;
study
my $re = qr{...complex...}; study
my $re = qr{...complex...}; my $str = q{...long complex...}; study
my $re = qr{...complex...}; my $str = q{...long complex...}; $str
=~ $re; # slow!! study
my $re = qr{...complex...}; my $str = q{...long complex...}; $str
=~ $re; # slow!! study $str; # does stuff study
my $re = qr{...complex...}; my $str = q{...long complex...}; $str
=~ $re; # slow!! study $str; # does stuff $str =~ $re; # fast!! study
my $re = qr{...complex...}; my $str = q{...long complex...}; $str
=~ $re; # slow but right!! study $str; # does stuff $str =~ $re; # who knows!! study
my $re = qr{...complex...}; my $str = q{...long complex...}; $str
=~ $re; # slow but right!! study $str; # does nothing $str =~ $re; # slow but right!! study
Modder Modlib
perlmodlib Newly Cored Librarys - JSON - HTTP::Tiny - Module::Metadata
- CPAN::Meta
perlmodlib Newly Ejected Librarys - Devel::DProf - Switch - the
perl4 core - ...and more
Old Stuff Removed
perlop qw() for my $show qw(Smallville Lost V) { $tivo->cancel_pass(
$show ); }
perlop qw() for my $show (qw(Smallville Lost V)) { $tivo->cancel_pass(
$show ); }
$[
perlvar $[ - first index of array
perlvar $[ - first index of array - so you
can make $array[1] mean first
perlvar $[ - first index of array - so you
can make $array[1] mean first - isn’t that awesome???
perlvar $[ - first index of array - so you
can make $array[1] mean first - isn’t that awesome??? - yeah, about as awesome as Comic Sans
perlvar $[ $[ = 1; for (1 .. $#array) {
... }
perlvar $[ for ($[ .. $#array) { ... }
perlvar $[ Assigned to $[. Are you some kind of
idiot or something? at -e line 123.
perlvar $[ Use of assignment to $[ is deprecated at
-e line 123.
defined @arr
Any questions?
Thank you!