in reply to Re^2: Combining regexes
in thread Combining regexes
Am I right in thinking that the (?i) has the same effect as an i qualifier with xmsr?
Yes — almost. In, e.g., s{ ... }{...}xmsi the /i modifier affects the regex match globally. A (?i) extended pattern only has effect from the point of its appearance in the regex to the end of the regex pattern scope — which may or may not be the end of the regex! (See Extended Patterns. I must apologize: I did not mention that extended patterns are only available from Perl version 5.10 onward; I assume you have this.) I prefer the embedded (?i) form because it is more visible and because it gives more control: case sensitivity can be turned on and off at will in a regex, and its scope closely controlled. In general, "my own preferred practices" are that the qr// operator has only the /xms modifiers applied to the operator, and all other modifiers , e.g., (?i), scoped within the operator. This practice just generalizes to the m//xms and s///xms operators. The latter two operators can also take /g /e /r modifiers which can only be applied to the operator as a whole.
... none of the spaces in { ... } are treated as matchable characters? I suspect it's ... x ...
Yes, exactly. Allowing whitespace not to be part of the pattern eases the strain on these old eyes, a great blessing after so many years toiling in the scriptorium. See /x in Modifiers.
I find your final assignment ($var = $var =~ regex =~ regex) rather confusing, as it seems to need to work from left to right at some times and from right to left at others.
It might have been helpful if I had thrown in a few disambiguating parentheses. But you can always add your own with O and B::Deparse:
(Here I wanted to give an example of the deparsed code, but for some reason I don't understand, it didn't work out! Quickly moving on...)
Anyway, by hand:
Working in order of precedence (more or less inside-out in this case):c:\@Work\Perl\monks>perl -wMstrict -le "my $curdir = 'Y:\Music\Schubert\Lieder\Terfel'; my $startdir = 'Y:\mUsIc'; ;; my $plsname = ((($curdir =~ s{ \A (?i) \Q$startdir\E \\? }{}xmsr) =~ tr{\\}{_}r) +. '.pls'); print qq{'$plsname'}; " 'Schubert_Lieder_Terfel.pls'
Is the order irrelevant, and if not, what are the rules for the direction of evaluation?
The order is very relevant, and is discussed in Operator Precedence and Associativity in perlop: see the =~ (binding) and . (concatenation) and = (assignment) operators.
Update: Layout of <ol> above changed – improved?
Give a man a fish: <%-{-{-{-<
|
|---|