⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 method.t

📁 UNIX下perl实现代码
💻 T
字号:
#!./perl## test method calls and autoloading.#BEGIN {    chdir 't' if -d 't';    @INC = '../lib';}print "1..53\n";@A::ISA = 'B';@B::ISA = 'C';sub C::d {"C::d"}sub D::d {"D::d"}my $cnt = 0;sub test {  print "# got `$_[0]', expected `$_[1]'\nnot " unless $_[0] eq $_[1];   # print "not " unless shift eq shift;  print "ok ", ++$cnt, "\n"}# First, some basic checks of method-calling syntax:$obj = bless [], "Pack";sub Pack::method { shift; join(",", "method", @_) }$mname = "method";test(Pack->method("a","b","c"), "method,a,b,c");test(Pack->$mname("a","b","c"), "method,a,b,c");test(method Pack ("a","b","c"), "method,a,b,c");test((method Pack "a","b","c"), "method,a,b,c");test(Pack->method(), "method");test(Pack->$mname(), "method");test(method Pack (), "method");test(Pack->method, "method");test(Pack->$mname, "method");test(method Pack, "method");test($obj->method("a","b","c"), "method,a,b,c");test($obj->$mname("a","b","c"), "method,a,b,c");test((method $obj ("a","b","c")), "method,a,b,c");test((method $obj "a","b","c"), "method,a,b,c");test($obj->method(), "method");test($obj->$mname(), "method");test((method $obj ()), "method");test($obj->method, "method");test($obj->$mname, "method");test(method $obj, "method");test( A->d, "C::d");		# Update hash table;*B::d = \&D::d;			# Import now.test (A->d, "D::d");		# Update hash table;{    local @A::ISA = qw(C);	# Update hash table with split() assignment    test (A->d, "C::d");    $#A::ISA = -1;    test (eval { A->d } || "fail", "fail");}test (A->d, "D::d");{    local *B::d;    eval 'sub B::d {"B::d1"}';	# Import now.    test (A->d, "B::d1");	# Update hash table;    undef &B::d;    test ((eval { A->d }, ($@ =~ /Undefined subroutine/)), 1);}test (A->d, "D::d");		# Back to previous stateeval 'sub B::d {"B::d2"}';	# Import now.test (A->d, "B::d2");		# Update hash table;# What follows is hardly guarantied to work, since the names in scripts# are already linked to "pruned" globs. Say, `undef &B::d' if it were# after `delete $B::{d}; sub B::d {}' would reach an old subroutine.undef &B::d;delete $B::{d};test (A->d, "C::d");		# Update hash table;eval 'sub B::d {"B::d3"}';	# Import now.test (A->d, "B::d3");		# Update hash table;delete $B::{d};*dummy::dummy = sub {};		# Mark as updatedtest (A->d, "C::d");eval 'sub B::d {"B::d4"}';	# Import now.test (A->d, "B::d4");		# Update hash table;delete $B::{d};			# Should work without any help tootest (A->d, "C::d");{    local *C::d;    test (eval { A->d } || "nope", "nope");}test (A->d, "C::d");*A::x = *A::d;			# See if cache incorrectly follows synonymsA->d;test (eval { A->x } || "nope", "nope");eval <<'EOF';sub C::e;BEGIN { *B::e = \&C::e }	# Shouldn't prevent AUTOLOAD in original pkgsub Y::f;$counter = 0;@X::ISA = 'Y';@Y::ISA = 'B';sub B::AUTOLOAD {  my $c = ++$counter;  my $method = $B::AUTOLOAD;   my $msg = "B: In $method, $c";  eval "sub $method { \$msg }";  goto &$method;}sub C::AUTOLOAD {  my $c = ++$counter;  my $method = $C::AUTOLOAD;   my $msg = "C: In $method, $c";  eval "sub $method { \$msg }";  goto &$method;}EOFtest(A->e(), "C: In C::e, 1");	# We get a correct autoloadtest(A->e(), "C: In C::e, 1");	# Which stickstest(A->ee(), "B: In A::ee, 2"); # We get a generic autoload, method in toptest(A->ee(), "B: In A::ee, 2"); # Which stickstest(Y->f(), "B: In Y::f, 3");	# We vivify a correct methodtest(Y->f(), "B: In Y::f, 3");	# Which sticks# This test is not intended to be reasonable. It is here just to let you# know that you broke some old construction. Feel free to rewrite the test# if your patch breaks it.*B::AUTOLOAD = sub {  my $c = ++$counter;  my $method = $AUTOLOAD;   *$AUTOLOAD = sub { "new B: In $method, $c" };  goto &$AUTOLOAD;};test(A->eee(), "new B: In A::eee, 4");	# We get a correct $autoloadtest(A->eee(), "new B: In A::eee, 4");	# Which sticks# this test added due to bug discoverytest(defined(@{"unknown_package::ISA"}) ? "defined" : "undefined", "undefined");# test that failed subroutine calls don't affect method calls{    package A1;    sub foo { "foo" }    package A2;    @ISA = 'A1';    package main;    test(A2->foo(), "foo");    test(do { eval 'A2::foo()'; $@ ? 1 : 0}, 1);    test(A2->foo(), "foo");}{    test(do { use Config; eval 'Config->foo()';	      $@ =~ /^\QCan't locate object method "foo" via package "Config" at/ ? 1 : $@}, 1);    test(do { use Config; eval '$d = bless {}, "Config"; $d->foo()';	      $@ =~ /^\QCan't locate object method "foo" via package "Config" at/ ? 1 : $@}, 1);}test(do { eval 'E->foo()';	  $@ =~ /^\QCan't locate object method "foo" via package "E" (perhaps / ? 1 : $@}, 1);test(do { eval '$e = bless {}, "E"; $e->foo()';	  $@ =~ /^\QCan't locate object method "foo" via package "E" (perhaps / ? 1 : $@}, 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -