Вы хотите:
my ($date) = ($xml_file =~ m/(\d+)-sys_char/);
Это даст вам $1
в $date
. Что касается второй части вашего вопроса, нет способа получить все пронумерованные совпадения в одной переменной, но вы можете получить их все в массив, например:
my @matches = ($xml_file =~ m/(\d+)-sys_char/);
Это фактически один и тот же синтаксис: когда левая часть совпадения, подобного этому, является массивом, то возвращается массив, содержащий все подспаривания. Первая версия превращает ($date)
в одноэлементный массив, отбрасывая остальные суб-совпадения.