#perl #string
#perl #строка
Вопрос:
У меня есть несколько условий, которые я сохранил в строке в переменной $conditions. Строка будет выглядеть примерно так
"s(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)"
Что я хотел бы сделать, так это просто получить имя каждого задания и перенести его во временную переменную. Прямо сейчас у меня есть следующее, но мое внутреннее чувство говорит, что это не сработает.
@temp = split(/(s() orand)/, $conditions)
Есть идеи о том, как это сделать?
Комментарии:
1. Это домашнее задание? Если это так, пожалуйста, пометьте это как таковое.
2. Нет, это не домашнее задание, я просто учу себя perl
Ответ №1:
Это тривиально:
my @names = $conditions =~ /s(([^)]*))/g;
Это простое решение предполагает, что текст, заключенный в круглые скобки, не может содержать больше круглых скобок и что ничто подобное экранированию невозможно.
Редактировать: подразумевалось включить эту расширенную версию того же регулярного выражения, что могло бы немного прояснить ситуацию:
my @names = $conditions =~ m{
s ( # match a literal s and opening parenthesis
( # then capture in a group
[^)]* # a sequence a zero or more
# non-right-parenthesis characters
)
) # followed by a literal closing parenthesis
}gx; # and return all of the groups that matched
Ответ №2:
my @jobnames;
while($conditions =~ m/s(([^)]*))/g) {
push @jobnames, $1;
}
Комментарии:
1. Это имеет смысл, хотя не нужно ли мне @jobname, чтобы сделать его массивом, поскольку может быть более одного имени задания?
2. Ах, я не думаю, что я четко объяснил, как выглядели входные данные, поскольку в вашем вопросе они не разделены. Доработка.
3. мои @jobnames = $conditions =~ /s(([^)]*))/ g;
Ответ №3:
Вероятно, вам нужно сделать две вещи:
- Разделите входные данные на
and
илиor
- Удалите
s()
бит
Вот один из способов сделать это, используя split
а затем map
:
@temp = map({/s(([^)] ))/} split(/s (?:and|or)s /, $conditions));
Или немного более наглядно:
# Break apart on "and" or "or"
@parts = split(/s (?:and|or)s /, $conditions);
# Remove the s() bit
@temp = map({/s(([^)] ))/} @parts);
Ответ №4:
Предполагая отсутствие вложенных круглых скобок.
$_ = 's(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)';
my @jobs = /((. ?))/g;
print "@jobsn";