Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: Printing out matches for two regular expressions

by choroba (Bishop)
on Oct 22, 2017 at 09:08 UTC ( #1201830=note: print w/replies, xml ) Need Help??

in reply to Printing out matches for two regular expressions

Why do you set $/ to a space? It reads the input file word by word and can never match the second part of the expression, it never sees the #cats together with their fin.

To find all the matches on one line, use while instead of if.

Finally, the second capture group populates $2, even after the vertical bar. Use a restart pattern to always start populating $1 in alternatives:

while (m/(?|(\d)+?|(?<=#)(.*?)(?= fin))/g) {

Which could be simplified to

while (m/(?|(\d)+?|#(.*?) fin)/g) {

Update: Are you sure about (\d)+? ? Have you tested it with numbers of more than one digit? You probably wanted just plain (\d+) .

($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

Replies are listed 'Best First'.
Re^2: Printing out matches for two regular expressions
by Maire (Beadle) on Oct 22, 2017 at 10:07 UTC

    Brilliant! Thank you very much for your help!

    Also thanks for your tip about setting $/ to a space. In an earlier version of the script, I was trying to just locate multiple numbers across several lines; setting $/ to a space stopped the script from only printing the first number on each line. However, I realise now that it is inappropriate for the current task. Thanks again!

      The only thing I would add to choroba's comprehensive comments is that you might consider adding some kind of boundary assertion to the  fin delimiter pattern: see what happens when the  \b assertion in the match used below is omitted. I agree that the look-arounds don't seem needed, so I've left them out. (I use  \x23 instead of  # in my pattern only because my REPL doesn't like octothorpes.)

      c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; my @lines = ( 'The 2 cats and the dog.', 'The 8 cats and the 6 dogs.', 'The 3 pigs and the 2 sheep.', '', '#story fin #cats and dogs fin #sheep fin', 'blah yada', '#sharkfin soup fin #fish fingers fin', '9 fleas, 87 ticks, 654 lice.', '42 cats #some sheep fin and 1 dog', ); ;; for my $line (@lines) { printf qq{'$line' -> }; ;; my $parsed = my @extracted = $line =~ m{ (?| (\d+) | \x23 (.*?) \s+ fin \b) }xmsg; ;; print $parsed ? map qq{'$_' }, @extracted : 'nothing parsed'; } " 'The 2 cats and the dog.' -> '2' 'The 8 cats and the 6 dogs.' -> '8' '6' 'The 3 pigs and the 2 sheep.' -> '3' '2' '' -> nothing parsed '#story fin #cats and dogs fin #sheep fin' -> 'story' 'cats and dogs' +'sheep' 'blah yada' -> nothing parsed '#sharkfin soup fin #fish fingers fin' -> 'sharkfin soup' 'fish finger +s' '9 fleas, 87 ticks, 654 lice.' -> '9' '87' '654' '42 cats #some sheep fin and 1 dog' -> '42' 'some sheep' '1'

      Give a man a fish:  <%-{-{-{-<


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1201830]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2018-08-16 19:23 GMT
Find Nodes?
    Voting Booth?
    Asked to put a square peg in a round hole, I would:

    Results (171 votes). Check out past polls.