in reply to Finding out which of a list of patterns matched

What I want to find is the pattern earliest in the list which matches earliest in the text, where matching earlier in the text is more important than being higher up the list.

Does that mean that if multiple patterns match the text you want the one that matches at the point closest to the start of the string? Because, if so, none of the solutions given so far will do that that I can see. Even your suggested use of /foo|bar|baz/ won't do this as perl tries the patterns from left to right and gives you the one that matches first whether or not it's "earliest" in the string. I think that if you want this behavior, you'll have to loop over each pattern recording where they matched (if at all) and then select one with the lowest match position.

Replies are listed 'Best First'.
Re^2: Finding out which of a list of patterns matched
by lemnisca (Sexton) on Jan 23, 2006 at 00:49 UTC
    Are you sure of that? I'm only fairly new to Perl so I could be interpreting this wrongly, but in the Camel book (which I've been reading) it says:

    "...But the ordering of the alternatives only matters at a given position. The outer loop of the Engine does left-to-right matching, so the following always matches the first Sam:"
    "'Sam I am,' said Samwise" =~ /(Samwise|Sam)/; # $1 eq "Sam"
    which suggests to me that the match earliest in the text will be found. If that isn't the case it's going to make my life a whole lot more difficult...:P

      Ho, ho, you are right! I don't know what I was thinking.