4

次のテストがあります。

use Test::More;
use Lingua::EN::NameCase 'nc';
use utf8;
my $output = Test::Builder->new->todo_output;
binmode $output, ':encoding(UTF-8)';
$output = Test::Builder->new->failure_output;
binmode $output, ':encoding(UTF-8)';

my $name = 'Lintão';
is nc($name), $name, 'nc() should not change a properly namecased name';
diag nc($name);

done_testing;

Perl 5.10.1 を搭載した Mac OS X では、次の出力が得られます。

nc.t ..
ok 1 - nc() should not change a properly namecased name
1..1
# Lintão
ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.04 cusr  0.00 csys =  0.07 CPU)
Result: PASS

残念ながら、5.10.1 Perl を使用した Debian Squeezebox で同じテストを実行すると、次の出力が生成されます。

nc.t ..
not ok 1 - nc() should not change a properly namecased name

#   Failed test 'nc() should not change a properly namecased name'
#   at nc.t line 10.
#          got: 'LintãO'
#     expected: 'Lintão'
# LintãO
1..1
# Looks like you failed 1 test of 1.
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests

Test Summary Report
-------------------
nc.t (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=1, Tests=1,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.03 cusr  0.00 csys =  0.04 CPU)
Result: FAIL

nc()サブルーチンの問題のある行は次のようです。

s{ \b (\w)   }{\u$1}gox ;           # Uppercase first letter of every word.

そのため、どういうわけか、Debian 上の同じバージョンの Perl が単語の境界を間違えています。さらにデバッグを手伝ってくれる人はいますか?

4

1 に答える 1

6

ãLinux ボックスのロケールは、単語の文字を考慮しません (Lingua::EN::NameCaseそのため、文字分類use locale;の現在の設定を使用します)。LC_CTYPE5.8.1 から 5.18.1 までの perlbrewed perl を使用すると、en_GB.UTF-8ロケールを使用して Ubuntu 12.04 LTS で一貫してこの出力が得られます。

$ perl -Mutf8 -le 'print 0+("ã" =~ /\w/); use locale; print 0+("ã" =~ /\w/)'
1
0
于 2013-09-16T13:11:16.663 に答える