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ď č. 1Je 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
aleboor
- 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";