Hello John.

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 <>;

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;

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

    $a = do { 'abc' foreach (1) };

gives 'useless use of a constant' for 'abc', but it seems a reasonable
thing to do. Any ideas?

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. That's why I
postponed the dereference in my V2. How about:

    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 :-?

Cheers,

Rob




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

Reply via email to