Потому что .*?
ленив и будет соответствовать нулю символов, если это возможно. Прикрепите регулярное выражение к концу строки:
$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/
Но почти всегда лучше использовать что-то более явное, чем универсальные .*
и .*?
. Скажите движку регулярных выражений именно то, что вы хотите, чтобы соответствовать. Предполагая, что разделители -
и :
никогда не встречаются в реальных совпадениях, я предлагаю
$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
[^-]
означает «соответствовать любому символу, кроме -
».
[^:]
означает «соответствовать любому символу, кроме :
».