Назначьте захваченную группу значению, а если нет совпадения: назначьте строку

В регулярном выражении Perl документация говорит

... в скалярном контексте $time =~ /(\d\d):(\d\d):(\d\d)/ возвращает истинное или ложное значение. Однако в контексте списка он возвращает список совпадающих значений ($1,$2,$3)

Но как получается, что когда вы предоставляете альтернативный вариант — когда совпадений не найдено — ИСТИНА или ЛОЖЬ будут назначены даже в контексте списка?

В качестве примера я хочу присвоить совпадающую группу переменной и, если она не найдена, использовать строковое значение ALL.

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

Это возможно? А как насчет нескольких захваченных групп? Например.

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

Где, если первая группа не соответствует, используется 'dit', а если совпадения для второй не найдено, 'dat'.


person Bram Vanroy    schedule 25.02.2016    source источник
comment
Должен ли он быть однострочным? if else и использование $1 и $2, вероятно, будет более читабельным   -  person Recct    schedule 25.02.2016
comment
@Recct Это не обязательно, если это эффективно.   -  person Bram Vanroy    schedule 25.02.2016
comment
Кроме того, после || они находятся в пустом контексте, если все слева ложно, даже если вы используете более слабое or, предположительно применяемое в случае сбоя регулярного выражения, справа ничего не происходит.   -  person Recct    schedule 25.02.2016


Ответы (1)


Для первого требования вы можете использовать тернарный оператор:

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

Вывод:

a : a
b : b
c : ALL
d : d
e : e
f : ALL
person Toto    schedule 25.02.2016