Rob Dixon wrote:
> 
> Hello John.

Well hello Rob,

> John W. Krahn wrote:
> >> How about this:   :-)
> >
> > Oops!  slight change.  :-)
> >
> > use strict;
> > use warnings;
> >
> > my %zone;
> >
> > # get zone names from named.conf type files
> > @ARGV = qw( one.txt two.txt three.txt );
> > /^zone\b[^"]*"([^"]+)/ and push @{$zone{$1}}, "$ARGV, " while <>;
> 
> I like:
> 
>     /^zone\b/ and /"(.+?)"/ and push @{$zone{$1}}, "$ARGV," while <>;

I still like /"([^"]+)/ better than /"(.+?)"/.  :-)


> Also you don't need a space after the comma if you're stringifying the
> array in the final print().
> 
> > # adjust output format
> > for ( keys %zone ) {
> >     $zone{$_}[-1] =~ s/, $//;
> >     $zone{$_}[-2] =~ s/, $/ and / if @{$zone{$_}} > 1;
> >     }
> 
> Hmm. It works but, being a purist, I don't like using 'decorated'
> filenames as hash keys. I came up with this:
> 
>     my $files;
>     $files = join ' and ', (join ', ', @a), $_ for pop @files;

I think you mean:

     $files = join ' and ', (join ', ', @files), $_ for pop @files;

But that will prepend ' and ' if there is only one file name in @files. 
It also doesn't seem right to use a loop just to force 'pop @files' to
evaluate first.


> An interesting point here. I don't think there's a way to persuade
> loops to return a value.

I think you mean "I don't think there's a way to persuade loops to
return a scalar." and no, you have to use join/concatenation to
transform a list/array to a scalar.


>     $a = do { 'abc' foreach (1) };
> 
> gives 'useless use of a constant' for 'abc', but it seems a reasonable
> thing to do.

It does?

> Any ideas?

Sorry, no.

> Another option to all this is to use the field separator:
> 
>     local $" = ', ';
> 
> leaving only the ultimate ' and ' separator as a special case
> 
> > # report which zone names were found
> > @ARGV = 'zonelist.input';
> > while ( <> ) {
> >     chomp;
> >     if ( @{$zone{$_}} ) {
> 
> One hole, two programmers! If the zone wasn't found then $zone{$_}
> is undefined and Perl dies trying to dereference it.

It will if strictures are enabled.  :-)

> That's why I postponed the dereference in my V2. How about:

      if ( ref $zone{$_} and @{$zone{$_}} ) {


>     if (my $zone = $zone{$_} and @$zone) {
>         print "Zone $_ was found in files ", @$zone, "\n";
>     }
> 
> >         print "Zone $_ was found in files ", @{$zone{$_}}, "\n";
> >         }
> >     else {
> >         print "Zone $_ was not found\n";
> >         }
> >     }
> >
> > __END__
> 
> Did somebody say this was a beginners' group :-?

Don't forget -- TMTOWTDI


John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to