Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:regex-won';没有括号就不能工作_Regex_Perl - Fatal编程技术网

Perl:regex-won';没有括号就不能工作

Perl:regex-won';没有括号就不能工作,regex,perl,Regex,Perl,我正在用Perl编写一个简单的脚本来检查昵称的不同单词形式(英语和俄语)的字符串。我将使用下一个正则表达式:/(gunn?er | gunn |Γааааааааааааааа?)/I——根据和记。然而,在我的Perl计算机上,除非我在?和|:/((gun(n)?er)|(gun(n)?)|(Γааааааа)Ӛаааааааааа/我。我的朋友,我问过他这个问题,他无法重现这种行为。我应该更改脚本或Perl解释器本身的某种设置吗 编辑:根据要求,我的测试代码: #!/usr/bin/perl

我正在用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字符都被视为两个独立的字符,可以说,