in reply to Unique Array Entries

Neat problem! I like Corion's answer, but here is another way to try out. The idea is to split each entry on the slash to create an array. Then you eval that array into a hash data structure:
use strict; use Data::Dumper; $Data::Dumper::Indent = 1; my %thingy; my @lines = ... # insert your data here for (sort @lines) { my ($type,$stuff) = $_ =~ /([A-Z]):\s+(.*)/; my @parts = split('/',$stuff); push @parts,''; my $str = q|$thingy{'| . shift(@parts) . q|'}|; for my $part (@parts) { $str .= qq|->{'$part'}|; } eval $str; } print Dumper \%thingy;
This produces a data structure like so:
$VAR1 = {
  'Location' => {},
  'Topology' => {
    'IPClassA' => {
      'Device' => {
        'log_ratio' => {},
        'poll_interval' => {}
      },
      'Device = 2' => {
        'Port' => {
          'ifPhysAddress' => {},
          'poll_interval' => {}
        },
        'is_managed' => {},
        'poll_interval' => {}
      }
    },
    'IPClassC' => {
      'Device' => {
        'poll_interval' => {}
      }
    }
  }
}; 
Now all you need is some code to turn the data structure back into a list of paths:
my (@list,$flat); flatten($_,$thingy{$_}) foreach keys %thingy; sub flatten { my ($key,$rest) = @_; unless ($rest) { push @list,$flat; undef $flat; return; } $flat .= "$key/"; flatten(%$rest); } print Dumper \@list;
But this does not work correctly:
$VAR1 = [ 'Location/', 'Topology/IPClassA/Device/log_ratio/' ];
Sorry, but i am at my wit's end on this one (Saturday morning laziness :D). At this point, my 'answer' turns into a question: 'How do you recursively "flatten" this data structure?'

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)

Replies are listed 'Best First'.
Re: (jeffa) Re: Unique Array Entries
by Corion (Patriarch) on Mar 02, 2002 at 16:40 UTC

    The idea is, once you have that structure, to walk down that structure, and each time you end up in a leaf (that is, you find no more children), to output the whole path you've taken :

    # Just walk the created structure, and output # the name whenever we hit a leaf : sub walk { my ($hashref, $path) = @_; #print $path,"\n"; my @keys = keys %$hashref; if (@keys) { walk( $hashref->{$_}, $path . "/$_" ) foreach (@keys); } else { print "$path\n"; }; }; walk( \%thingy, "" );

    Of course, the whole method of hashes has the problem of not maintaining the order of the keys, but it's not clear if that will be a problem for The_Rev :-))

    perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web

      I think that your first snippet would work except for the fact that it does retain that typo: (Topology/Device=2/Port) Is there anyway to disregard that and have the following:

      Topology/IPClassA/Device/log_ratio Topology/IPClassA/Device/poll_interval Topology/Device=2/poll_interval Topology/Device=2/is_managed Topology/Device=2/Port/ifPhysAddress Topology/Device=2/Port/poll_interval Topology/IPClassC/Device/poll_interval Location

      I am traversing an hlist that I have built, and would like to utilize all of the unique strings elsewhere.

      Thanks

      2002-02-02 Edit by The Perlmonks Node Pixies : Added formatting

        I'm not completely sure I understand you. The output of both versions, jeffas and mine, is eight lines, and the line you don't seem to want is not included in either (both versions output eight lines, your sample output had nine lines. As far as I understand you, you want eight lines of output. Both versions should be easily reusable within any script, if you replace the print statements with some other statement collecting the strings into an array.

        perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
        I also forgot to mention that my strings aren't static and they will change according to the input.
        I also forgot to mention that these strings are going to be created dynamically, and won't always appear as in my example. Thanks