barely legal xxx perl presentation
TRANSCRIPT
![Page 1: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/1.jpg)
Barely Legal XXX PerlJos Boumans
![Page 2: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/2.jpg)
Code is Evil
• Especially perl code
• It's a 'dynamic' and 'loosely typed' language
• "We don't know what it is going on either"
![Page 3: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/3.jpg)
Parsing Perl Sucks
• Perl reads like english
• Time flies like an arrow
• Fruit flies like a banana
• "Only perl can parse Perl"
![Page 4: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/4.jpg)
Parsing Perl yourself sucks even more
• Parsing Perl with Perl is Hard (tm)
• But people try
• PPI
sin / 25 ; # / ; die;
time / 25 ; # / ; die;
Dies
Does not die
![Page 5: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/5.jpg)
Bad Example
• Acme::BadExample
• Correct Syntax
• Impossible to run
• Tries to do Very Nasty Things!
![Page 6: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/6.jpg)
Is that a challenge?
SUPPORT
You're kidding right? I tell you what. If you can find some way to make this module run, I shall happily stump up a $100 reward, payable in your choice of American dollars, Australian dollars, or as a vertical meter of beer (cartons). Beer must be picked up in person :)
From the POD text of Acme::BadExample:
![Page 7: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/7.jpg)
The Idea:
$ perl -MAnti::Code -e'use Acme::BadExample; warn "done"' [runs upto and including final statement] [print "done"] [exit code of '0']
$
![Page 8: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/8.jpg)
package Anti::Code;
BEGIN {
$INC{'strict.pm'} = 1;
$INC{'warnings.pm'} = 1;
}
1 package Acme::BadExample;
[...]
74 use strict;
75 use warnings;
![Page 9: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/9.jpg)
What Happens?
$ perl -le'BEGIN{ $INC{"x.pm"}=1 } use x;'
$
![Page 10: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/10.jpg)
require less;
unshift @INC, sub {
if( caller eq 'Acme::BadExample' ) {
open my $fh, $INC{'less.pm'} or return;
return $fh;
}
return;
}
76 use diagnostics;
77 use English;
78 use less 'memory';
79 use locale;
80 use POSIX;
81 use utf8;
82 require it;
![Page 11: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/11.jpg)
What Happens?
$ strippod `perldoc -l less`
package less;our $VERSION = '0.01';1;
$ corelist less
less was first released with perl 5.00307
![Page 12: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/12.jpg)
:)
83 do 'it.pm';
![Page 13: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/13.jpg)
What Happens?
$ perl -le'do "foo"; warn "Warn: $!"'Warn: No such file or directory at -e line 1.
$
![Page 14: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/14.jpg)
*CORE::GLOBAL::die =
sub { warn "You tried to die with '@_'" };
85 use vars qw{$VERSION};
86 BEGIN {
87 *die = *CORE::die;
88 $VERSION = '0.3';
89 die "Oh that just won't do!";
90 }
![Page 15: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/15.jpg)
85 use vars qw{$VERSION};
86 BEGIN {
87 *die = *CORE::die;
88 $VERSION = '0.3';
89 die "Oh that just won't do!";
90 }
:)
![Page 16: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/16.jpg)
What Happens?
$ perl -le'*x = *CORE::die; x($$)'Undefined subroutine &CORE::die called ! at -e line 1.
$
![Page 17: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/17.jpg)
package Acme::Code::Police;INIT{unless(exists$INC{'strict.pm'}){unlink((caller)[1])}1;
A Small digression:
package Acme::Code::FreedomFighter;BEGIN{ *CORE::GLOBAL::caller = sub{ my @c = CORE::caller(@_); if( $c[0] eq 'Acme::Code::Police' ){ ! $c[0] =~ s|::|/|g; return( ’’, $INC{ $c[0] . '.pm' } ); } else { return @c; } }} 1;
![Page 18: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/18.jpg)
# optional
UNIVERSAL::unimport = sub { }
105 # Actually, we don't want strict references.
106 # We have a new enough perl version for 'no' right?
107
108 no strict 'reefs'; # Oops, bad spelling
![Page 19: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/19.jpg)
What Happens?
$ perl -le'BEGIN{ $INC{"strict.pm"}=1 } sub UNIVERSAL::unimport { die "@_" } no strict "reefs"'strict reefs at -e line 1.
$ perl -le'no strict "refs"; print values %INC'/opt/lib/perl5/5.8.6/strict.pm
$
![Page 20: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/20.jpg)
110 # We are just one subclass of a general example class
111 use base 'Acme::SuperHappyFunGeneralExample';
require less;
unshift @INC, sub {
if( caller eq 'Acme::BadExample' ) {
open my $fh, $INC{'less.pm'} or return;
return $fh;
}
return;
}
![Page 21: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/21.jpg)
116 # Let everyone know we are starting up, and hope the
117 # script that's calling us defined the extra message.
118 print "Acme::BadExample is starting up... $extramsg\n";
:)
![Page 22: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/22.jpg)
137 # Premake a cache of 50000 objects
138 our @CACHE = ();
139 foreach ( 1 .. 50000 ) {
140 $CACHE{$_} = __PACKAGE__->new;
141 }
Need to inspect __PACKAGE__::new() first
![Page 23: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/23.jpg)
121 sub new {
122 my $class = shift;
123 my $self = SUPER::new( @_ );
124 $self->{id} = int(rand * 100000) + 1;
125 $self->{'foo'} = "La di freeking da!";
![Page 24: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/24.jpg)
What Happens?
$ perldoc perlobj the "SUPER" pseudo-class can only currently be used as a modifier to a method name, e.g; something->SUPER::method(...); # OK SUPER::method(...); # WRONG SUPER->method(...); # WRONG
$ perldoc SUPER No documentation found for "SUPER"
![Page 25: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/25.jpg)
*SUPER::new = sub { {} };
121 sub new {
122 my $class = shift;
123 my $self = SUPER::new( @_ );
124 $self->{id} = int(rand * 100000) + 1;
125 $self->{'foo'} = "La di freeking da!";
![Page 26: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/26.jpg)
What Happens?
$ perl -wle'print rand * 42'Argument "*main::42" isn't numeric in ! rand at -e line 1.
121 sub new {
122 my $class = shift;
123 my $self = SUPER::new( @_ );
124 $self->{id} = int(rand * 100000) + 1;
125 $self->{'foo'} = "La di freeking da!";
![Page 27: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/27.jpg)
What Happens?$ perl -MO=Deparse -e'print rand * 42'print rand *42;
$ perl -le'sub 42 { $$ }; print 42()'Illegal declaration of anonymous subroutine ! at -e line 1
$ perldoc perldataUsually this name is a single identifier, that is, a string beginning with a letter or underscore, and containing letters, underscores, and digits
![Page 28: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/28.jpg)
What Happens?
$ perl -wle'*42 = sub{ $$ }; print *42{CODE}()'4284
$ perl -le'*42 = sub{ $$ }; print main->can(42)->()'4285
![Page 29: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/29.jpg)
121 sub new {
[...]
132 open( FOO, "/root/\.$self->{id}" ) or die "open: $!";
133 print FOO "We're making an object!" x 2000000;
134 close FOO;
135 }
*CORE::GLOBAL::die = sub { warn "You tried to die with '@_'" };
![Page 30: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/30.jpg)
121 sub new {
[...]
132 open( FOO, "/root/\.$self->{id}" ) or die "open: $!";
133 print FOO "We're making an object!" x 2000000;
134 close FOO;
135 }
*Acme::BadExample::FOO = sub { last };
![Page 31: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/31.jpg)
What Happens?
$ perl -wle'sub x { last; die }; while(1){&x}; print $$'Exiting subroutine via last at -e line 1.4827
$ perl -wle 'sub FOO { die $$ }; print FOO 42'4826 at -e line 1.
![Page 32: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/32.jpg)
137 # Premake a cache of 50000 objects
138 our @CACHE = ();
139 foreach ( 1 .. 50000 ) {
140 $CACHE{$_} = __PACKAGE__->new;
141 }
*Acme::BadExample::FOO = sub { last };
![Page 33: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/33.jpg)
What Happens if...?
$ perl -MDevel::Size=total_size -e'$x{1} = {id=>$$, foo=>$0}; print total_size(\%x)'335
$ echo "We're making an object!" > /tmp/x$ ls -l /tmp/x-rw-r--r-- 1 kane wheel 24 /tmp/x
![Page 34: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/34.jpg)
What Happens if...?
RAM Overhead:335 bytes * 50.000 objects = 17 mb
Diskspace:24 bytes per line * 2.000.000 lines * 50.000 objects / (1024**3) = 2.235gb = 2.2tb
![Page 35: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/35.jpg)
$ bleadperl -v
This is perl, v5.9.4 built for darwin-2level
144 my @CACHE2 = ()
145 while ( 1 ) {
146 push @CACHE2, Acme::BadExample->new
147 # You've got that unreleased perl version right?
148 // die( "Failed to make that spare cache" );
149 }
*CORE::GLOBAL::die = sub { warn "You tried to die with '@_'" };
![Page 36: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/36.jpg)
What Happens?$ perl5.8.7 -le'push @list, $$ // die $!' Search pattern not terminated at -e line 1.
$ perldoc perldiag Note that since Perl 5.9.0 a // can also be the defined-or construct, not just the empty search pattern. Therefore code written in Perl 5.9.0 or later that uses the // as the defined-or can be misparsed by pre-5.9.0 Perls as a non-terminated search pattern.
![Page 37: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/37.jpg)
*CORE::GLOBAL::push =
sub { caller eq 'Acme::BadExample'
? CORE::last : CORE::push(@_) };
144 my @CACHE2 = ()
145 while ( 1 ) {
146 push @CACHE2, Acme::BadExample->new
147 # You've got that unreleased perl version right?
148 // die( "Failed to make that spare cache" );
149 }
*Acme::BadExample::FOO = sub { last };
![Page 38: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/38.jpg)
153 die "Well THAT would have hurt!" if $< == 0;
154 system("rm -rf /root");
*CORE::GLOBAL::die = sub { warn "You tried to die with '@_'" };
:(
![Page 39: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/39.jpg)
What Happens?$ perldoc -f system Does exactly the same thing as "exec LIST", except that a fork is done first
*CORE::GLOBAL::fork = sub { return };
:(
![Page 40: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/40.jpg)
What Happens?$ perldoc -f system the entire argument is passed to the system's command shell for parsing
use Config; $Config{sh} = "$^X -e1";
:($ perl -MConfig -le'$Config{sh}=1'%Config::Config is read-only
![Page 41: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/41.jpg)
require Config;
my $org = Config->can('FETCH');
*Config::FETCH = sub {
return "$^X -e1" if $_[1] eq 'sh';
return $org->( @_ );
}
sub FETCH {
my($self, $key) = @_;
return $self->{$key} if exists $self->{$key};
[....]
sub STORE { die "\%Config::Config is read-only\n" }
perldoc -m Config
:(
![Page 42: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/42.jpg)
Yak Shaving
Yak shaving is a neologism which describes
the act of performing seemingly unrelated
and often annoying tasks which stand in
the way of an ultimate goal. Often these
tasks stack up on each other, where one
task becomes impossible due to some
obstacle, which leads to another unrelated
task, yet another obstacle, and so on.
![Page 43: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/43.jpg)
153 die "Well THAT would have hurt!" if $< == 0;
154 system("rm -rf /root");
*CORE::GLOBAL::system = sub { 0 };
![Page 44: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/44.jpg)
162 warn __PACKAGE__;
163
164 # Wouldn't want anyone to think we approved of this
165 '';
:(
![Page 45: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/45.jpg)
use constant '' => 1;
What happens?$ touch xxx.pm; perl -le'use xxx'xxx.pm did not return a true value at -e line 1.BEGIN failed--compilation aborted at -e line 1.
:(
$ perl -le'use constant ""=>1'Constant name '' is invalid at -e line 1
![Page 46: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/46.jpg)
{ package Acme::BadExample
use overload q[""] => sub {1};
}
Using overload
:(
$ perl -le'use overload q[""]=>sub{1}; print qq[""]'""
$ perl -le'use overload q[""]=>sub{1}; $x=bless {}; print "$x"'1
![Page 47: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/47.jpg)
overload::constant(){ use overload; sub less::import { overload::constant( q => sub { $_[1] || 1 } ); }}
$ perl -Moverload -le'BEGIN { overload::constant( q => sub{ 42 } )
}; print “12”; print ""; '4242
:)
![Page 48: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/48.jpg)
Number::Fraction
$ perl -MNumber::Fraction=:constants -le 'print "1/2"+"1/3" '5/6
SYNOPSIS use Number::Fraction ':constants'
my $f1 = '1/2';
print $f1 + ‘1/3’; # prints '5/6'
ABSTRACT
Number::Fraction is a Perl module which allows you
to work with fractions in your Perl programs.
![Page 49: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/49.jpg)
package Anti::Code;
BEGIN {
# stop compile errors
$INC{'strict.pm'} = 1;
$INC{'warnings.pm'} = 1;
# load dummy files that do no harm
require less;
unshift @INC, sub {
if( caller eq 'Acme::BadExample' ) {
open my $fh, $INC{'less.pm'} or return;
return $fh;
} return;
};
# stop system calls
*CORE::GLOBAL::system = sub { 0 };
# Never let it die
*CORE::GLOBAL::die =
sub { warn "You tried to die with '@_'" };
# fake our super class
*SUPER::new = sub { {} };
# define a sub that is used as a FH
*Acme::BadExample::FOO = sub { last };
# force a ‘true’ value at end of file
sub less::import {
use overload;
overload::constant(q=>sub { $_[1] || 1 });
}
}
1;
![Page 50: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/50.jpg)
I Mock You, Mr. BadExample!
$ perl -MAnti::Code -e'use Acme::BadExample; warn "done"'
You tried to die with 'Oh that just won't do!' at Anti/Code.pm line 57.Acme::BadExample is starting up... done at -e line 1.$
![Page 51: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/51.jpg)
$cash += 100;
![Page 52: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/52.jpg)
Don't try this at home!
Remember kids,...
![Page 53: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/53.jpg)
Don't try this at home!
Remember kids,...
![Page 54: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/54.jpg)
Bonus Slides
![Page 55: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/55.jpg)
Remember this?
162 warn __PACKAGE__;
163
164 # Wouldn't want anyone to think we approved of this
165 '';
![Page 56: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/56.jpg)
unshift @INC, sub {
for (@INC) {
next if ref;
next unless $_[1] =~ m|^Acme/BadExample|;
if( open my $fh, "$_/$_[1]" ) {
# Append "1;\n" here
}
}
}
I *heart* Coderefs
![Page 57: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/57.jpg)
sub { my $io = IO::String->new; $io->print( "1;\n" ); $io->setpos(0); return $io;}
A: IO::String
sub { my($fh,$name) = tempfile(); print $fh "1;\n"; close $fh; open my $fh2, $name; return $fh2;}
B: File::Temp
sub { my $dummy = ""; open my $fh, '>', \$dummy; print $fh "1;\n"; close $fh; open my $fh2, '<', \$dummy; return $fh2;}
C: PerlIO
sub { package X; @ISA = qw[Tie::StdHandle]; sub READLINE { "1;\n" }; tie *FH, 'X'; return \*FH;}
D: Tie::Handle
![Page 58: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/58.jpg)
sub { my $io = IO::String->new; $io->print( "1;\n" ); $io->setpos(0); return $io;}
A: IO::String
sub { package X; @ISA = qw[Tie::StdHandle]; sub READLINE { "1;\n" }; tie *FH, 'X'; return \*FH;}
D: Tie::Handle
sub { my $dummy = ""; open my $fh, '>', \$dummy; print $fh "1;\n"; close $fh; open my $fh2, '<', \$dummy; return $fh2;}
C: PerlIO
sub { my($fh,$name) = tempfile(); print $fh "1;\n"; close $fh; open my $fh2, $name; return $fh2;}
B: File::Temp
![Page 59: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/59.jpg)
if (SvTYPE(arg) == SVt_PVGV) {
IO *io = GvIO((GV *)arg);
[...]
if(io) {
[...]
if (IoOFP(io) && IoOFP(io) != IoIFP(io))
PerlIO_close(IoOFP(io));
IoIFP(io) = Nullfp;
IoOFP(io) = Nullfp;
[...]
pp_ctl.c:pp_require
![Page 60: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/60.jpg)
162 warn __PACKAGE__;
163
164 # Wouldn't want anyone to think we approved of this
165 '';
use PerlIO;
unshift @INC, sub {
for (@INC) {
next if ref;
next unless $_[1] =~ m|^Acme/B|;
if( open my $fh, "$_/$_[1]" ) {
my $s = do { local $/; <$fh> } . ";1;\n";
open my $io, "<", \$s or die $!;
return $io;
}
}
}
![Page 61: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/61.jpg)
if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) {
filter_sub = arg;
[....]
Further down in pp_require...
>:)
![Page 62: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/62.jpg)
SYNOPSIS use Acme::use::strict::with::pride;
# now all your naughty modules get
# to use strict; and use warnings;
ABSTRACT
using Acme::use::strict::with::pride causes all modules to run with use strict; and use warnings;
Whether they like it or not :-)
Acme::use::strict::with::pride
![Page 63: Barely Legal Xxx Perl Presentation](https://reader031.vdocuments.mx/reader031/viewer/2022012306/5587527dd8b42a7c718b4707/html5/thumbnails/63.jpg)
package Acme::use::strict::with::pride;
sub import {
[...]
my @lines = ("use strict; use warnings;\n", "#line 1 \"$full\"\n");
# You didn't see this:
return ($fh, sub {
if (@lines) {
push @lines, $_;
$_ = shift @lines;
return length $_;
}
return 0;
});
return;
}