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

📄 locale.t

📁 UNIX下perl实现代码
💻 T
📖 第 1 页 / 共 2 页
字号:
	    }	}	foreach my $lang (split(/ /, $language_codes)) {	    trylocale($lang);	    foreach my $country (split(/ /, $country_codes)) {		my $lc = "${lang}_${country}";		trylocale($lc);		foreach my $enc (@enc) {		    trylocale("$lc.$enc");		}		my $lC = "${lang}_\U${country}";		trylocale($lC);		foreach my $enc (@enc) {		    trylocale("$lC.$enc");		}	    }	}    }}setlocale(LC_ALL, "C");sub utf8locale { $_[0] =~ /utf-?8/i }@Locale = sort @Locale;debug "# Locales = @Locale\n";my %Problem;my %Okay;my %Testing;my @Neoalpha;my %Neoalpha;sub tryneoalpha {    my ($Locale, $i, $test) = @_;    unless ($test) {	$Problem{$i}{$Locale} = 1;	debug "# failed $i with locale '$Locale'\n";    } else {	push @{$Okay{$i}}, $Locale;    }}foreach $Locale (@Locale) {    debug "# Locale = $Locale\n";    @Alnum_ = getalnum_();    debug "# w = ", join("",@Alnum_), "\n";    unless (setlocale(LC_ALL, $Locale)) {	foreach (99..103) {	    $Problem{$_}{$Locale} = -1;	}	next;    }    # Sieve the uppercase and the lowercase.        my %UPPER = ();    my %lower = ();    my %BoThCaSe = ();    for (@Alnum_) {	if (/[^\d_]/) { # skip digits and the _	    if (uc($_) eq $_) {		$UPPER{$_} = $_;	    }	    if (lc($_) eq $_) {		$lower{$_} = $_;	    }	}    }    foreach (keys %UPPER) {	$BoThCaSe{$_}++ if exists $lower{$_};    }    foreach (keys %lower) {	$BoThCaSe{$_}++ if exists $UPPER{$_};    }    foreach (keys %BoThCaSe) {	delete $UPPER{$_};	delete $lower{$_};    }    debug "# UPPER    = ", join("", sort keys %UPPER   ), "\n";    debug "# lower    = ", join("", sort keys %lower   ), "\n";    debug "# BoThCaSe = ", join("", sort keys %BoThCaSe), "\n";    # Find the alphabets that are not alphabets in the default locale.    {	no locale;    	@Neoalpha = ();	for (keys %UPPER, keys %lower) {	    push(@Neoalpha, $_) if (/\W/);	    $Neoalpha{$_} = $_;	}    }    @Neoalpha = sort @Neoalpha;    debug "# Neoalpha = ", join("",@Neoalpha), "\n";    if (@Neoalpha == 0) {	# If we have no Neoalphas the remaining tests are no-ops.	debug "# no Neoalpha, skipping tests 99..102 for locale '$Locale'\n";	foreach (99..102) {	    push @{$Okay{$_}}, $Locale;	}    } else {	# Test \w.    	if (utf8locale($Locale)) {	    # Until the polymorphic regexen arrive.	    debug "# skipping UTF-8 locale '$Locale'\n";	} else {	    my $word = join('', @Neoalpha);	    $word =~ /^(\w+)$/;	    tryneoalpha($Locale, 99, $1 eq $word);	}	# Cross-check the whole 8-bit character set.	for (map { chr } 0..255) {	    tryneoalpha($Locale, 100,			(/\w/ xor /\W/) ||			(/\d/ xor /\D/) ||			(/\s/ xor /\S/));	}	# Test for read-only scalars' locale vs non-locale comparisons.	{	    no locale;	    $a = "qwerty";	    {		use locale;		tryneoalpha($Locale, 101, ($a cmp "qwerty") == 0);	    }	}	{	    my ($from, $to, $lesser, $greater,		@test, %test, $test, $yes, $no, $sign);	    for (0..9) {		# Select a slice.		$from = int(($_*@Alnum_)/10);		$to = $from + int(@Alnum_/10);		$to = $#Alnum_ if ($to > $#Alnum_);		$lesser  = join('', @Alnum_[$from..$to]);		# Select a slice one character on.		$from++; $to++;		$to = $#Alnum_ if ($to > $#Alnum_);		$greater = join('', @Alnum_[$from..$to]);		($yes, $no, $sign) = ($lesser lt $greater				      ? ("    ", "not ", 1)				      : ("not ", "    ", -1));		# all these tests should FAIL (return 0).		# Exact lt or gt cannot be tested because		# in some locales, say, eacute and E may test equal.		@test = 		    (		     $no.'    ($lesser  le $greater)',  # 1		     'not      ($lesser  ne $greater)', # 2		     '         ($lesser  eq $greater)', # 3		     $yes.'    ($lesser  ge $greater)', # 4		     $yes.'    ($lesser  ge $greater)', # 5		     $yes.'    ($greater le $lesser )', # 7		     'not      ($greater ne $lesser )', # 8		     '         ($greater eq $lesser )', # 9		     $no.'     ($greater ge $lesser )', # 10		     'not (($lesser cmp $greater) == -$sign)' # 12		     );		@test{@test} = 0 x @test;		$test = 0;		for my $ti (@test) {		    $test{$ti} = eval $ti;		    $test ||= $test{$ti}		}		tryneoalpha($Locale, 102, $test == 0);		if ($test) {		    debug "# lesser  = '$lesser'\n";		    debug "# greater = '$greater'\n";		    debug "# lesser cmp greater = ",		          $lesser cmp $greater, "\n";		    debug "# greater cmp lesser = ",		          $greater cmp $lesser, "\n";		    debug "# (greater) from = $from, to = $to\n";		    for my $ti (@test) {			debugf("# %-40s %-4s", $ti,			       $test{$ti} ? 'FAIL' : 'ok');			if ($ti =~ /\(\.*(\$.+ +cmp +\$[^\)]+)\.*\)/) {			    debugf("(%s == %4d)", $1, eval $1);			}			debug "\n#";		    }		    last;		}	    }	}    }    use locale;    my ($x, $y) = (1.23, 1.23);    my $a = "$x";    printf ''; # printf used to reset locale to "C"    my $b = "$y";    debug "# 103..107: a = $a, b = $b, Locale = $Locale\n";    tryneoalpha($Locale, 103, $a eq $b);    my $c = "$x";    my $z = sprintf ''; # sprintf used to reset locale to "C"    my $d = "$y";    debug "# 104..107: c = $c, d = $d, Locale = $Locale\n";    tryneoalpha($Locale, 104, $c eq $d);     {	use warnings;	my $w = 0;	local $SIG{__WARN__} = sub { $w++ };	# the == (among other ops) used to warn for locales	# that had something else than "." as the radix character	tryneoalpha($Locale, 105, $c == 1.23);	tryneoalpha($Locale, 106, $c == $x);	tryneoalpha($Locale, 107, $c == $d);	{	    no locale;		    my $e = "$x";	    debug "# 108..110: e = $e, Locale = $Locale\n";	    tryneoalpha($Locale, 108, $e == 1.23);	    tryneoalpha($Locale, 109, $e == $x);	    	    tryneoalpha($Locale, 110, $e == $c);	}		tryneoalpha($Locale, 111, $w == 0);	my $f = "1.23";	debug "# 112..114: f = $f, locale = $Locale\n";	tryneoalpha($Locale, 112, $f == 1.23);	tryneoalpha($Locale, 113, $f == $x);		tryneoalpha($Locale, 114, $f == $c);    }    # Does taking lc separately differ from taking    # the lc "in-line"?  (This was the bug 19990704.002, change #3568.)    # The bug was in the caching of the 'o'-magic.    {	use locale;	sub lcA {	    my $lc0 = lc $_[0];	    my $lc1 = lc $_[1];	    return $lc0 cmp $lc1;	}        sub lcB {	    return lc($_[0]) cmp lc($_[1]);	}        my $x = "ab";        my $y = "aa";        my $z = "AB";        tryneoalpha($Locale, 115,		    lcA($x, $y) == 1 && lcB($x, $y) == 1 ||		    lcA($x, $z) == 0 && lcB($x, $z) == 0);    }    # Does lc of an UPPER (if different from the UPPER) match    # case-insensitively the UPPER, and does the UPPER match    # case-insensitively the lc of the UPPER.  And vice versa.    if (utf8locale($Locale)) {        # Until the polymorphic regexen arrive.        debug "# skipping UTF-8 locale '$Locale'\n";    } else {	use locale;	my @f = ();	foreach my $x (keys %UPPER) {	    my $y = lc $x;	    next unless uc $y eq $x;	    push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;	}	foreach my $x (keys %lower) {	    my $y = uc $x;	    next unless lc $y eq $x;	    push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;	}	tryneoalpha($Locale, 116, @f == 0);        if (@f) {	    print "# failed 116 locale '$Locale' characters @f\n"        }    }}# Recount the errors.foreach (99..$last) {    if ($Problem{$_} || !defined $Okay{$_} || !@{$Okay{$_}}) {	if ($_ == 102) {	    print "# The failure of test 102 is not necessarily fatal.\n";	    print "# It usually indicates a problem in the enviroment,\n";	    print "# not in Perl itself.\n";	}	print "not ";    }    print "ok $_\n";}# Give final advice.my $didwarn = 0;foreach (99..$last) {    if ($Problem{$_}) {	my @f = sort keys %{ $Problem{$_} };	my $f = join(" ", @f);	$f =~ s/(.{50,60}) /$1\n#\t/g;	print	    "#\n",            "# The locale ", (@f == 1 ? "definition" : "definitions"), "\n#\n",	    "#\t", $f, "\n#\n",	    "# on your system may have errors because the locale test $_\n",            "# failed in ", (@f == 1 ? "that locale" : "those locales"),            ".\n";	print <<EOW;## If your users are not using these locales you are safe for the moment,# but please report this failure first to perlbug\@perl.com using the# perlbug script (as described in the INSTALL file) so that the exact# details of the failures can be sorted out first and then your operating# system supplier can be alerted about these anomalies.#EOW	$didwarn = 1;    }}# Tell which locales were okay and which were not.if ($didwarn) {    my (@s, @F);        foreach my $l (@Locale) {	my $p = 0;	foreach my $t (102..$last) {	    $p++ if $Problem{$t}{$l};	}	push @s, $l if $p == 0;      push @F, $l unless $p == 0;    }        if (@s) {        my $s = join(" ", @s);        $s =~ s/(.{50,60}) /$1\n#\t/g;        warn    	    "# The following locales\n#\n",            "#\t", $s, "\n#\n",	    "# tested okay.\n#\n",    } else {        warn "# None of your locales were fully okay.\n";    }    if (@F) {        my $F = join(" ", @F);        $F =~ s/(.{50,60}) /$1\n#\t/g;        warn          "# The following locales\n#\n",            "#\t", $F, "\n#\n",          "# had problems.\n#\n",    } else {        warn "# None of your locales were broken.\n";    }}# eof

⌨️ 快捷键说明

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