perl

 view release on metacpan or  search on metacpan

pod/perlop.pod  view on Meta::CPAN

With or without parentheses, an empty list is returned upon failure.

Examples:

    open(TTY, "+</dev/tty")
       || die "can't access /dev/tty: $!";

    <TTY> =~ /^y/i && foo();       # do foo if desired

    if (/Version: *([0-9.]*)/) { $version = $1; }

    next if m#^/usr/spool/uucp#;

    # poor man's grep
    $arg = shift;
    while (<>) {
       print if /$arg/;
    }
    if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/))

This last example splits C<$foo> into the first two words and the
remainder of the line, and assigns those three fields to C<$F1>, C<$F2>, and
C<$Etc>.  The conditional is true if any variables were assigned; that is,
if the pattern matched.

The C</g> modifier specifies global pattern matching--that is,
matching as many times as possible within the string.  How it behaves
depends on the context.  In list context, it returns a list of the
substrings matched by any capturing parentheses in the regular
expression.  If there are no parentheses, it returns a list of all
the matched strings, as if there were parentheses around the whole
pattern.

In scalar context, each execution of C<m//g> finds the next match,
returning true if it matches, and false if there is no further match.
The position after the last match can be read or set using the C<pos()>
function; see L<perlfunc/pos>.  A failed match normally resets the
search position to the beginning of the string, but you can avoid that
by adding the C</c> modifier (for example, C<m//gc>).  Modifying the target
string also resets the search position.

=item C<\G I<assertion>>

You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
zero-width assertion that matches the exact position where the
previous C<m//g>, if any, left off.  Without the C</g> modifier, the
C<\G> assertion still anchors at C<pos()> as it was at the start of
the operation (see L<perlfunc/pos>), but the match is of course only
attempted once.  Using C<\G> without C</g> on a target string that has
not previously had a C</g> match applied to it is the same as using
the C<\A> assertion to match the beginning of the string.  Note also
that, currently, C<\G> is only properly supported when anchored at the
very beginning of the pattern.

Examples:

    # list context
    ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);

    # scalar context
    local $/ = "";
    while ($paragraph = <>) {
        while ($paragraph =~ /\p{Ll}['")]*[.!?]+['")]*\s/g) {
            $sentences++;
        }
    }
    say $sentences;

Here's another way to check for sentences in a paragraph:

    my $sentence_rx = qr{
        (?: (?<= ^ ) | (?<= \s ) )  # after start-of-string or
                                    # whitespace
        \p{Lu}                      # capital letter
        .*?                         # a bunch of anything
        (?<= \S )                   # that ends in non-
                                    # whitespace
        (?<! \b [DMS]r  )           # but isn't a common abbr.
        (?<! \b Mrs )
        (?<! \b Sra )
        (?<! \b St  )
        [.?!]                       # followed by a sentence
                                    # ender
        (?= $ | \s )                # in front of end-of-string
                                    # or whitespace
    }sx;
    local $/ = "";
    while (my $paragraph = <>) {
        say "NEW PARAGRAPH";
        my $count = 0;
        while ($paragraph =~ /($sentence_rx)/g) {
            printf "\tgot sentence %d: <%s>\n", ++$count, $1;
        }
    }

Here's how to use C<m//gc> with C<\G>:

    $_ = "ppooqppqq";
    while ($i++ < 2) {
        print "1: '";
        print $1 while /(o)/gc; print "', pos=", pos, "\n";
        print "2: '";
        print $1 if /\G(q)/gc;  print "', pos=", pos, "\n";
        print "3: '";
        print $1 while /(p)/gc; print "', pos=", pos, "\n";
    }
    print "Final: '$1', pos=",pos,"\n" if /\G(.)/;

The last example should print:

    1: 'oo', pos=4
    2: 'q', pos=5
    3: 'pp', pos=7
    1: '', pos=7
    2: 'q', pos=8
    3: '', pos=8
    Final: 'q', pos=8

Notice that the final match matched C<q> instead of C<p>, which a match
without the C<\G> anchor would have done.  Also note that the final match
did not update C<pos>.  C<pos> is only updated on a C</g> match.  If the
final match did indeed match C<p>, it's a good bet that you're running an
ancient (pre-5.6.0) version of Perl.

A useful idiom for C<lex>-like scanners is C</\G.../gc>.  You can
combine several regexps like this to process a string part-by-part,
doing different actions depending on which regexp matched.  Each
regexp tries to match where the previous one leaves off.

    $_ = <<'EOL';
        $url = URI::URL->new( "http://example.com/" );
        die if $url eq "xXx";
    EOL

    LOOP: {
        print(" digits"),       redo LOOP if /\G\d+\b[,.;]?\s*/gc;
        print(" lowercase"),    redo LOOP
                                      if /\G\p{Ll}+\b[,.;]?\s*/gc;
        print(" UPPERCASE"),    redo LOOP
                                      if /\G\p{Lu}+\b[,.;]?\s*/gc;
        print(" Capitalized"),  redo LOOP
                                if /\G\p{Lu}\p{Ll}+\b[,.;]?\s*/gc;
        print(" MiXeD"),        redo LOOP
                                         if /\G\pL+\b[,.;]?\s*/gc;
        print(" alphanumeric"), redo LOOP
                              if /\G[\p{Alpha}\pN]+\b[,.;]?\s*/gc;
        print(" line-noise"),   redo LOOP if /\G\W+/gc;



( run in 4.395 seconds using v1.01-cache-2.11-cpan-b301d465b3d )