UNIX下perl实现代码

源代码在线查看: sprintf.t

软件大小: 6493 K
上传用户: heyuyutu
关键词: UNIX perl 代码
下载地址: 免注册下载 普通下载 VIP

相关代码

				#!./perl								# Tests sprintf, excluding handling of 64-bit integers or long				# doubles (if supported), of machine-specific short and long				# integers, machine-specific floating point exceptions (infinity,				# not-a-number ...), of the effects of locale, and of features				# specific to multi-byte characters (under use utf8 and such).								BEGIN {				    chdir 't' if -d 't';				    @INC = '../lib';				}   				use warnings;								while () {				    s/^\s*>//; s/				    push @tests, [split(//, $_, 4)]; 				}								print '1..', scalar @tests, "\n";								$SIG{__WARN__} = sub {				    if ($_[0] =~ /^Invalid conversion/) {					$w = ' INVALID'				    } else {					warn @_;				    }				};								for ($i = 1; @tests; $i++) {				    ($template, $data, $result, $comment) = @{shift @tests};				    $evalData = eval $data;				    $w = undef;				    $x = sprintf(">$template				                 defined @$evalData ? @$evalData : $evalData);				    substr($x, -1, 0) = $w if $w;				    # $x may have 3 exponent digits, not 2				    my $y = $x;				    if ($y =~ s/([Ee][-+])0(\d)/$1$2/) {				        # if result is left-adjusted, append extra space				        if ($template =~ /%\+?\-/ and $result =~ / $/) {					    $y =~ s/					}				        # if result is zero-filled, add extra zero					elsif ($template =~ /%\+?0/ and $result =~ /^0/) {					    $y =~ s/^>0/>00/;					}				        # if result is right-adjusted, prepend extra space					elsif ($result =~ /^ /) {					    $y =~ s/^>/> /;					}				    }								    if ($x eq ">$result				        print "ok $i\n";				    }				    elsif ($y eq ">$result				    {				# three-digit exponent						print("ok $i # >$result< $x three-digit exponent accepted\n");				    }					elsif ($result =~ /[-+]\d{3}$/ &&						   # Suppress tests with modulo of exponent >= 100 on platforms						   # which can't handle such magnitudes (or where we can't tell).						   ((!eval {require POSIX}) || # Costly: only do this if we must!							(length(&POSIX::DBL_MAX) - rindex(&POSIX::DBL_MAX, '+')) == 3))					{						print("ok $i # >$template< >$data< >$result							  " Suppressed: exponent out of range?\n") 					}				    else {					$y = ($x eq $y ? "" : " => $y");					print("not ok $i >$template< >$data< >$result< $x$y",					    $comment ? " # $comment\n" : "\n");				    }				}								# In each of the the following lines, there are three required fields:				# printf template, data to be formatted (as a Perl expression), and				# expected result of formatting.  An optional fourth field can contain				# a comment.  Each field is delimited by a starting '>' and a				# finishing '				# not part of the field.  If formatting requires more than one data				# item (for example, if variable field widths are used), the Perl data				# expression should return a reference to an array having the requisite				# number of elements.  Even so, subterfuge is sometimes required: see				# tests for %n and %p.				#				# The following tests are not currently run, for the reasons stated:								=pod								=begin problematic								>%.0f<      >-0.1<        >-0<  >C library bug: no minus on VMS, HP-UX				>%.0f<      >1.5<         >2<   >Standard vague: no rounding rules				>%.0f<      >2.5<         >2<   >Standard vague: no rounding rules								=end problematic								=cut								# template    data          result				__END__				>%6. 6s<    >''<          >%6. 6s INVALID< >(See use of $w in code above)				>%6 .6s<    >''<          >%6 .6s INVALID				>%6.6 s<    >''<          >%6.6 s INVALID				>%A<        >''<          >%A INVALID				>%B<        >''<          >%B INVALID				>%C<        >''<          >%C INVALID				>%D<        >0x7fffffff<  >2147483647<     >Synonym for %ld				>%E<        >123456.789<  >1.234568E+05<   >Like %e, but using upper-case "E"				>%F<        >123456.789<  >123456.789000<  >Synonym for %f				>%G<        >1234567.89<  >1.23457E+06<    >Like %g, but using upper-case "E"				>%G<        >1234567e96<  >1.23457E+102				>%G<        >.1234567e-101< >1.23457E-102				>%G<        >12345.6789<  >12345.7				>%H<        >''<          >%H INVALID				>%I<        >''<          >%I INVALID				>%J<        >''<          >%J INVALID				>%K<        >''<          >%K INVALID				>%L<        >''<          >%L INVALID				>%M<        >''<          >%M INVALID				>%N<        >''<          >%N INVALID				>%O<        >2**32-1<     >37777777777<    >Synonum for %lo				>%P<        >''<          >%P INVALID				>%Q<        >''<          >%Q INVALID				>%R<        >''<          >%R INVALID				>%S<        >''<          >%S INVALID				>%T<        >''<          >%T INVALID				>%U<        >2**32-1<     >4294967295<     >Synonum for %lu				>%V<        >''<          >%V INVALID				>%W<        >''<          >%W INVALID				>%X<        >2**32-1<     >FFFFFFFF<       >Like %x, but with u/c letters				>%#X<       >2**32-1<     >0XFFFFFFFF				>%Y<        >''<          >%Y INVALID				>%Z<        >''<          >%Z INVALID				>%a<        >''<          >%a INVALID				>%b<        >2**32-1<     >11111111111111111111111111111111				>%+b<       >2**32-1<     >11111111111111111111111111111111				>%#b<       >2**32-1<     >0b11111111111111111111111111111111				>%34b<      >2**32-1<     >  11111111111111111111111111111111				>%034b<     >2**32-1<     >0011111111111111111111111111111111				>%-34b<     >2**32-1<     >11111111111111111111111111111111  				>%-034b<    >2**32-1<     >11111111111111111111111111111111  				>%c<        >ord('A')<    >A				>%10c<      >ord('A')<    >         A				>%#10c<     >ord('A')<    >         A<     ># modifier: no effect				>%010c<     >ord('A')<    >000000000A				>%10lc<     >ord('A')<    >         A<     >l modifier: no effect				>%10hc<     >ord('A')<    >         A<     >h modifier: no effect				>%10.5c<    >ord('A')<    >         A<     >precision: no effect				>%-10c<     >ord('A')<    >A         				>%d<        >123456.789<  >123456				>%d<        >-123456.789< >-123456				>%d<        >0<           >0				>%+d<       >0<           >+0				>%0d<       >0<           >0				>%.0d<      >0<           >				>%+.0d<     >0<           >+				>%.0d<      >1<           >1				>%d<        >1<           >1				>%+d<       >1<           >+1				>%#3.2d<    >1<           > 01<            ># modifier: no effect				>%3.2d<     >1<           > 01				>%03.2d<    >1<           >001				>%-3.2d<    >1<           >01 				>%-03.2d<   >1<           >01 <            >zero pad + left just.: no effect				>%d<        >-1<          >-1				>%+d<       >-1<          >-1				>%hd<       >1<           >1<              >More extensive testing of				>%ld<       >1<           >1<              >length modifiers would be				>%Vd<       >1<           >1<              >platform-specific				>%vd<       >chr(1)<      >1				>%+vd<      >chr(1)<      >+1				>%#vd<      >chr(1)<      >1				>%vd<       >"\01\02\03"< >1.2.3				>%v.3d<     >"\01\02\03"< >001.002.003				>%v03d<     >"\01\02\03"< >001.002.003				>%v-3d<     >"\01\02\03"< >1  .2  .3  				>%v+-3d<    >"\01\02\03"< >+1 .2  .3  				>%v4.3d<    >"\01\02\03"< > 001. 002. 003				>%v04.3d<   >"\01\02\03"< >0001.0002.0003				>%*v02d<    >['-', "\0\7\14"]< >00-07-12				>%v.*d<     >[3, "\01\02\03"]< >001.002.003				>%v0*d<     >[3, "\01\02\03"]< >001.002.003				>%v-*d<     >[3, "\01\02\03"]< >1  .2  .3  				>%v+-*d<    >[3, "\01\02\03"]< >+1 .2  .3  				>%v*.*d<    >[4, 3, "\01\02\03"]< > 001. 002. 003				>%v0*.*d<   >[4, 3, "\01\02\03"]< >0001.0002.0003				>%*v0*d<    >['-', 2, "\0\7\13"]< >00-07-11				>%e<        >1234.875<    >1.234875e+03				>%e<        >0.000012345< >1.234500e-05				>%e<        >1234567E96<  >1.234567e+102				>%e<        >0<           >0.000000e+00				>%e<        >.1234567E-101< >1.234567e-102				>%+e<       >1234.875<    >+1.234875e+03				>%#e<       >1234.875<    >1.234875e+03				>%e<        >-1234.875<   >-1.234875e+03				>%+e<       >-1234.875<   >-1.234875e+03				>%#e<       >-1234.875<   >-1.234875e+03				>%.0e<      >1234.875<    >1e+03				>%#.0e<     >1234.875<    >1.e+03				>%.*e<      >[0, 1234.875]< >1e+03				>%.1e<      >1234.875<    >1.2e+03				>%-12.4e<   >1234.875<    >1.2349e+03  				>%12.4e<    >1234.875<    >  1.2349e+03				>%+-12.4e<  >1234.875<    >+1.2349e+03 				>%+12.4e<   >1234.875<    > +1.2349e+03				>%+-12.4e<  >-1234.875<   >-1.2349e+03 				>%+12.4e<   >-1234.875<   > -1.2349e+03				>%f<        >1234.875<    >1234.875000				>%+f<       >1234.875<    >+1234.875000				>%#f<       >1234.875<    >1234.875000				>%f<        >-1234.875<   >-1234.875000				>%+f<       >-1234.875<   >-1234.875000				>%#f<       >-1234.875<   >-1234.875000				>%6f<       >1234.875<    >1234.875000				>%*f<       >[6, 1234.875]< >1234.875000				>%.0f<      >1234.875<    >1235				>%.1f<      >1234.875<    >1234.9				>%-8.1f<    >1234.875<    >1234.9  				>%8.1f<     >1234.875<    >  1234.9				>%+-8.1f<   >1234.875<    >+1234.9 				>%+8.1f<    >1234.875<    > +1234.9				>%+-8.1f<   >-1234.875<   >-1234.9 				>%+8.1f<    >-1234.875<   > -1234.9				>%*.*f<     >[5, 2, 12.3456]< >12.35				>%f<        >0<           >0.000000				>%.0f<      >0<           >0				>%.0f<      >2**38<       >274877906944<   >Should have exact int'l rep'n				>%.0f<      >0.1<         >0				>%.0f<      >0.6<         >1<              >Known to fail with sfio and (irix|nonstop-ux|powerux)				>%.0f<      >-0.6<        >-1<             >Known to fail with sfio and (irix|nonstop-ux|powerux)				>%.0f<      >1<           >1				>%#.0f<     >1<           >1.				>%g<        >12345.6789<  >12345.7				>%+g<       >12345.6789<  >+12345.7				>%#g<       >12345.6789<  >12345.7				>%.0g<      >12345.6789<  >1e+04				>%#.0g<     >12345.6789<  >1.e+04				>%.2g<      >12345.6789<  >1.2e+04				>%.*g<      >[2, 12345.6789]< >1.2e+04				>%.9g<      >12345.6789<  >12345.6789				>%12.9g<    >12345.6789<  >  12345.6789				>%012.9g<   >12345.6789<  >0012345.6789				>%-12.9g<   >12345.6789<  >12345.6789  				>%*.*g<     >[-12, 9, 12345.6789]< >12345.6789  				>%-012.9g<  >12345.6789<  >12345.6789  				>%g<        >-12345.6789< >-12345.7				>%+g<       >-12345.6789< >-12345.7				>%g<        >1234567.89<  >1.23457e+06				>%+g<       >1234567.89<  >+1.23457e+06				>%#g<       >1234567.89<  >1.23457e+06				>%g<        >-1234567.89< >-1.23457e+06				>%+g<       >-1234567.89< >-1.23457e+06				>%#g<       >-1234567.89< >-1.23457e+06				>%g<        >0.00012345<  >0.00012345				>%g<        >0.000012345< >1.2345e-05				>%g<        >1234567E96<  >1.23457e+102				>%g<        >.1234567E-101< >1.23457e-102				>%g<        >0<           >0				>%13g<      >1234567.89<  >  1.23457e+06				>%+13g<     >1234567.89<  > +1.23457e+06				>%013g<      >1234567.89< >001.23457e+06				>%-13g<      >1234567.89< >1.23457e+06  				>%h<        >''<          >%h INVALID				>%i<        >123456.789<  >123456<         >Synonym for %d				>%j<        >''<          >%j INVALID				>%k<        >''<          >%k INVALID				>%l<        >''<          >%l INVALID				>%m<        >''<          >%m INVALID				>%s< >sprintf('%%n%n %d', $n, $n)< >%n 2< >Slight sneakiness to test %n				>%o<        >2**32-1<     >37777777777				>%+o<       >2**32-1<     >37777777777				>%#o<       >2**32-1<     >037777777777				>%d< >$p=sprintf('%p',$p);$p=~/^[0-9a-f]+$/< >1< >Coarse hack: hex from %p?				>%#p<       >''<          >%#p INVALID				>%q<        >''<          >%q INVALID				>%r<        >''<          >%r INVALID				>%s<        >'string'<    >string				>%10s<      >'string'<    >    string				>%+10s<     >'string'<    >    string				>%#10s<     >'string'<    >    string				>%010s<     >'string'<    >0000string				>%0*s<      >[10, 'string']< >0000string				>%-10s<     >'string'<    >string    				>%3s<       >'string'<    >string				>%.3s<      >'string'<    >str				>%.*s<      >[3, 'string']< >str				>%t<        >''<          >%t INVALID				>%u<        >2**32-1<     >4294967295				>%+u<       >2**32-1<     >4294967295				>%#u<       >2**32-1<     >4294967295				>%12u<      >2**32-1<     >  4294967295				>%012u<     >2**32-1<     >004294967295				>%-12u<     >2**32-1<     >4294967295  				>%-012u<    >2**32-1<     >4294967295  				>%v<        >''<          >%v INVALID				>%w<        >''<          >%w INVALID				>%x<        >2**32-1<     >ffffffff				>%+x<       >2**32-1<     >ffffffff				>%#x<       >2**32-1<     >0xffffffff				>%10x<      >2**32-1<     >  ffffffff				>%010x<     >2**32-1<     >00ffffffff				>%-10x<     >2**32-1<     >ffffffff  				>%-010x<    >2**32-1<     >ffffffff  				>%0-10x<    >2**32-1<     >ffffffff  				>%0*x<      >[-10, ,2**32-1]< >ffffffff  				>%y<        >''<          >%y INVALID				>%z<        >''<          >%z INVALID							

相关资源