加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl预编译正则表达式 – utf8

发布时间:2020-12-16 06:25:53 所属栏目:大数据 来源:网络整理
导读:当我做: use strict; use warnings;my $regex = qr/[[:upper:]]/;my $line = MyModule::get_my_line_from_external_source(); #file,db,etc...print "upper heren" if( $line =~ $regex ); perl如何知道何时必须匹配ascii大写和utf8大写? 它是一个预编译
当我做:

use strict; use warnings;
my $regex = qr/[[:upper:]]/;
my $line = MyModule::get_my_line_from_external_source(); #file,db,etc...
print "upper heren" if( $line =~ $regex );

perl如何知道何时必须匹配ascii大写和utf8大写?
它是一个预编译的正则表达式 – 所以有些perl必须知道,什么是大写.取决于区域设置?如果是,如何将“C”语言环境中的utf8大写与预编译的正则表达式匹配?

根据tchrist的评论更新:

use strict; use warnings; use Encode;
my $regex = qr/[[:upper:]]/;

my $line = XXX::line();
print "$line: upper1 ",($line =~ $regex) ? "YES" : "NO","n";

my $uline = Encode::decode_utf8($line);
print "$uline: upper2 ",($uline =~ $regex) ? "YES" : "NO","n";

package XXX;
sub line { return "alpha-Ω"; } #returning octets - not utf8 chars

输出是:

alpha-Ω: upper1 NO
alpha-Ω: upper2 YES

这是什么意思,预编译的正则表达式不是“硬预编译”而是“软预编译” – 所以perl根据匹配的$line的utf8标志替换'[[:upper:]]’.

解决方法

在Perl 5.14之前,这个定义不是很明确.

使用5.14,模式已知如何编译,并且您具有/ u,/ l,/ d,/ a或/ aa模式修饰符.你也可以说

use re "/u";

要么

use re "/msu";

在词法范围内打开所有这些标志.

例如,在5.14下:

% perl -le 'print qr/foo/'
(?^:foo)
% perl -E 'say qr/foo/'
(?^u:foo)
% perl -E 'say qr/foo/l'
(?^l:foo)

我会避开场所;只需使用全Unicode.

顺便说一句,我会确保那个“外部源”给你一个正确解码的字符串;也就是说,它的UTF8标志已打开.字符函数在编码字符串上运行不佳,因为它们确实需要解码字符串.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读