Как сопоставить значения замены строки регулярного выражения ($ 1, $ 2 и т. Д.) С хешем?

my (@keys,@values) = ($text =~ /\{IS\:([a-zA-Z0-9_-]+)\}(.*)\{\\IS\:([a-zA-Z0-9_-]+)\}/g);

должен соответствовать строкам, подобным этой

{IS:cow}moo{\IS:cow}
{IS:cow}moo{\IS:cow}    
{IS:dog}bark{\IS:dog}
{IS:dog}meow{\IS:dog} #probably not a dog

, что отлично работает, за исключением того, что все значения $ 1, $ 2 и $ 3 сбрасываются в @keys .. поэтому я пытаюсь выяснить как собрать этих парней в хороший хеш из $ 1 => $ 2 пар ...

Что касается полного контекста, то я действительно хотел бы, чтобы выражение регулярного выражения возвращало структуру данных, которая выглядит как (и добавляла счетчик количества раз, когда ключ был найден)

{ 
  cow_1 => moo,
  cow_2 => moo,
  dog_1 => bark,
  dog_2 => meow,
}

Есть ли способ использовать функцию map {} для достижения этой цели с помощью Regex? Может быть, что-то вроде этого?

my %datahash = map { ( $1 eq $3 ) ? { $1 => $2 } : undef } @{ regex...};

1 доллар равен 3 долларам, чтобы убедиться, что это соответствующий тег (нет необходимости в рекурсивной проверке, что эти теги не вложены), в таком случае используйте 1 доллар в качестве ключа и 2 доллара в качестве значения;

Затем для каждая из этих пар ключ => значение, я хочу заменить

{IS:cow}moo{\IS:cow}
{IS:cow}moo{\IS:cow}   

на

{cow_1}
{cow_2}

, тогда, если $ cachedData {cow} истинно, все cow_ * будут заменены их ключом в% datahash ...

5
задан qodeninja 29 November 2011 в 21:22
поделиться