Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Multiline match

by arunbhargav (Novice)
on May 23, 2013 at 16:14 UTC ( #1034971=perlquestion: print w/ replies, xml ) Need Help??
arunbhargav has asked for the wisdom of the Perl Monks concerning the following question:

I have a multiline string like this
my $output = "update patch-5.1.1.21510";
I was trying to match the string "patch-5.1.1.21510.gpg" to the above multiline string. I tried the pattern modifier for multiline match, but couldnt match it. All I had to do was use grep which I dont think is needed here.
my @array = split('\n',$output); if ( grep { $_ =~ /$PatchPath/ } @array ) { print "Match found\n"; }
What am I missing here?

Comment on Multiline match
Select or Download Code
Re: Multiline match
by LanX (Canon) on May 23, 2013 at 16:20 UTC
    > What am I missing here?

    did you confuse /s and /m ?

    see perlre

    m

    Treat string as multiple lines. That is, change "^" and "$" from matching the start or end of the string to matching the start or end of any line anywhere within the string.

    s

    Treat string as single line. That is, change "." to match any character whatsoever, even a newline, which normally it would not match.

    Used together, as /ms, they let the "." match any character whatsoever, while still allowing "^" and "$" to match, respectively, just after and just before newlines within the string.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

Re: Multiline match
by hdb (Prior) on May 23, 2013 at 16:22 UTC

    Whatever you are trying: "patch-5.1.1.21510.gpg" will not match to your $output because of the ".gpg" extension...

      patch-5.1.1.21510 is a substring of patch-5.1.1.21510.gpg, hence it should match. All it wants to match is patch-5.1.1.21510, it doesnt care about gpg
        But your explanation was the other way round.

        plz try to show us a reproducible code example instead of wording.

        Cheers Rolf

        ( addicted to the Perl Programming Language)

        hdb's point was your code boils down to 'patch-5.1.1.21510' =~ /patch-5.1.1.21510.gpg/;, which is backwards from what you need. The behavior you seek would look more like

        my @array = split('\n',$output); if ( grep { 'patch-5.1.1.21510.gpg' =~ /\Q$_\E/ } @array ) { print "Match found\n"; }
        Though, as implemented, you'd have problems because of whitespace. For this case, you'd probably be better off using index.

        #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Re: Multiline match
by davido (Archbishop) on May 23, 2013 at 16:35 UTC

    It might be helpful for us to know what $PatchPath contains. It's hard to debug a regex that we can't see, unless you're saying that your pattern looks like patch-5.1.1.21510.gpg, which would be silly because your target text doesn't have the ".gpg" suffix. Please post your actual pattern.


    Dave

      I dont how my following post got missed Sorry about the confusion, the following is the code I have been trying my $str = "update patch-5.1.1.21510"; my $patch = "patch-5.1.1.21510.gpg"; if ($str =~/$patch/ms) { print "Yes \n"; }

        Let's look more closely:

        my $str = "update patch-5.1.1.21510" my $patch = "patch-5.1.1.21510.gpg"; if( $str =~ /$patch/ms ) { print "Your Perl is broken!!!\n"; }

        Your target string is "update patch-5.1.1.21510". Your pattern requires "gpg" at the end. There's no "gpg" in your target string. If that produced a match, it would be an indication that your Perl is broken, because it should not match. Your pattern requires "gpg" to be present in the target string. That requirement isn't met. NO MATCH.

        Additionally, the "." character is a metacharacter that matches absolutely anything (that's what the /s modifier is doing for you). So even if you removed the 'gpg' from your pattern, it would still fail to match the target string because of the trailing '.' in the pattern, which would need to consume one more character at the end of your target string. Here's a target string that would match your pattern:

        my $str = "update patch-5A1B1C21510\ngpg"; # ;)

        You might want something like this:

        my $patch = "patch-5.1.1.21510"; if( $str =~ m/\Q$patch\E/ ) { .... }

        Here we're removing the "metacharacter" status of the dot, and also not requiring a 'gpg' extension.


        Dave

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1034971]
Approved by davido
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (10)
As of 2014-09-18 18:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (120 votes), past polls