On Jun 26, 9:57 am, [EMAIL PROTECTED] (Pat Rice) wrote:
> Hi all
> I'm wondering if there is a nice way to parse this data, as in is
> there any module that could handle this type of data, as in the was it
> is presented? so that I can repeat is itn a tree like structure in
> HTML ?
>
> so I can pic out the tree like structure and replicate it in some way
> so that I can put it in an array or into a database ?? so i could pick
> out the data I want.
>
>   \==+Interface :
>             |----Link State.........................................Down
>              \==+SCSI Interface :
>                |----Name............................................vmhba1
>                |----Console Name....................................scsi1
>                |----Queue Depth.....................................4096
>                \==+PCI Device :
>                   |----Bus..........................................0x0b
>                   |----Slot.........................................0x00
>                   |----Function.....................................0x00
>                \==+Scsi Stats :
>                   |----Commands.....................................48632378
>                   |----Blocks Read..................................1862894689
>                   |----Blocks Written...............................858120919
>                   |----Aborts.......................................0
>
> Thanks in advance
> Pat

I had a similar situation and wrote some routines that I've used
for various purposes since.

If you can stand modifying your data to be a strictly indented
list, then you could use these:  'make_paths' parses the indented
list, and 'traverse_paths' iterates through the result.

#!/usr/local/bin/perl
use warnings;
use strict;

my $paths = do{ local $/; <DATA> }; # slurp

print "<ul>\n".traverse_paths( $paths, "\t" )."</ul>\n";

sub traverse_paths {
    my( $paths, $tab ) = @_;
    $paths = make_paths( $paths ) unless ref $paths;
    $tab ||= '';

    my @ret;

    foreach my $path ( @$paths ) {

        my $rest;
        if( ref $path ) {
            $rest  = $path->[1];  # do first :-)
            $path  = $path->[0];
        }
        push @ret, "$tab<li>$path";
        if( $rest ) {
            push @ret,
                "\n$tab<ul>\n" .
                traverse_paths( $rest, "$tab\t" ) .
                "$tab</ul></li>\n";
        }
        else {
            push @ret, "</li>\n";
        }

    }

    join "", @ret;  # returned

}

sub make_paths {
    my( $raw, $char, $num ) = @_;

    return unless defined $raw;
    $char = ' ' unless defined $char;
    $num  = 4   unless defined $num;

    my @cooked;
    my @a = split "\n", $raw;

    for my $i ( 0 .. $#a ) {

        my( $indent, $string ) = $a[ $i ] =~ /^($char*)(.*)/;

        my $len = length( $indent );
        my( $lookahead ) = $i == $#a ? '': $a[ $i+1 ] =~ /^($char*)/;
        $lookahead = length( $lookahead ) > $len;
        my $level = $len/$num;
        my $dref = [EMAIL PROTECTED];
        $dref = $dref->[-1][-1] for 1 .. $level;

        push @$dref, $lookahead ? [$string,[]] : $string;

    }
    return [EMAIL PROTECTED];

}

__DATA__
Interface :
    Link State.........................................Down
    SCSI Interface :
        Name............................................vmhba1
        Console Name....................................scsi1
        Queue Depth.....................................4096
        PCI Device :
            Bus..........................................0x0b
            Slot.........................................0x00
            Function.....................................0x00
            Scsi Stats :
                Commands.....................................48632378
                Blocks Read..................................
1862894689
                Blocks Written...............................858120919
                Aborts.......................................0

__RESULT__
<ul>
        <li>Interface :
        <ul>
                <li>Link
State.........................................Down</li>
                <li>SCSI Interface :
                <ul>
 
<li>Name............................................vmhba1</li>
                        <li>Console
Name....................................scsi1</li>
                        <li>Queue
Depth.....................................4096</li>
                        <li>PCI Device :
                        <ul>
 
<li>Bus..........................................0x0b</li>
 
<li>Slot.........................................0x00</li>
 
<li>Function.....................................0x00</li>
                                <li>Scsi Stats :
                                <ul>
 
<li>Commands.....................................48632378</li>
                                        <li>Blocks
Read..................................1862894689</li>
                                        <li>Blocks
Written...............................858120919</li>
 
<li>Aborts.......................................0</li>
                                </ul></li>
                        </ul></li>
                </ul></li>
        </ul></li>
</ul>


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


Reply via email to