Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Regex 列表上下文中的匹配不会返回空列表。为什么?_Regex_Perl - Fatal编程技术网

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
任何|无|所有