如何创建一个不区分大小写的正则表达式匹配俄语字母?

3

我有一组目录路径需要筛选出其中的一些。我的匹配模式是使用非Unicode编码的。

我尝试了以下方法:

require 5.004;
use POSIX qw(locale_h);
my $old_locale = setlocale(LC_ALL);
setlocale(LC_ALL, "ru_RU.cp1251");

@{$data -> {doc_folder_rights}} = 
       grep {
              # catalog path pattern in $_REQUEST{q}
              $_->{doc_folder} =~/$_REQUEST{q}/i; 
            } 
            @{$data -> {doc_folder_rights}};

setlocale(LC_ALL, $old_locale);

我需要的是在包含俄语字母时,不区分大小写地匹配正则表达式模式。

你的 Perl 版本是什么?我相信 Perl 5.004 不支持正则表达式中的那些。 - J-16 SDiZ
perl -v 输出:v5.10.0 适用于 x86_64-linux-gnu-thread-multi 构建 - jonny
1个回答

2
您的代码存在几个(潜在的)问题:
1. 您的代码过滤掉所有不与$_REQUEST{q}中的正则表达式匹配的doc_folders,然而问题表明您想做相反的事情。
2. 您可能有一个编码问题。设置本地化信息(使用setlocale)会改变perl处理大小写转换的方式,但不会改变任何编码。您需要确保正确解释$_REQUEST{q}
为了简单起见,您可以假定任何Perl字符串包含Unicode数据的某些内部表示形式,您不需要详细了解它。只有当Perl进行I/O时才会发生隐式或显式转换。当从stdin、ARGV或环境读取时,Perl假定字节是使用当前区域设置编码的,并隐式转换。
如果您有编码问题,有几种解决方法:
1. 修复Perl运行的环境,使其从一开始就知道正确的区域设置。这将修复隐式转换。
2. 在不太可能的情况下,如果$_REQUEST是从文件句柄加载的,则可以显式告诉Perl使用binmode($fh,":encoding(cp1251)")进行转换。在读取$_REQUEST之前执行此操作。
3. 有一个$string = Encode::decode(Encoding, $octets)函数,告诉Perl忘记关于$octets编码的假设,而是将$octets的内容视为需要使用Encoding转换为Unicode的字节流。在触及$octets的内容之前,您需要执行此操作,否则可能会发生奇怪的事情。
4. 由于$_REQUEST可能是由一些cgi模块加载的,并且可能在传输过程中进行了url编码,因此您可以告诉cgi模块如何正确地进行解码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接