/ / Ako dostať reťazce z väčšieho reťazca v Perle - perl, reťazec

Ako získať reťazce z väčšieho reťazca v

Mám niekoľko podmienok, ktoré mám uložené v reťazci pod premennou $ conditions. Šnúrka by vyzerala asi takto

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

To, čo by som chcel urobiť, je získať všetky názvy pracovných pozícií a uložiť ich do dočasnej premennej. Momentálne mám nasledujúce, ale moje vnútorné cítenie hovorí, že to nebude fungovať.

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

Akékoľvek nápady na to, ako to urobiť?

odpovede:

2 pre odpoveď č. 1

Je to triviálne:

my @names = $conditions =~ /s(([^)]*))/g;

Toto jednoduché riešenie predpokladá, že text v zátvorkách nemôže obsahovať viac zátvoriek a že nie je možné nič ako uniknúť.

Edit: Chcel zahrnúť túto rozšírenú verziu rovnakého regulárneho výrazu, čo by mohlo urobiť veci trochu jasnejšími:

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 pre odpoveď č. 2
my @jobnames;
while($conditions =~ m/s(([^)]*))/g) {
push @jobnames, $1;
}

0 pre odpoveď č. 3

Pravdepodobne musíte urobiť dve veci:

  • Rozdelte vstup na obidve and alebo or
  • Odstrániť s() trocha

Tu je jeden spôsob, ako to urobiť pomocou split a potom map:

@temp = map({/s(([^)]+))/} split(/s+(?:and|or)s+/, $conditions));

Alebo o niečo jasnejšie:

# Break apart on "and" or "or"
@parts = split(/s+(?:and|or)s+/, $conditions);
# Remove the s() bit
@temp = map({/s(([^)]+))/} @parts);

0 pre odpoveď č. 4

Za predpokladu, že neexistujú vnorené zátvorky.

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

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

print "@jobsn";