Как получить строки из большей строки в Perl - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть несколько условий, которые я сохранил в строке в переменной $ условий. Строка будет выглядеть примерно так

"s(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)"

То, что я хотел бы сделать, это просто получить имя каждой работы и записать его во временную переменную. Прямо сейчас у меня есть следующее, но мое внутреннее чувство говорит, что это не будет работать.

@temp = split(/(s()\ orand)/, $conditions)

Есть идеи, как это сделать?

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Это тривиально:

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
0 голосов
/ 13 апреля 2011

При условии отсутствия вложенных скобок.

$_ = 's(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)';

my @jobs = /\((.+?)\)/g;

print "@jobs\n";
0 голосов
/ 13 апреля 2011

Вам, вероятно, нужно сделать две вещи:

  • Разделить вход на 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);
0 голосов
/ 13 апреля 2011
my @jobnames;
while($conditions =~ m/s\(([^)]*)\)/g) {
    push @jobnames, $1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...