📄 runlevel.t
字号:
#!./perl#### Many of these tests are originally from Michael Schroeder## <Michael.Schroeder@informatik.uni-erlangen.de>## Adapted and expanded by Gurusamy Sarathy <gsar@activestate.com>##chdir 't' if -d 't';@INC = '../lib';$Is_VMS = $^O eq 'VMS';$Is_MSWin32 = $^O eq 'MSWin32';$ENV{PERL5LIB} = "../lib" unless $Is_VMS;$|=1;undef $/;@prgs = split "\n########\n", <DATA>;print "1..", scalar @prgs, "\n";$tmpfile = "runltmp000";1 while -f ++$tmpfile;END { if ($tmpfile) { 1 while unlink $tmpfile; } }for (@prgs){ my $switch = ""; if (s/^\s*(-\w+)//){ $switch = $1; } my($prog,$expected) = split(/\nEXPECT\n/, $_); open TEST, ">$tmpfile"; print TEST "$prog\n"; close TEST; my $results = $Is_VMS ? `MCR $^X "-I[-.lib]" $switch $tmpfile 2>&1` : $Is_MSWin32 ? `.\\perl -I../lib $switch $tmpfile 2>&1` : `./perl $switch $tmpfile 2>&1`; my $status = $?; $results =~ s/\n+$//; # allow expected output to be written as if $prog is on STDIN $results =~ s/runltmp\d+/-/g; $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg $expected =~ s/\n+$//; if ($results ne $expected) { print STDERR "PROG: $switch\n$prog\n"; print STDERR "EXPECTED:\n$expected\n"; print STDERR "GOT:\n$results\n"; print "not "; } print "ok ", ++$i, "\n";}__END__@a = (1, 2, 3);{ @a = sort { last ; } @a;}EXPECTCan't "last" outside a loop block at - line 3.########package TEST; sub TIESCALAR { my $foo; return bless \$foo;}sub FETCH { eval 'die("test")'; print "still in fetch\n"; return ">$@<";}package main; tie $bar, TEST;print "- $bar\n";EXPECTstill in fetch- >test at (eval 1) line 1.<########package TEST; sub TIESCALAR { my $foo; eval('die("foo\n")'); print "after eval\n"; return bless \$foo;}sub FETCH { return "ZZZ";} package main; tie $bar, TEST;print "- $bar\n";print "OK\n";EXPECTafter eval- ZZZOK########package TEST; sub TIEHANDLE { my $foo; return bless \$foo;}sub PRINT {print STDERR "PRINT CALLED\n";(split(/./, 'x'x10000))[0];eval('die("test\n")');} package main; open FH, ">&STDOUT";tie *FH, TEST;print FH "OK\n";print STDERR "DONE\n";EXPECTPRINT CALLEDDONE########sub warnhook { print "WARNHOOK\n"; eval('die("foooo\n")');}$SIG{'__WARN__'} = 'warnhook';warn("dfsds\n");print "END\n";EXPECTWARNHOOKEND########package TEST; use overload "\"\"" => \&str; sub str { eval('die("test\n")'); return "STR";} package main; $bar = bless {}, TEST;print "$bar\n";print "OK\n";EXPECTSTROK########sub foo { $a <=> $b unless eval('$a == 0 ? bless undef : ($a <=> $b)');}@a = (3, 2, 0, 1);@a = sort foo @a;print join(', ', @a)."\n";EXPECT0, 1, 2, 3########sub foo { goto bar if $a == 0 || $b == 0; $a <=> $b;}@a = (3, 2, 0, 1);@a = sort foo @a;print join(', ', @a)."\n";exit;bar:print "bar reached\n";EXPECTCan't "goto" out of a pseudo block at - line 2.########sub sortfn { (split(/./, 'x'x10000))[0]; my (@y) = ( 4, 6, 5); @y = sort { $a <=> $b } @y; print "sortfn ".join(', ', @y)."\n"; return $_[0] <=> $_[1];}@x = ( 3, 2, 1 );@x = sort { &sortfn($a, $b) } @x;print "---- ".join(', ', @x)."\n";EXPECTsortfn 4, 5, 6sortfn 4, 5, 6sortfn 4, 5, 6---- 1, 2, 3########@a = (3, 2, 1);@a = sort { eval('die("no way")') , $a <=> $b} @a;print join(", ", @a)."\n";EXPECT1, 2, 3########@a = (1, 2, 3);foo:{ @a = sort { last foo; } @a;}EXPECTLabel not found for "last foo" at - line 2.########package TEST; sub TIESCALAR { my $foo; return bless \$foo;}sub FETCH { next; return "ZZZ";}sub STORE {} package main; tie $bar, TEST;{ print "- $bar\n";}print "OK\n";EXPECTCan't "next" outside a loop block at - line 8.########package TEST; sub TIESCALAR { my $foo; return bless \$foo;}sub FETCH { goto bbb; return "ZZZ";} package main; tie $bar, TEST;print "- $bar\n";exit;bbb:print "bbb\n";EXPECTCan't find label bbb at - line 8.########sub foo { $a <=> $b unless eval('$a == 0 ? die("foo\n") : ($a <=> $b)');}@a = (3, 2, 0, 1);@a = sort foo @a;print join(', ', @a)."\n";EXPECT0, 1, 2, 3########package TEST;sub TIESCALAR { my $foo; return bless \$foo;}sub FETCH { return "fetch";}sub STORE {(split(/./, 'x'x10000))[0];}package main;tie $bar, TEST;$bar = "x";########package TEST;sub TIESCALAR { my $foo; next; return bless \$foo;}package main;{tie $bar, TEST;}EXPECTCan't "next" outside a loop block at - line 4.########@a = (1, 2, 3);foo:{ @a = sort { exit(0) } @a;}END { print "foobar\n" }EXPECTfoobar########$SIG{__DIE__} = sub { print "In DIE\n"; $i = 0; while (($p,$f,$l,$s) = caller(++$i)) { print "$p|$f|$l|$s\n"; }};eval { die };&{sub { eval 'die' }}();sub foo { eval { die } } foo();EXPECTIn DIEmain|-|8|(eval)In DIEmain|-|9|(eval)main|-|9|main::__ANON__In DIEmain|-|10|(eval)main|-|10|main::foo########package TEST; sub TIEARRAY { return bless [qw(foo fee fie foe)], $_[0];}sub FETCH { my ($s,$i) = @_; if ($i) { goto bbb; }bbb: return $s->[$i];} package main;tie my @bar, 'TEST';print join('|', @bar[0..3]), "\n"; EXPECTfoo|fee|fie|foe########package TH;sub TIEHASH { bless {}, TH }sub STORE { eval { print "@_[1,2]\n" }; die "bar\n" }tie %h, TH;eval { $h{A} = 1; print "never\n"; };print $@;eval { $h{B} = 2; };print $@;EXPECTA 1barB 2bar########sub n { 0 }sub f { my $x = shift; d(); }f(n());f();sub d { my $i = 0; my @a; while (do { { package DB; @a = caller($i++) } } ) { @a = @DB::args; for (@a) { print "$_\n"; $_ = '' } }}EXPECT0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -