我在Perl中编写一个简单的脚本来检查字符串中是否有昵称的不同字形(英语和俄语)。我会使用下一个正则表达式:/(gunn?er|gunn?|ганн?еру?|ганн?у?)/i
- 根据regex101.com test和Notepad ++,它是有效的。但是,在我的Perl计算机上,除非我将其他括号添加到?
和|
:/((gun(n)?er)|(gun(n)?)|(ган(н)?ер(у)?)|(ган(н)?(у)?)/i
,否则此正则表达式不起作用。我的朋友,我已经问过这个,无法重现这种行为。是否应该更改脚本或Perl解释器本身的某种设置?
编辑:根据要求,我的测试代码:
#!/usr/bin/perl
my $GUN = "gunner";
my $HZ = "!!!";
sub GetNickFromMsg
{
my ($msg) = @_;
if ( $msg =~ /(gunn?er|gunn?|ганн?еру?|ганн?у?)/i )
{
return $GUN
}
return $HZ;
}
my @nicks = ("Gunner", "guner", "ганнер", "ганеру", "гану");
foreach $n (@nicks)
{
my $res = GetNickFromMsg($n);
print "$n -> $res\n");
}
我得到的输出:
Gunner -> !!!
guner -> !!!
ганнер -> !!!
ганеру -> !!!
гану -> !!!
如果我将正则表达式更改为第二个版本,并且括号到处都是,则每个字形的输出都应该是“ - > gunner”。我已尝试将use feature 'unicode_strings'
添加到脚本的开头,并使用ui
而不是卡西米尔所设想的i
修饰符,但它没有帮助。
我使用Perl版本5.22.1
在Linux服务器Linux version 4.3.0-1-amd64 (debian-kernel@lists.debian.org) (gcc version 5.3.1 20160101 (Debian 5.3.1-5) ) #1 SMP Debian 4.3.3-5 (2016-01-04)
上启动脚本
答案 0 :(得分:4)
您需要在程序顶部添加use utf8
,以指定您的程序代码使用UTF-8编码的字符
您还需要设置STDOUT来处理UTF-8编码,否则您将收到Wide character in print
警告
这是您的程序的编辑版本,可以正常运行并提供您期望的行为
#!/usr/bin/perl
use utf8;
use strict;
use warnings 'all';
use open qw/ :std :encoding(UTF-8) /;
my $GUN = 'gunner';
my $HZ = '!!!';
sub GetNickFromMsg {
my ($msg) = @_;
if ( $msg =~ /(gunn?er|gunn?|ганн?еру?|ганн?у?)/i ) {
return $GUN;
}
return $HZ;
}
my @nicks = qw/ Gunner guner ганнер ганеру гану /;
foreach my $n (@nicks) {
my $res = GetNickFromMsg($n);
print "$n -> $res\n";
}
Gunner -> gunner
guner -> gunner
ганнер -> gunner
ганеру -> gunner
гану -> gunner