作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有目录路径列表,需要过滤掉其中的一些。我的匹配模式采用非 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);
我需要的是当模式包含俄语字母时不区分大小写的正则表达式模式匹配。
最佳答案
您的代码有几个(潜在的)问题:
您的代码过滤掉所有不与 $_REQUEST{q}
中的正则表达式匹配的 doc_folder,但是问题表明您想要做相反的事情.
您可能遇到编码问题。设置语言环境(使用 setlocale)会改变 perl 对大写和小写转换的处理,但不会改变任何编码。您需要确保正确解释 $_REQUEST{q}
。
为简单起见,您可以假设任何 Perl 字符串都以某种您不需要详细了解的内部表示形式包含 Unicode 数据。只有当 Perl 做 I/O 时,才会有隐式或显式转换。当从 stdin、ARGV 或环境读取时,Perl 假定字节是使用当前语言环境编码的并隐式转换。
如果您有编码问题,有几种方法可以解决:
$_REQUEST
是从文件句柄加载的,您可以明确地告诉 Perl 使用 binmode($fh, ":encoding(cp1251)");
。在阅读 $_REQUEST
之前执行此操作。$string = Encode::decode(Encoding, $octets)
函数告诉 Perl 忘记它对 $octets
编码的假设,而是处理$octets
的内容作为字节流,需要使用 Encoding
转换为 Unicode。在接触 $octets
的内容之前,您需要这样做,否则可能会发生奇怪的事情。$_REQUEST
可能由某些 cgi 模块加载,并且可能在传输过程中进行了 url 编码,您可以告诉 cgi 模块如何正确进行解码。关于regex - 如何为俄语字母进行不区分大小写的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543694/
我是一名优秀的程序员,十分优秀!