如果我在涉及查询字符串的简单条件之后执行此操作,则在Perl中将所有匹配的字符串存储在数组中似乎无法正常工作。有人知道为什么吗?我在下面有一些代码说明了这一点:
#!/usr/local/bin/perl -w
use warnings;
use strict;
my ($string,
@instance_array,
);
$string = 'ABCDCECFCG';
print "String: $string\n\n";
# PRINT INSTANCE ARRAY BEFORE CONDITIONAL
@instance_array = $string =~ m/C./g;
print "BEFORE CONDITIONAL\n@instance_array\n"; print scalar @instance_array; print "\n\n";
undef @instance_array;
##############################################
#if (@instance_array = $string =~ m/C./g)
if ($string =~ m/C./g)
{
# PRINT INSTANCE ARRAY INSIDE CONDITIONAL
print "INSIDE CONDITIONAL\n@instance_array\n"; print scalar @instance_array; print "\n\n";
};
print "String: $string\n\n";
undef @instance_array;
############################################
# PRINT INSTANCE ARRAY AFTER CONDITIONAL
@instance_array = $string =~ m/C./g;
print "AFTER CONDITIONAL\n@instance_array\n"; print scalar @instance_array; print "\n\n";
undef @instance_array;
# PRINT FINAL INSTANCE ARRAY
@instance_array = $string =~ m/C./g;
print "AFTER CONDITIONAL\n@instance_array\n"; print scalar @instance_array; print "\n\n";
undef @instance_array;
exit;
请注意" BEFORE CONDITIONAL" @instance_array输出是正确的(即,正则表达式有四个匹配),条件中的一个是未定义的(应该是),但是" AFTER CONDITIONAL" @instance_array缺少" CD"比赛。还要注意" FINAL" @instance_array也是正确的,即使它与用于打印" AFTER CONDITIONAL"的代码完全相同。 @instance_array。
根据条件后的$ string print语句,条件不会以任何方式更改查询$ string。
另一个有趣的事情是:如果我将所有匹配发送到简单条件中的@instance_array(此行在简单条件上方注释掉),则所有四个匹配都正确放置在数组中。
有谁知道为什么初始匹配(" CD")没有进入@instance_array?也许它正在存储" CD"匹配内部变量(如$ 1,即使我知道这不太正确)并且在条件之后没有正确地重新初始化它?
感谢大家的帮助。
答案 0 :(得分:1)
Just remove /g
in your condition i.e.:
if ($string =~ m/C./g)
For the if
condition you shouldn't use /g
. This is because it's changing the pos
of the regex. You can use it, though, e.g. in while
loop.
To see how it's being changed you can print it after that if
statement:
print pos $string;
You will see that it's changed to 4
. To reset the pos:
pos($string) = 0;
However, it's not recommended. Just don't use /g
in the if
.
答案 1 :(得分:0)
试试这个:
my @matches = ($string =~ /(regex)/g);
答案 2 :(得分:0)
关于你的正则表达式“/ C ./"
这肯定会成为问题,因为您没有限制正则表达式标准。人物 '。'因为你使用的意思是“字面上”任何到Perl正则表达式引擎。现在,假设您正在尝试找到角色'。',您必须逃避“。”你的正则表达式语句中的字符如下:
/^C\.$/
如果要捕获“匹配”,则必须在每个匹配项中标记要在括号内添加组的内容。这样的事情:
/(其他)(FOO)(巴)/
匹配结果Perl存储在特殊变量中,并提交到范围规则。当'$ n'是正则表达式中定义的第n个组时,一些变量是$ _,$ 1,$ 2,...,“$ n”,并且只是“说明性的”并且实际上并不作为特殊变量存在。考虑上面的例子:
my $string = "Perl regex rocks!";
my ($match1, $match2, $match3) = ($1,$2,$3) if $string =~ /^(\w+)\s(\w+)\s(\w+)!$/;
#$match1 = "Perl"
#$match2 = "regex"
#$match3 = "rocks"
Perl正则表达式的链接:
http://perldoc.perl.org/perlre.html
http://perldoc.perl.org/perlreref.html
关于正则表达式的美丽书籍(Perl中的大量示例)