У меня есть такой рода регулярного выражения:Regex + петля + ИЛИ
$recipes =~ s/
([^\.\/]) ($dimentions) (\s) ($unit)
|(\(?) ($wholeNumberDecimal) (\s) ($unit)
|(\(?) ($wholeNumber) (\s) ($unit)
|(\(?) ($wholeNumberFraction) (\s) ($unit)
/transformer($1,$2,$3,$4) /eixg;
Что я хотел бы, чтобы это сделать, это каждый раз, когда он совпадает с одной из этих 4-й случаев это вызывает метод.
Из моего преувеличения будет $1
, $2
, $3
, $4
. Если я передам все эти переменные методу, то как метод узнает, какая переменная является новым совпадением и какие из них могут быть сопоставлены раньше и просто запоминаются?
Есть ли способ иметь только одну переменную $1
, которая подходит к любому из этих случаев и просто отправляет этот метод в любое время?
Или у меня есть правильный подход? Я пытаюсь сопоставить эти разные случаи с книгой рецептов и с каждым вызовом вызова метод, который преобразует это в эквивалент системы показателей.
Пример: 5 ст.л -> 80 мл, или 8 х 8 х 2 дюйма -> 20 х 20 х 5 см
На основании опубликованных ответов я изменил свое регулярное выражение:
$recepies =~ s/
(?|
([^\.\/]) ($dimentions)
|
(\(?) ($wholeNumberDecimal) #ex: 1.5
|
(\(?) ($wholeNumber) #ex: 1
|
(\(?) ($wholeNumberFraction)
)
(\s) ($unit)
/transformer($1,$2,$3,$4) /eixg; #the replacement
Кажется, это работает!
Это может быть сделано лучше, чем [Regexp :: Grammars] (https://metacpan.org/pod/Regexp::Grammars). – Schwern