Как получить строки из строки большего размера в Perl

#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";