Regex 列表上下文中的匹配不会返回空列表。为什么?
无论有无括号,失败时都会返回空列表 但失败后我不会得到空列表:Regex 列表上下文中的匹配不会返回空列表。为什么?,regex,perl,Regex,Perl,无论有无括号,失败时都会返回空列表 但失败后我不会得到空列表: my @l = 'a' !~ m/a/; print scalar @l; # 1 print defined $l[0]; # 1 use warnings; print $l[0] eq ''; # 1 但是使用=~我得到了一个空列表: my @l = 'a' =~ m/b/; print scalar @l; # 0 我对不了解的内容~ 这是为x86_64-linux构建的perl
my @l = 'a' !~ m/a/;
print scalar @l; # 1
print defined $l[0]; # 1
use warnings;
print $l[0] eq ''; # 1
但是使用=~
我得到了一个空列表:
my @l = 'a' =~ m/b/;
print scalar @l; # 0
我对不了解的内容~代码>
这是为x86_64-linux构建的perl 5,版本30,subversion 3(v5.30.3)
UPD
my$r={a=>a',b=>b',c=>c'};
我的$f={a=>'a',c=>'c'};
映射{$r->{$}=~$f->{$}%$f或下一个;#如果没有匹配项,则转到下一条记录
映射{$r->{$}!~$f->{$}%$f或下一个;#如果所有条件都满足,则继续
使用绑定操作数~
不能使match操作符简单地交换匹配时返回的内容和不匹配时返回的内容
在列表上下文中,match操作符通常返回捕获的子字符串,如果没有匹配项,则返回空列表。交换返回值需要在匹配项上返回一个空列表,在没有匹配项时返回捕获的子字符串。这是不可能的,因为在没有对手的情况下,什么都不会被捕获
s//
和tr//
有类似的问题,因为它们通常返回替换的数量
相反,EXPR!~OP
是的缩写!(EXPR=~OP)
,和代码>在标量上下文中计算其操作数(因为它需要true或false值)
#如果没有匹配项,则转到下一条记录。
grep{$r->{$}=~$f->{$}键(%$f)
或下一步;
#如果所有内容都匹配,则转到下一个记录。
#(如果没有不匹配的内容,请转到下一条记录。)
grep{$r->{$}!~$f->{$}键(%$f)
或下一步;
更清楚:
use List::Util qw(全部无);
#如果没有匹配项,则转到下一个记录。
无{$r->{$}=~$f->{$}}键(%%$f)
或下一步;
#如果所有内容都匹配,则转到下一个记录。
所有{$r->{$}=~$f->{$}键(%$f)
其次,;
除了返回值在逻辑意义上被取反之外,文档说Binary“!~”
与“=~”
类似。您观察到的行为似乎与此一致。@Dada:((这是不一致的。因此我无法编写检查所有匹配项的代码:map{$d->$\uz!~$where->{$}}键%$where
喜欢检查所有值不匹配的地方:map{$d->$\uz=~$where->{$}键%$where
。在这里,当它返回空列表时,我使用类似于reduce的映射。因此,当我们得到空列表时,我们得到了条件。你认为,如果!
将返回空列表,我们会受益吗?$where和$d是什么?你能展示一个不那么抽象的用例吗?@choroba:在我的例子中,$d
是DBIx::Class::Result
行和其中
一个哈希,其中键
是字段名,值
是要匹配的正则表达式。通过匹配,我可以决定是否继续行。=
没有匹配,!
所有匹配我将使用grep
或任何|无|所有
。