Richard Lee wrote:
> In the book "elements of programming perl", below program is presented.
> 
> I don't really understand these 2 lines. can someone break it down for 
> me please?
> 
> $pattern = '.*(?:' . join('|', @ARGV) . ')';
> 
> $pattern = join('', map{"(?=.*$_)"} @ARGV);
> 
> 
> #!/usr/bin/perl
> 
> 
> use strict;
> use warnings;
> 
> my $faqdir = '/usr/lib/perl5/5.10.0/pod/';
> my($opt_f,$opt_or,$pattern);
> 
> die "no keywords specified\n" unless @ARGV;
> 
> while ( $ARGV[0] =~ /^-/ ) {
>      $_ = $ARGV[0];
>      if ( /^-or$/ ) { $opt_or = 1; shift @ARGV; next }
>      if ( /^-f$/  ) { $opt_f  = 1; shift @ARGV; next }
> die<<HERE;
> illegal option: $_
> usage: faqgrep [-f] [-or] [keywords...]
> HERE
> }
> 
> if ( $opt_or) {
>      $pattern = '.*(?:' . join('|', @ARGV) . ')';
> } else {
>      $pattern = join('', map{"(?=.*$_)"} @ARGV);
> }
> opendir(FAQDIR,$faqdir) or die "can't open $faqdir $!";
> my @faqs = grep /faq/, readdir FAQDIR;
> closedir FAQDIR;
> 
> foreach my $faq ( @faqs ) {
>     open ( FAQ, "$faqdir/$faq" ) or die "can't $!";
>     while ( <FAQ> ) {
>         if (s/^=head2($pattern)/$1/io) {
>              print "$faq:$_";
>              if ( $opt_f ) {
>                    while ( <FAQ> ) {
>                        last if m/^=head(?!$pattern)/io;
>                        print;
>                    }
>              }
>         }
>     }
> }

It's always confusing when a program written in one language (here, Perl)
creates a program in another (this script is building regular expressions).

Look at the strings those lines are generating.

use strict;
use warnings;

local @ARGV = qw/A B C/;

my $or_pattern = '.*(?:' . join('|', @ARGV) . ')';
my $and_pattern = join('', map{"(?=.*$_)"} @ARGV);

print "Or pattern:  $or_pattern\n";
print "And pattern: $and_pattern\n";

**OUTPUT**

Or pattern:  .*(?:A|B|C)
And pattern: (?=.*A)(?=.*B)(?=.*C)

Now can you understand those as regular expressions? The former uses
non-capturing parentheses (?: ... ) to find any one of the values anywhere in
the string, while the latter uses a lookahead (?= ... ) to find a point in the
string after which all three of the values appear anywhere.

HTH,

Rob

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to