Регулярное выражение, которое вы показываете, фиксирует имя функции и все остальные аргументы в строке, что является очень разумным первым шагом.Затем разберите аргументы из этой второй строки.Я расширяю ваш $string
, чтобы иметь несколько списков аргументов в скобках, чередующихся с не заключенными в скобки
perl -wE'
$s = "name_of_my_function(arg1,arg2,[arg3,arg4],arg5,[arg6,arg7])";
@m = $s =~ /^([^\(]*)\(([^\)]*)\)/;
@p = grep { $_ } split /\s*,\s*|\[(.*?)\]/, $m[1];
for (@p) {
if (/,/) { push @arg_list, $_ }
else { push @args, $_ }
}
say $m[0];
say for @args;
say for @arg_list
'
Это печатает
name_of_my_function
arg1
arg2
arg5
arg3,arg4
arg6,arg7
split
- это место, где находятся отдельные аргументыизвлеченные, а также списки аргументов в квадратных скобках, каждый в виде строки.Это может вернуть пустые элементы, таким образом grep { $_ }
, чтобы отфильтровать их.
Затем вы можете приступить к извлечению отдельных аргументов из списков, которые были в скобках, снова разделив каждую строку в @arg_list
на ,
.
Основная часть вышеприведенного может , поскольку проблема стоит, в одной инструкции
@p = grep { $_ } split /\( | \) | \[(.*?)\] |,/x, $s;
, где я добавил модификатор /x
, чтобы иметь возможность разметить его для удобства чтения.Это доставляет @p
имя функции, отдельные аргументы и строку со списком аргументов (через запятую) из каждого []
.
Однако я думаю, что гораздо разумнее разбить это нанесколько шагов.