This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
{PATCH docs] sockatmark
[perl5.git] / t / japh / abigail.t
CommitLineData
6990bd83
A
1#!./perl -w
2
3#
4# Tests derived from Japhs.
5#
6
7BEGIN {
8 if (ord("A") == 193) {
9 print "1..0 # Skip: EBCDIC\n"; # For now, until someone has time.
10 exit(0);
11 }
12 chdir 't' if -d 't';
13 @INC = '../lib';
14 require "./test.pl";
15 undef &skip;
16}
17
18#
19# ./test.pl does real evilness by jumping to a label.
20# This function copies the skip from ./test, omitting the goto.
21#
22sub skip {
23 my $why = shift;
6990bd83
A
24 my $n = @_ ? shift : 1;
25 for (1..$n) {
51bdca1b 26 my $test = curr_test;
6990bd83
A
27 print STDOUT "ok $test # skip: $why\n";
28 next_test;
29 }
30}
31
32
33#
34# ./test.pl doesn't give use 'notok', so we make it here.
35#
36sub notok {
37 my ($pass, $name, @mess) = @_;
38 _ok(!$pass, _where(), $name, @mess);
39}
40
41my $JaPH = "Just another Perl Hacker";
42my $JaPh = "Just another Perl hacker";
43my $JaPH_n = "Just another Perl Hacker\n";
44my $JaPh_n = "Just another Perl hacker\n";
45my $JaPH_s = "Just another Perl Hacker ";
46my $JaPh_s = "Just another Perl hacker ";
47my $JaPH_c = "Just another Perl Hacker,";
48my $JaPh_c = "Just another Perl hacker,";
49
50plan tests => 130;
51
52{
53 my $out = sprintf "Just another Perl Hacker";
54 is ($out, $JaPH);
55}
56
57
58{
59 my @primes = (2, 3, 7, 13, 53, 101, 557, 1429);
60 my @composites = (4, 10, 25, 32, 75, 143, 1333, 1728);
61
62 my %primeness = ((map {$_ => 1} @primes),
63 (map {$_ => 0} @composites));
64
65 while (my ($num, $is_prime) = each %primeness) {
66 my $comment = "$num is " . ($is_prime ? "prime." : "composite.");
67
68 my $sub = $is_prime ? "ok" : "notok";
69
70 &$sub (( 1 x $num) !~ /^1?$|^(11+?)\1+$/, $comment);
71 &$sub (( 0 x $num) !~ m 0^\0?$|^(\0\0+?)\1+$0, $comment);
72 &$sub (("m" x $num) !~ m m^\m?$|^(\m\m+?)\1+$mm, $comment);
73 }
74}
75
76
77{ # Some platforms use different quoting techniques.
78 # I do not have access to those platforms to test
79 # things out. So, we'll skip things....
80 if ($^O eq 'MSWin32' ||
81 $^O eq 'NetWare' ||
82 $^O eq 'VMS') {
51bdca1b 83 skip "Your platform quotes differently.", 3;
6990bd83
A
84 last;
85 }
86
87 my $expected = $JaPH;
88 $expected =~ s/ /\n/g;
89 $expected .= "\n";
90 is (runperl (switches => [qw /'-weprint<<EOT;' -eJust -eanother
91 -ePerl -eHacker -eEOT/],
92 verbose => 0),
93 $expected, "Multiple -e switches");
94
95 is (runperl (switches => [q !'-wle$_=<<EOT;y/\n/ /;print;'!,
96 qw ! -eJust -eanother -ePerl -eHacker -eEOT!],
97 verbose => 0),
98 $JaPH . " \n", "Multiple -e switches");
99
100 is (runperl (switches => [qw !-wl!],
101 progs => [qw !print qq-@{[ qw+ Just
102 another Perl Hacker +]}-!],
103 verbose => 0),
104 $JaPH_n, "Multiple -e switches");
105}
106
107{
108 if ($^O eq 'MSWin32' ||
109 $^O eq 'NetWare' ||
110 $^O eq 'VMS') {
51bdca1b 111 skip "Your platform quotes differently.", 1;
6990bd83
A
112 last;
113 }
114 is (runperl (switches => [qw /-sweprint --/,
115 "-_='Just another Perl Hacker'"],
116 nolib => 1,
117 verbose => 0),
118 $JaPH, 'setting $_ via -s');
119}
120
121{
122 my $datafile = "datatmp000";
123 1 while -f ++ $datafile;
124 END {unlink_all $datafile}
125
126 open MY_DATA, "> $datafile" or die "Failed to open $datafile: $!";
127 print MY_DATA << " --";
128 One
129 Two
130 Three
131 Four
132 Five
133 Six
134 --
135 close MY_DATA or die "Failed to close $datafile: $!\n";
136
137 my @progs;
138 my $key;
139 while (<DATA>) {
140 last if /^__END__$/;
141
142 if (/^#{7}(?:\s+(.*))?/) {
143 push @progs => {COMMENT => $1 || '',
144 CODE => '',
145 SKIP_OS => [],
146 ARGS => [],
147 SWITCHES => [],};
148 $key = 'CODE';
149 next;
150 }
151 elsif (/^(COMMENT|CODE|ARGS|SWITCHES|EXPECT|SKIP|SKIP_OS)
152 (?::\s+(.*))?$/sx) {
153 $key = $1;
154 $progs [-1] {$key} = '' unless exists $progs [-1] {$key};
155 next unless defined $2;
156 $_ = $2;
157 }
158 elsif (/^$/) {
159 next;
160 }
161
162 if (ref ($progs [-1] {$key})) {
163 push @{$progs [-1] {$key}} => $_;
164 }
165 else {
166 $progs [-1] {$key} .= $_;
167 }
168 }
169
170 foreach my $program (@progs) {
171 if (exists $program -> {SKIP}) {
172 chomp $program -> {SKIP};
51bdca1b 173 skip $program -> {SKIP}, 1;
6990bd83
A
174 next;
175 }
176
51bdca1b
JH
177 if (@{$program -> {SKIP_OS}}) {
178 chomp @{$program -> {SKIP_OS}};
179 if (grep {$^O eq $_} @{$program -> {SKIP_OS}}) {
180 skip "Your OS uses different quoting.", 1;
181 next;
182 }
6990bd83
A
183 }
184
185 map {s/\$datafile/$datafile/} @{$program -> {ARGS}};
186 $program -> {EXPECT} = $JaPH unless exists $program -> {EXPECT};
187 $program -> {EXPECT} =~ s/\$JaPH_s\b/$JaPH_s/g;
188 $program -> {EXPECT} =~ s/\$JaPh_c\b/$JaPh_c/g;
189 $program -> {EXPECT} =~ s/\$JaPh\b/$JaPh/g;
190 chomp ($program -> {EXPECT}, @{$program -> {SWITCHES}},
191 @{$program -> {ARGS}});
192 fresh_perl_is ($program -> {CODE},
193 $program -> {EXPECT},
194 {switches => $program -> {SWITCHES},
195 args => $program -> {ARGS},
196 verbose => 0},
197 $program -> {COMMENT});
198 }
199}
200
201{
202 my $progfile = "progtmp000";
203 1 while -f ++ $progfile;
204 END {unlink_all $progfile}
205
206 my @programs = (<< ' --', << ' --');
207#!./perl -- # No trailing newline after the last line!
208BEGIN{$|=$SIG{__WARN__}=sub{$_=$_[0];y-_- -;print/(.)"$/;seek _,-open(_
209,"+<$0"),2;truncate _,tell _;close _;exec$0}}//rekcaH_lreP_rehtona_tsuJ
210 --
211#!./perl -- # Remove trailing newline!
212BEGIN{$SIG{__WARN__}=sub{$_=pop;y-_- -;print/".*(.)"/;
213truncate$0,-1+-s$0;exec$0;}}//rekcaH_lreP_rehtona_tsuJ
214 --
215 chomp @programs;
216
51bdca1b
JH
217 if ($^O eq 'VMS') {
218 # VMS needs extensions for files to be executable,
219 # but the Japhs above rely on $0 being exactly the
220 # filename of the program.
221 skip "VMS", 2 * @programs;
222 last
223 }
224
225 use Config;
226 unless (defined $Config {useperlio}) {
227 skip "Uuseperlio", 2 * @programs;
228 last
229 }
230
6990bd83
A
231 my $i = 1;
232 foreach my $program (@programs) {
233 open my $fh => "> $progfile" or die "Failed to open $progfile: $!\n";
234 print $fh $program;
235 close $fh or die "Failed to close $progfile: $!\n";
236
237 chmod 0755 => $progfile or die "Failed to chmod $progfile: $!\n";
238 my $command = "./$progfile";
239 $command .= ' 2>&1' unless $^O eq 'MacOS';
240 my $output = `$command`;
241
242 $i ++;
243 is ($output, $JaPH, "Self correcting code $i");
244
245 $output = `$command`;
246 is ($output, "", "Self corrected code $i");
247 }
248}
249
250__END__
251####### Funky loop 1.
252$_ = q ;4a75737420616e6f74686572205065726c204861636b65720as;;
253 for (s;s;s;s;s;s;s;s;s;s;s;s)
254 {s;(..)s?;qq qprint chr 0x$1 and \161 ssq;excess;}
255
256####### Funky loop 2.
257$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
258for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}
259print chr 0x$& and q
260qq}*excess********}
261
262####### Funky loop 3.
263$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
264for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}
265print chr 0x$& and q
266qq}*excess********}
267
268####### Funky loop 4.
269$_ = q ?4a75737420616e6f74686572205065726c204861636b65720as?;??;
270for (??;(??)x??;??)
271 {??;s;(..)s?;qq ?print chr 0x$1 and \161 ss?;excess;??}
272SKIP: Abuses a fixed bug.
273
274####### Funky loop 5.
275for (s??4a75737420616e6f74686572205065726c204861636b65720as?;??;??)
276 {s?(..)s\??qq \?print chr 0x$1 and q ss\??excess}
277SKIP: Abuses a fixed bug.
278
279####### Funky loop 6.
280$a = q 94a75737420616e6f74686572205065726c204861636b65720a9 and
281${qq$\x5F$} = q 97265646f9 and s g..g;
282qq e\x63\x68\x72\x20\x30\x78$&eggee;
283{eval if $a =~ s e..eqq qprint chr 0x$& and \x71\x20\x71\x71qeexcess}
284
285####### Roman Dates.
286@r=reverse(M=>(0)x99=>CM=>(0)x399=>D=>(0)x99=>CD=>(
2870)x299=>C=>(0)x9=>XC=>(0)x39=>L=>(0)x9=>XL=>(0)x29=>X=>IX=>0=>0=>0=>V=>IV=>0=>0
288=>I=>$==-2449231+gm_julian_day+time);do{until($=<$#r){$_.=$r[$#r];$=-=$#r}for(;
289!$r[--$#r];){}}while$=;$,="\x20";print+$_=>September=>MCMXCIII=>=>=>=>=>=>=>=>
290SWITCHES
291-MTimes::JulianDay
292-l
293SKIP: Times::JulianDay not part of the main distribution.
294
295####### Autoload 1.
296sub _'_{$_'_=~s/$a/$_/}map{$$_=$Z++}Y,a..z,A..X;*{($_::_=sprintf+q=%X==>"$A$Y".
297"$b$r$T$u")=~s~0~O~g;map+_::_,U=>T=>L=>$Z;$_::_}=*_;sub _{print+/.*::(.*)/s};;;
298*{chr($b*$e)}=*_'_;*__=*{chr(1<<$e)}; # Perl 5.6.0 broke this...
299_::_(r(e(k(c(a(H(__(l(r(e(P(__(r(e(h(t(o(n(a(__(t(us(J())))))))))))))))))))))))
300EXPECT: Just__another__Perl__Hacker
301
302####### Autoload 2.
303$"=$,;*{;qq{@{[(A..Z)[qq[0020191411140003]=~m[..]g]]}}}=*_=sub{print/::(.*)/};
304$\=$/;q<Just another Perl Hacker>->();
305
306####### Autoload 3.
307$"=$,;*{;qq{@{[(A..Z)[qq[0020191411140003]=~m[..]g]]}}}=*_;
308sub _ {push @_ => /::(.*)/s and goto &{ shift}}
309sub shift {print shift; @_ and goto &{+shift}}
310Hack ("Just", "Perl ", " ano", "er\n", "ther "); # YYYYMMDD
311
312####### Autoload 4.
313$, = " "; sub AUTOLOAD {($AUTOLOAD =~ /::(.*)/) [0];}
314print+Just (), another (), Perl (), Hacker ();
315
316####### Look ma! No letters!
317$@="\145\143\150\157\040\042\112\165\163\164\040\141\156\157\164".
318 "\150\145\162\040\120\145\162\154\040\110\141\143\153\145\162".
319 "\042\040\076\040\057\144\145\166\057\164\164\171";`$@`
320SKIP: Unix specific
321
322####### sprintf fun 1.
323sub f{sprintf$_[0],$_[1],$_[2]}print f('%c%s',74,f('%c%s',117,f('%c%s',115,f(
324'%c%s',116,f('%c%s',32,f('%c%s',97,f('%c%s',0x6e,f('%c%s',111,f('%c%s',116,f(
325'%c%s',104,f('%c%s',0x65,f('%c%s',114,f('%c%s',32,f('%c%s',80,f('%c%s',101,f(
326'%c%s',114,f('%c%s',0x6c,f('%c%s',32,f('%c%s',0x48,f('%c%s',97,f('%c%s',99,f(
327'%c%s',107,f('%c%s',101,f('%c%s',114,f('%c%s',10,)))))))))))))))))))))))))
328
329####### sprintf fun 2.
330sub f{sprintf'%c%s',$_[0],$_[1]}print f(74,f(117,f(115,f(116,f(32,f(97,
331f(110,f(111,f(116,f(104,f(0x65,f(114,f(32,f(80,f(101,f(114,f(0x6c,f(32,
332f(0x48,f(97,f(99,f(107,f(101,f(114,f(10,q ff)))))))))))))))))))))))))
333
334####### Hanoi.
335%0=map{local$_=$_;reverse+chop,$_}ABC,ACB,BAC,BCA,CAB,CBA;$_=3 .AC;1while+
336s/(\d+)((.)(.))/($0=$1-1)?"$0$3$0{$2}1$2$0$0{$2}$4":"$3 => $4\n"/xeg;print
337EXPECT
338A => C
339A => B
340C => B
341A => C
342B => A
343B => C
344A => C
345
346####### Funky -p 1
347}{$_=$.
348SWITCHES: -wlp
349ARGS: $datafile
350EXPECT: 6
351
352####### Funky -p 2
353}$_=$.;{
354SWITCHES: -wlp
355ARGS: $datafile
356EXPECT: 6
357
358####### Funky -p 3
359}{$_=$.}{
360SWITCHES: -wlp
361ARGS: $datafile
362EXPECT: 6
363
364####### Funky -p 4
365}{*_=*.}{
366SWITCHES: -wlp
367ARGS: $datafile
368EXPECT: 6
369
370####### Funky -p 5
371}for($.){print
372SWITCHES: -wln
373ARGS: $datafile
374EXPECT: 6
375
376####### Funky -p 6
377}{print$.
378SWITCHES: -wln
379ARGS: $datafile
380EXPECT: 6
381
382####### Funky -p 7
383}print$.;{
384SWITCHES: -wln
385ARGS: $datafile
386EXPECT: 6
387
388####### Abusing -M
3891
390SWITCHES
391-Mstrict='}); print "Just another Perl Hacker"; ({'
392-l
393SKIP_OS: VMS
394MSWin32
395NetWare
396
397####### rand
398srand 123456;$-=rand$_--=>@[[$-,$_]=@[[$_,$-]for(reverse+1..(@[=split
399//=>"IGrACVGQ\x02GJCWVhP\x02PL\x02jNMP"));print+(map{$_^q^"^}@[),"\n"
400SKIP: Solaris specific.
401
402####### print and __PACKAGE__
403package Just_another_Perl_Hacker; sub print {($_=$_[0])=~ s/_/ /g;
404 print } sub __PACKAGE__ { &
405 print ( __PACKAGE__)} &
406 __PACKAGE__
407 ( )
408
409####### Decorations.
410* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
411/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
412% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %;
413BEGIN {% % = ($ _ = " " => print "Just another Perl Hacker\n")}
414
415####### Tie 1
416sub J::FETCH{Just }$_.='print+"@{[map';sub J::TIESCALAR{bless\my$J,J}
417sub A::FETCH{another}$_.='{tie my($x),$';sub A::TIESCALAR{bless\my$A,A}
418sub P::FETCH{Perl }$_.='_;$x}qw/J A P';sub P::TIESCALAR{bless\my$P,P}
419sub H::FETCH{Hacker }$_.=' H/]}\n"';eval;sub H::TIESCALAR{bless\my$H,H}
420
421####### Tie 2
422package Z;use overload'""'=>sub{$b++?Hacker:another};
423sub TIESCALAR{bless\my$y=>Z}sub FETCH{$a++?Perl:Just}
424$,=$";my$x=tie+my$y=>Z;print$y,$x,$y,$x,"\n";#Abigail
425EXPECT: $JaPH_s
426
427####### Tie 3
428sub A::TIESCALAR{bless\my$x=>A};package B;@q[0..3]=qw/Hacker Perl
429another Just/;use overload'""'=>sub{pop @q};sub A::FETCH{bless\my
430$y=>B}; tie my $shoe => qq 'A';print "$shoe $shoe $shoe $shoe\n";
431
432####### Tie 4
433sub A::TIESCALAR{bless\my$x=>'A'};package B;@q=qw/Hacker Perl
434another Just/;use overload'""',sub{pop @q};sub A::FETCH{bless
435\my $y=>B};tie my$shoe=>'A';print"$shoe $shoe $shoe $shoe\n";
436
437####### Tie 5
438tie $" => A; $, = " "; $\ = "\n"; @a = ("") x 2; print map {"@a"} 1 .. 4;
439sub A::TIESCALAR {bless \my $A => A} # Yet Another silly JAPH by Abigail
440sub A::FETCH {@q = qw /Just Another Perl Hacker/ unless @q; shift @q}
441SKIP: Pending a bug fix.
442
443####### Prototype fun 1
444sub camel (^#87=i@J&&&#]u'^^s]#'#={123{#}7890t[0.9]9@+*`"'***}A&&&}n2o}00}t324i;
445h[{e **###{r{+P={**{e^^^#'#i@{r'^=^{l+{#}H***i[0.9]&@a5`"':&^;&^,*&^$43##@@####;
446c}^^^&&&k}&&&}#=e*****[]}'r####'`=437*{#};::'1[0.9]2@43`"'*#==[[.{{],,,1278@#@);
447print+((($llama=prototype'camel')=~y|+{#}$=^*&[0-9]i@:;`"',.| |d)&&$llama."\n");
448SKIP: Abuses a fixed bug.
449
450####### Prototype fun 2
451print prototype sub "Just another Perl Hacker" {};
452
453####### Prototype fun 3
454sub _ "Just another Perl Hacker"; print prototype \&_
455
456####### Split 1
457 split // => '"';
458${"@_"} = "/"; split // => eval join "+" => 1 .. 7;
459*{"@_"} = sub {foreach (sort keys %_) {print "$_ $_{$_} "}};
460%{"@_"} = %_ = (Just => another => Perl => Hacker); &{%{%_}};
461EXPECT: $JaPH_s
462
463####### Split 2
464$" = "/"; split // => eval join "+" => 1 .. 7;
465*{"@_"} = sub {foreach (sort keys %_) {print "$_ $_{$_} "}};
466%_ = (Just => another => Perl => Hacker); &{%_};
467EXPECT: $JaPH_s
468
469####### Split 3
470$" = "/"; split $, => eval join "+" => 1 .. 7;
471*{"@_"} = sub {foreach (sort keys %_) {print "$_ $_{$_} "}};
472%{"@_"} = %_ = (Just => another => Perl => Hacker); &{%{%_}};
473EXPECT: $JaPH_s
474
475####### Here documents 1
476$_ = "\x3C\x3C\x45\x4F\x54"; s/<<EOT/<<EOT/e; print;
477Just another Perl Hacker
478EOT
479
480####### Here documents 2
481$_ = "\x3C\x3C\x45\x4F\x54";
482print if s/<<EOT/<<EOT/e;
483Just another Perl Hacker
484EOT
485
486####### Here documents 3
487$_ = "\x3C\x3C\x45\x4F\x54" and s/<<EOT/<<EOT/e and print;
488Just another Perl Hacker
489EOT
490
491####### Here documents 4
492$_ = "\x3C\x3C\x45\x4F\x54\n" and s/<<EOT/<<EOT/ee and print;
493"Just another Perl Hacker"
494EOT
495
496####### Self modifying code 1
497$_ = "goto F.print chop;\n=rekcaH lreP rehtona tsuJ";F1:eval
498SWITCHES: -w
499
500####### Overloaded constants 1
501BEGIN {$^H {q} = sub {pop and pop and print pop}; $^H = 2**4.2**12}
502"Just "; "another "; "Perl "; "Hacker";
503
504####### Overloaded constants 2
505BEGIN {$^H {q} = sub {$_ [1] =~ y/S-ZA-IK-O/q-tc-fe-m/d; $_ [1]}; $^H = 0x28100}
506print "Just another PYTHON hacker\n";
507EXPECT: $JaPh
508
509####### Overloaded constants 3
510BEGIN {$^H {join "" => ("a" .. "z") [8, 13, 19, 4, 6, 4, 17]} = sub
511 {["", "Just ", "another ", "Perl ", "Hacker\n"] -> [shift]};
512 $^H = hex join "" => reverse map {int ($_ / 2)} 0 .. 4}
513print 1, 2, 3, 4;
514
515####### Overloaded constants 4
516BEGIN {$^H {join "" => ("a" .. "z") [8, 13, 19, 4, 6, 4, 17]} = sub
517 {["", "Just ", "another ", "Perl ", "Hacker"] -> [shift]};
518 $^H = hex join "" => reverse map {int ($_ / 2)} 0 .. 4}
519print 1, 2, 3, 4, "\n";
520
521####### Overloaded constants 5
522BEGIN {my $x = "Knuth heals rare project\n";
523 $^H {integer} = sub {my $y = shift; $_ = substr $x => $y & 0x1F, 1;
524 $y > 32 ? uc : lc}; $^H = hex join "" => 2, 1, 1, 0, 0}
525print 52,2,10,23,16,8,1,19,3,6,15,12,5,49,21,14,9,11,36,13,22,32,7,18,24;
526
527####### v-strings 1
528print v74.117.115.116.32;
529print v97.110.111.116.104.101.114.32;
530print v80.101.114.108.32;
531print v72.97.99.107.101.114.10;
532
533####### v-strings 2
534print 74.117.115.116.32;
535print 97.110.111.116.104.101.114.32;
536print 80.101.114.108.32;
537print 72.97.99.107.101.114.10;
538
539####### v-strings 3
540print v74.117.115.116.32, v97.110.111.116.104.101.114.32,
541 v80.101.114.108.32, v72.97.99.107.101.114.10;
542
543####### v-strings 4
544print 74.117.115.116.32, 97.110.111.116.104.101.114.32,
545 80.101.114.108.32, 72.97.99.107.101.114.10;
546
547####### v-strings 5
548print v74.117.115.116.32.97.110.111.116.104.101.114.
549 v32.80.101.114.108.32.72.97.99.107.101.114.10;
550
551####### v-strings 6
552print 74.117.115.116.32.97.110.111.116.104.101.114.
553 32.80.101.114.108.32.72.97.99.107.101.114.10;
554
555####### Symbolic references.
556map{${+chr}=chr}map{$_=>$_^ord$"}$=+$]..3*$=/2;
557print "$J$u$s$t $a$n$o$t$h$e$r $P$e$r$l $H$a$c$k$e$r\n";
558
559####### $; fun
560$; # A lone dollar?
561=$"; # Pod?
562$; # The return of the lone dollar?
563{Just=>another=>Perl=>Hacker=>} # Bare block?
564=$/; # More pod?
565print%; # No right operand for %?
566
567####### @; fun
568@;=split//=>"Joel, Preach sartre knuth\n";$;=chr 65;%;=map{$;++=>$_}
5690,22,13,16,5,14,21,1,23,11,2,7,12,6,8,15,3,19,24,14,10,20,18,17,4,25
570;print@;[@;{A..Z}];
571EXPECT: $JaPh_c
572
573####### %; fun
574$;=$";$;{Just=>another=>Perl=>Hacker=>}=$/;print%;
575
576####### &func;
577$_ = "\112\165\163\1648\141\156\157\164\150\145\1628\120\145"
578 . "\162\1548\110\141\143\153\145\162\0128\177" and &japh;
579sub japh {print "@_" and return if pop; split /\d/ and &japh}
580
581####### magic goto.
582sub _ {$_ = shift and y/b-yB-Y/a-yB-Y/ xor !@ _?
583 exit print :
584 print and push @_ => shift and goto &{(caller (0)) [3]}}
585 split // => "KsvQtbuf fbsodpmu\ni flsI " xor & _
586
587####### $: fun 1
588:$:=~s:$":Just$&another$&:;$:=~s:
589:Perl$"Hacker$&:;chop$:;print$:#:
590
591####### $: fun 2
592 :;$:=~s:
593-:;another Perl Hacker
594 :;chop
595$:;$:=~y
596 :;::d;print+Just.
597$:;
598
599####### $: fun 3
600 :;$:=~s:
601-:;another Perl Hacker
602 :;chop
603$:;$:=~y:;::d;print+Just.$:
604
605####### $!
606s[$,][join$,,(split$,,($!=85))[(q[0006143730380126152532042307].
607q[41342211132019313505])=~m[..]g]]e and y[yIbp][HJkP] and print;
608SKIP: Platform dependent.
609
610####### die 1
611eval {die ["Just another Perl Hacker"]}; print ${$@}[$#{@${@}}]
612
613####### die 2
614eval {die ["Just another Perl Hacker\n"]}; print ${$@}[$#{@${@}}]
615
616####### die 3
617eval {die ["Just another Perl Hacker"]}; print ${${@}}[$#{@{${@}}}]
618
619####### die 4
620eval {die ["Just another Perl Hacker\n"]}; print ${${@}}[$#{@{${@}}}]
621
622####### die 5
623eval {die [[qq [Just another Perl Hacker]]]};; print
624${${${@}}[$#{@{${@}}}]}[$#{${@{${@}}}[$#{@{${@}}}]}]
625
626####### Closure returning itself.
627$_ = "\nrekcaH lreP rehtona tsuJ"; my $chop; $chop = sub {print chop; $chop};
628$chop -> () -> () -> () -> () -> () -> () -> () -> () -> () -> () -> () -> ()
629-> () -> () -> () -> () -> () -> () -> () -> () -> () -> () -> () -> () -> ()
630
631####### Special blocks 1
632BEGIN {print "Just " }
633CHECK {print "another "}
634INIT {print "Perl " }
635END {print "Hacker\n"}
636
637####### Special blocks 2
638END {print "Hacker\n"}
639INIT {print "Perl " }
640CHECK {print "another "}
641BEGIN {print "Just " }
642
643####### Recursive regex.
644 my $qr = qr/^.+?(;).+?\1|;Just another Perl Hacker;|;.+$/;
645 $qr =~ s/$qr//g;
646print $qr, "\n";
647
648####### use lib 'coderef'
649use lib sub {($\) = split /\./ => pop; print $"};
650eval "use Just" || eval "use another" || eval "use Perl" || eval "use Hacker";
651EXPECT
652 Just another Perl Hacker