Perl:regex-won';没有括号就不能工作
我正在用Perl编写一个简单的脚本来检查昵称的不同单词形式(英语和俄语)的字符串。我将使用下一个正则表达式:Perl:regex-won';没有括号就不能工作,regex,perl,Regex,Perl,我正在用Perl编写一个简单的脚本来检查昵称的不同单词形式(英语和俄语)的字符串。我将使用下一个正则表达式:/(gunn?er | gunn |Γааааааааааааааа?)/I——根据和记。然而,在我的Perl计算机上,除非我在?和|:/((gun(n)?er)|(gun(n)?)|(Γааааааа)Ӛаааааааааа/我。我的朋友,我问过他这个问题,他无法重现这种行为。我应该更改脚本或Perl解释器本身的某种设置吗 编辑:根据要求,我的测试代码: #!/usr/bin/perl
/(gunn?er | gunn |Γааааааааааааааа?)/I
——根据和记。然而,在我的Perl计算机上,除非我在?
和|
:/((gun(n)?er)|(gun(n)?)|(Γааааааа)Ӛаааааааааа/我
。我的朋友,我问过他这个问题,他无法重现这种行为。我应该更改脚本或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 -> !!!
ганнер -> !!!
ганеру -> !!!
гану -> !!!
如果我将正则表达式更改为第二个版本,并且到处都是括号,那么每个wordform的输出应该是“->gunner”。我尝试在脚本开头添加使用特性“unicode\u strings”
,并使用ui
而不是Casimir所认为的I
修饰符,但没有帮助
我在Linux服务器上启动脚本,Linux版本4.3.0-1-amd64(debian-kernel@lists.debian.org)(gcc版本5.3.1 20160101(Debian 5.3.1-5))#1 SMP Debian 4.3.3-5(2016-01-04)
和Perl版本5.22.1
您需要在程序顶部添加使用utf8
,以指定程序代码使用UTF-8编码字符
您还需要将STDOUT设置为处理UTF-8编码,否则您将在打印时得到宽字符
警告
这是一个经过编辑的程序版本,它可以正常工作,并提供您所期望的行为
!/usr/bin/perl
使用utf8;
严格使用;
使用“全部”警告;
使用开放式qw/:std:encoding(UTF-8)/;
我的$GUN='gunner';
我的$HZ=';
sub-GetNickFromMsg{
我的($msg)=@;
if($msg=~/(冈纳|冈恩|Γааааааааааааааа{
归还$GUN;
}
返回$HZ;
}
my@nicks=qw/炮手炮手;
兑换我的$n(@nicks){
my$res=GetNickFromMsg($n);
打印“$n->$res\n”;
}
输出
炮手->炮手
炮手->炮手
ааааааааа->炮手
ааааааааа->炮手
ГааП->炮手
您需要在程序顶部添加使用utf8
,以指定程序代码使用UTF-8编码字符
您还需要将STDOUT设置为处理UTF-8编码,否则您将在打印时得到宽字符
警告
这是一个经过编辑的程序版本,它可以正常工作,并提供您所期望的行为
!/usr/bin/perl
使用utf8;
严格使用;
使用“全部”警告;
使用开放式qw/:std:encoding(UTF-8)/;
我的$GUN='gunner';
我的$HZ=';
sub-GetNickFromMsg{
我的($msg)=@;
if($msg=~/(冈纳|冈恩|Γааааааааааааааа{
归还$GUN;
}
返回$HZ;
}
my@nicks=qw/炮手炮手;
兑换我的$n(@nicks){
my$res=GetNickFromMsg($n);
打印“$n->$res\n”;
}
输出
炮手->炮手
炮手->炮手
ааааааааа->炮手
ааааааааа->炮手
ГааП->炮手
编写/(炮手|炮手|Γаааааааа?)/Perl中的i
是完全有效的,您的问题来自其他地方。您应该显示您的代码。由于您使用unicode字符,您的代码是以使用功能“unicode\u strings”
开始的还是使用u修饰符?我从未见过错误不起作用。
。我不认为您可以提供实际示例。使用fea真正的“unicode_字符串”
只存在于Perl 5.12中。您说您的程序包含但如果没有使用utf8;
,该字符不可能存在于Perl程序中。默认编码实际上是iso-8859-1,而该字符在iso-8859-1中不存在。同样,您的源代码不可能包含>炮手|Γааар
不使用使用utf8;
(您的区域设置完全不相关)。它实际上包含炮手ø半Ð半Ð半Ð�代码>。至于它运行良好,我同意您,这方面的bug可能会被抵消(例如,如果您还有的话,它会工作的)�代码>而不是输入的Γаааааааааааааааааааааааааааа107/Perl中的i
是完全有效的,您的问题来自其他地方。您应该显示您的代码。由于您使用unicode字符,您的代码是以使用功能“unicode\u strings”
开始的还是使用u修饰符?我从未见过错误不起作用。
。我不认为您可以提供实际示例。使用fea真正的“unicode_字符串”
只存在于Perl 5.12中。您说您的程序包含但如果没有使用utf8;
,该字符不可能存在于Perl程序中。默认编码实际上是iso-8859-1,而该字符在iso-8859-1中不存在。同样,您的源代码不可能包含>炮手|Γааар
不使用使用utf8;
(您的区域设置完全不相关)。它实际上包含炮手ø半Ð半Ð半Ð�代码>。至于它运行良好,我同意您,这方面的bug可能会被抵消(例如,如果您还有的话,它会工作的)�编码>和非输入),但这并不意味着它是好的。你的问题证明事情并不像现在这样好;你只是幸运地看到了你评论中的例子。是的,它起了作用,非常感谢!只是想澄清一下:这是否意味着在我的例子中,每个Unicode字符都被视为两个独立的字符,可以说,?