It's not quite correct to state that /"([^"]*)"/ should not match "hello"you". In fact, it should match -- specifically, it should match the "hello" part. By default, regexes are not anchored, and the match operator will return true if the pattern matchs any part of the bound string. If you want to anchor the regex -- in other words, if you want it to match something in its entirity -- you need to explicitly specify ^ and $ modifiers.
For example, the regex /^"([^"]*)"$/ will behave the way you seem to be expecting, because it means essentially "match a something enclosed by quotes, with nothing else before or after it.
The reason your one-liner is behaving the way it does is because you're not creating exactly the string you think. This statement:
$a = "hello\"you"
actually creates a string whose contents are hello"you with no quotes before and after -- because the quotes are used to delimit the string literal in the first place. If you tried this:
$a = "\"hello\"you\""
or (more readable) this:
$a = q{"hello"you"}
you'd get the result you expect.
(If you're not familiar with the q{xxx} syntax, it effectively means "single-quote xxx". qq{xxx} does the same with double-quotes. You can use a wide variety of delimiters where I've used curly brackets -- this is a great way to avoid having to escape characters inside string literals.)
In reply to Re: Problem with regex from Learning Perl (3rd edition)
by seattlejohn
in thread Problem with regex from Learning Perl (3rd edition)
by slocate
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |