将捕获的组分配给值,如果不匹配:分配字符串

Assign captured group to value, and if no match: assign string

在 Perl 正则表达式中,the documentation

... in scalar context, $time =~ /(\d\d):(\d\d):(\d\d)/ returns a true or false value. In list context, however, it returns the list of matched values (,,)

但是当您提供替代选项时 - 当未找到匹配项时 - 即使在列表上下文中也会分配 TRUE 或 FALSE 是怎么回事?

例如,我想将匹配的组分配给一个变量,如果找不到,则使用字符串值 ALL。

my ($var) = $string =~ /myregex/ || 'ALL';

这可能吗?那么多个捕获的组呢?例如

my ($var1, $var2) = $string =~ /(d.t)[^d]+(d.t)/ || 'dit', 'dat';

如果第一组不匹配,则使用 'dit',如果第二组未找到匹配,则使用 'dat'

对于第一个需求,可以使用三元运算符:

my $string = 'abded';
for my $f ('a' .. 'f') {
    my ($v1) = $string =~ /($f)/ ? () : ('ALL') ;
    say "$f : $v1";
}

输出:

a : a
b : b
c : ALL
d : d
e : e
f : ALL