为什么我的Perl测试会因`use encoding'utf8'而失败?

mel*_*elo 9 testing perl utf-8

我对这个测试脚本感到困惑:

#!perl

use strict;
use warnings;
use encoding 'utf8';
use Test::More 'no_plan';

ok('áá' =~ m/á/, 'ok direct match');

my $re = qr{á};
ok('áá' =~ m/$re/, 'ok qr-based match');

like('áá', $re, 'like qr-based match');
Run Code Online (Sandbox Code Playgroud)

这三个测试都失败了,但是我期待use encoding 'utf8'将文字ááqr基于正则表达式的regexp 升级为utf8字符串,从而通过测试.

如果我删除了use encoding测试按预期传递的行,但我无法弄清楚为什么它们会在utf8模式下失败.

我在Mac OS X上使用perl 5.8.8(系统版).

Ari*_*zis 18

不要使用encodingpragma.它坏了.(Juerd Waalboer在YAPC :: EU 2k8上提到了这个问题.)

它至少有两件不属于一起的东西:

  1. 它指定源文件的编码.
  2. 它指定文件输入/输出的编码.

并且为了侮辱伤害它也会以一种破碎的方式排在第一位:它将\xNN序列重新解释为未编码的八位位组,而不是将它们视为代码点,并对它们进行解码,从而阻止您在指定的编码之外表达字符并制作根据编码,您的源代码意味着不同的东西.这只是一个惊人的错误.

仅以ASCII或UTF-8编写源代码.在后一种情况下,utf8编译就是用正确的事情.如果您不想使用UTF-8,但确实想要包含非ASCII字符,请显式转义或解码它们.

并明确使用I/O层或使用设置它们open编译有I/O自动转码正确.