这是我的源代码:
use strict;
use warnings;
use diagnostics;
use utf8::all;
print join ' ',map{as_code_point($_)}sort qw/b 1 a A 日 本 国/;
sub as_code_point{
my $char=shift;
die"Only characters!"if length($char)>1;
return "U+".uc sprintf "%04x",ord $char;
}
我不知道出了什么问题。我需要你的帮助。
答案 0 :(得分:3)
该问题表明标量包含无效值。当源不使用UTF-8进行编码时会发生这种情况,但是您告诉Perl它是(因为它不执行有效性检查。)
如果文件编码正确,则不会出现此问题。
$ perl a.pl | perl
U+0031 U+0041 U+0061 U+0062 U+56FD U+65E5 U+672C
a.pl
:
use strict;
use warnings;
use utf8::all;
my $chars = qq{qw/b 1 a A \x{65E5} \x{672C} \x{56FD}/};
while (<DATA>) {
s/<<<CHARS>>>/$chars/g;
print;
}
__DATA__
use strict;
use warnings;
use diagnostics;
use utf8::all;
print join ' ',map{as_code_point($_)}sort <<<CHARS>>>;
print "\n";
sub as_code_point{
my $char=shift;
die"Only characters!"if length($char)>1;
return "U+".uc sprintf "%04x",ord $char;
}
答案 1 :(得分:1)
我敢打赌,utf8::all
正在做一些破坏Carp模块加载的事情。第一步是查看您的Carp版本是否确实出现了问题。尝试针对C:/Strawberry/perl/lib/Carp.pm
:
perl -Mbytes -ne "printf qq/%02x [$_]\n/, ord for grep { ord > 127 } split //" C:/Strawberry/perl/lib/Carp.pm
您可能必须第二次逃离\
(我没有要测试的Windows机器)。
这应该可以让您了解其中的非ASCII字节。检查这些字节是否有效UTF-8(您可以使用默认为Window的本机UTF-16的编辑器打开并保存文件。)
另一种选择是看看它抱怨的那条线:
perl -ne 'print if $. == 324' C:/Strawberry/perl/lib/Carp.pm
有什么看起来很有趣吗?您还应该检查文件上的修改日期。它和其他核心模块一样吗?如果没有,则可能已编辑过。
如果没有发现问题,请摆脱use utf8::all;
并慢慢手动添加功能。