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

📄 f_sort.t

📁 source of perl for linux application,
💻 T
📖 第 1 页 / 共 2 页
字号:
#!perlBEGIN {    if ($ENV{PERL_CORE}){	chdir('t') if -d 't';	@INC = ('.', '../lib', '../ext/B/t');    } else {	unshift @INC, 't';	push @INC, "../../t";    }    require Config;    if (($Config::Config{'extensions'} !~ /\bB\b/) ){        print "1..0 # Skip -- Perl configured without B module\n";        exit 0;    }    if (!$Config::Config{useperlio}) {        print "1..0 # Skip -- need perlio to walk the optree\n";        exit 0;    }    # require q(test.pl); # now done by OptreeCheck;}use OptreeCheck;plan tests => 20;=head1 f_sort.tCode test snippets here are adapted from `perldoc -f map`Due to a bleadperl optimization (Dave Mitchell, circa apr 04), the(map|grep)(start|while) opcodes have different flags in 5.9, theirprivate flags /1, /2 are gone in blead (for the cases covered)When the optree stuff was integrated into 5.8.6, these tests failed,and were todo'd.  Theyre now done, by version-specific tweaking inmkCheckRex(), therefore the skip is removed too.=head1 Test Notes# chunk: #!perl#examples poached from perldoc -f sortNOTE: name is no longer a required arg for checkOptree, as label issynthesized out of others.  HOWEVER, if the test-code has newlines init, the label must be overridden by an explicit name.This is because t/TEST is quite particular about the test output itprocesses, and multi-line labels violate its 1-line-per-testexpectations.=for gentest# chunk: # sort lexically@articles = sort @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 545 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t4] lK/1# 6  <@> sort lK# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t5] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 545 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t2] lK/1# 6  <@> sort lK# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t3] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # same thing, but with explicit sort routine@articles = sort {$a cmp $b} @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort {$a cmp $b} @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t7] lK/1# 6  <@> sort lK# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t3] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t3] lK/1# 6  <@> sort lK# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t2] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # now case-insensitively@articles = sort {uc($a) cmp uc($b)} @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort {uc($a) cmp uc($b)} @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t9] lK/1# 6  <@> sort lKS*# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t10] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t5] lK/1# 6  <@> sort lKS*# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t6] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # same thing in reversed order@articles = sort {$b cmp $a} @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort {$b cmp $a} @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t7] lK/1# 6  <@> sort lK/DESC# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t3] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t3] lK/1# 6  <@> sort lK/DESC# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t2] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # sort numerically ascending@articles = sort {$a <=> $b} @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort {$a <=> $b} @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t7] lK/1# 6  <@> sort lK/NUM# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t3] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t3] lK/1# 6  <@> sort lK/NUM# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t2] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # sort numerically descending@articles = sort {$b <=> $a} @files;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@articles = sort {$b <=> $a} @files; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 587 (eval 26):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*files] s# 5  <1> rv2av[t7] lK/1# 6  <@> sort lK/DESC,NUM# 7  <0> pushmark s# 8  <#> gv[*articles] s# 9  <1> rv2av[t2] lKRM*/1# a  <2> aassign[t3] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*files) s# 5  <1> rv2av[t3] lK/1# 6  <@> sort lK/DESC,NUM# 7  <0> pushmark s# 8  <$> gv(*articles) s# 9  <1> rv2av[t1] lKRM*/1# a  <2> aassign[t2] KS/COMMON# b  <1> leavesub[1 ref] K/REFC,1EONT_EONT=for gentest# chunk: # this sorts the %age hash by value instead of key# using an in-line function@eldest = sort { $age{$b} <=> $age{$a} } keys %age;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{@eldest = sort { $age{$b} <=> $age{$a} } keys %age; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 592 (eval 28):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <#> gv[*age] s# 5  <1> rv2hv[t9] lKRM/1# 6  <1> keys[t10] lK/1# 7  <@> sort lKS*# 8  <0> pushmark s# 9  <#> gv[*eldest] s# a  <1> rv2av[t2] lKRM*/1# b  <2> aassign[t11] KS/COMMON# c  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> gv(*age) s# 5  <1> rv2hv[t3] lKRM/1# 6  <1> keys[t4] lK/1# 7  <@> sort lKS*# 8  <0> pushmark s# 9  <$> gv(*eldest) s# a  <1> rv2av[t1] lKRM*/1# b  <2> aassign[t5] KS/COMMON# c  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # sort using explicit subroutine namesub byage {    $age{$a} <=> $age{$b};  # presuming numeric}@sortedclass = sort byage @class;=cutcheckOptree(note   => q{},	    bcopts => q{-exec},	    code   => q{sub byage { $age{$a} <=> $age{$b}; } @sortedclass = sort byage @class; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 597 (eval 30):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> const[PV "byage"] s/BARE# 5  <#> gv[*class] s# 6  <1> rv2av[t4] lK/1# 7  <@> sort lKS# 8  <0> pushmark s# 9  <#> gv[*sortedclass] s# a  <1> rv2av[t2] lKRM*/1# b  <2> aassign[t5] KS/COMMON# c  <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 546 (eval 15):1) v# 2  <0> pushmark s# 3  <0> pushmark s# 4  <$> const(PV "byage") s/BARE# 5  <$> gv(*class) s# 6  <1> rv2av[t2] lK/1# 7  <@> sort lKS# 8  <0> pushmark s# 9  <$> gv(*sortedclass) s# a  <1> rv2av[t1] lKRM*/1# b  <2> aassign[t3] KS/COMMON# c  <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: sub backwards { $b cmp $a }@harry  = qw(dog cat x Cain Abel);@george = qw(gone chased yz Punished Axed);print sort @harry;# prints AbelCaincatdogxprint sort backwards @harry;# prints xdogcatCainAbelprint sort @george, 'to', @harry;# prints AbelAxedCainPunishedcatchaseddoggonetoxyz=cutcheckOptree(name   => q{sort USERSUB LIST },	    bcopts => q{-exec},	    code   => q{sub backwards { $b cmp $a }			@harry = qw(dog cat x Cain Abel);			@george = qw(gone chased yz Punished Axed);			print sort @harry; print sort backwards @harry; 			print sort @george, 'to', @harry; },	    expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');# 1  <;> nextstate(main 602 (eval 32):2) v# 2  <0> pushmark s# 3  <$> const[PV "dog"] s# 4  <$> const[PV "cat"] s# 5  <$> const[PV "x"] s# 6  <$> const[PV "Cain"] s# 7  <$> const[PV "Abel"] s# 8  <0> pushmark s# 9  <#> gv[*harry] s# a  <1> rv2av[t2] lKRM*/1# b  <2> aassign[t3] vKS# c  <;> nextstate(main 602 (eval 32):3) v# d  <0> pushmark s# e  <$> const[PV "gone"] s# f  <$> const[PV "chased"] s# g  <$> const[PV "yz"] s# h  <$> const[PV "Punished"] s# i  <$> const[PV "Axed"] s# j  <0> pushmark s# k  <#> gv[*george] s# l  <1> rv2av[t5] lKRM*/1# m  <2> aassign[t6] vKS# n  <;> nextstate(main 602 (eval 32):4) v:{# o  <0> pushmark s# p  <0> pushmark s# q  <#> gv[*harry] s# r  <1> rv2av[t8] lK/1# s  <@> sort lK# t  <@> print vK# u  <;> nextstate(main 602 (eval 32):4) v:{# v  <0> pushmark s# w  <0> pushmark s# x  <$> const[PV "backwards"] s/BARE# y  <#> gv[*harry] s# z  <1> rv2av[t10] lK/1# 10 <@> sort lKS# 11 <@> print vK# 12 <;> nextstate(main 602 (eval 32):5) v:{# 13 <0> pushmark s# 14 <0> pushmark s# 15 <#> gv[*george] s# 16 <1> rv2av[t12] lK/1# 17 <$> const[PV "to"] s# 18 <#> gv[*harry] s# 19 <1> rv2av[t14] lK/1# 1a <@> sort lK# 1b <@> print sK# 1c <1> leavesub[1 ref] K/REFC,1EOT_EOT# 1  <;> nextstate(main 602 (eval 32):2) v# 2  <0> pushmark s# 3  <$> const(PV "dog") s# 4  <$> const(PV "cat") s# 5  <$> const(PV "x") s# 6  <$> const(PV "Cain") s# 7  <$> const(PV "Abel") s# 8  <0> pushmark s# 9  <$> gv(*harry) s# a  <1> rv2av[t1] lKRM*/1# b  <2> aassign[t2] vKS# c  <;> nextstate(main 602 (eval 32):3) v# d  <0> pushmark s# e  <$> const(PV "gone") s# f  <$> const(PV "chased") s# g  <$> const(PV "yz") s# h  <$> const(PV "Punished") s# i  <$> const(PV "Axed") s# j  <0> pushmark s# k  <$> gv(*george) s# l  <1> rv2av[t3] lKRM*/1# m  <2> aassign[t4] vKS# n  <;> nextstate(main 602 (eval 32):4) v:{# o  <0> pushmark s# p  <0> pushmark s# q  <$> gv(*harry) s# r  <1> rv2av[t5] lK/1# s  <@> sort lK# t  <@> print vK# u  <;> nextstate(main 602 (eval 32):4) v:{# v  <0> pushmark s# w  <0> pushmark s# x  <$> const(PV "backwards") s/BARE# y  <$> gv(*harry) s# z  <1> rv2av[t6] lK/1# 10 <@> sort lKS# 11 <@> print vK# 12 <;> nextstate(main 602 (eval 32):5) v:{# 13 <0> pushmark s# 14 <0> pushmark s# 15 <$> gv(*george) s# 16 <1> rv2av[t7] lK/1# 17 <$> const(PV "to") s# 18 <$> gv(*harry) s# 19 <1> rv2av[t8] lK/1# 1a <@> sort lK# 1b <@> print sK# 1c <1> leavesub[1 ref] K/REFC,1EONT_EONT    =for gentest# chunk: # inefficiently sort by descending numeric compare using# the first integer after the first = sign, or the# whole record case-insensitively otherwise@new = @old[ sort {    $nums[$b] <=> $nums[$a]	|| $caps[$a] cmp $caps[$b]	} 0..$#old  ];=cut=for gentest# chunk: # same thing, but without any temps

⌨️ 快捷键说明

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