Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Need help in parsing an input

by sandeepda (Novice)
on Jan 17, 2013 at 11:12 UTC ( #1013759=perlquestion: print w/ replies, xml ) Need Help??
sandeepda has asked for the wisdom of the Perl Monks concerning the following question:

I am executing a command it is returning me something like this
name ip port ------------------------------------ http-listener-1 * 6712 http-listener-2 * 8709
I have a subroutine getListenerName($porttobeChecked) This subroutine returns me the name of the listener if i pass a port. Eg:If $porttobechecked=6712 I want to return an array a[0]=TRUE and a1=http-listener-1(listener name) If port to be checked is 4516..I want to return an array a[0]=FALSE and a1=null How can i parse this output.Any help appreciated?

Comment on Need help in parsing an input
Download Code
Re: Need help in parsing an input
by roboticus (Canon) on Jan 17, 2013 at 11:46 UTC

    sandeepda:

    Parsing the strings ought to be easy. It prefaces the interesting data with a bar of hyphens, and the name, IP and port ought not have whitespace. So you can simply read and discard lines until you find the line of hyphens. After that, you can use a simple split to break out the individual fields:

    while (my $line = <$FH>) { next if $line =~ /^-----/; my ($name, $ip, $port) = split /\s+/, $line; print "Name: $name, IP: $ip, Port: $port\n"; }

    Other alternatives include using substr or unpack for breaking up lines with fixed-length fields.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re: Need help in parsing an input
by Athanasius (Monsignor) on Jan 17, 2013 at 11:49 UTC

    Hello sandeepda, and welcome to the Monastery!

    If I’ve understood your question correctly, the following script should give you an idea of how to proceed:

    #! perl use Modern::Perl; my %ports; while (<DATA>) { next unless /^http/; my @records = split /\s+/; if (exists $ports{$records[2]}) { warn "Attempt to give port $records[2] a second name"; } else { $ports{$records[2]} = $records[0]; } } say join(' and ', get_listener_name($_)) for 6712, 4516; sub get_listener_name { my ($port_to_be_checked) = @_; my @results = ('FALSE', 'a1=null'); if (exists $ports{$port_to_be_checked}) { @results = ('TRUE', 'a1=' . $ports{$port_to_be_checked} . '(li +stener name)'); } return @results; } __DATA__ name ip port ------------------------------------ http-listener-1 * 6712 http-listener-2 * 8709

    Output:

    21:40 >perl 486_SoPW.pl TRUE and a1=http-listener-1(listener name) FALSE and a1=null 21:40 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Thanks Athanasius; I am trying it to make generic I am getting this output as array @outputarray also output is synamic the name and post can change How can i parse this where outputarray[0]=name ip port outputarray[0]=------------------------------------ outputarray[0]=http-listener-1 * 6712
      name ip port ------------------------------------ http-listener-1 * 6712 http-listener-2 * 8709

        Hello again sandeepda,

        I’m sorry, but I don’t understand what you are asking.

        The only thought that comes to mind is that you may be unfamiliar with Perl’s special DATA filehandle. But I used that only for convenience. If you already have the data in an array, you would adapt the opening of my script as follows:

        for (@existing_array) {

        On the other hand, if the data is in a file (named, say, “ports.dat”), then you would begin like this:

        my $file = 'ports.dat'; open(my $fh, '<', $file) or die "Cannot open '$file' for reading: $!"; while (<$fh>) {

        If this doesn’t answer your question, please explain what you are asking with your version of the code together with sample input and the output you want. See How do I post a question effectively?

        Hope that helps,

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1013759]
Approved by Athanasius
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (13)
As of 2014-09-30 14:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (373 votes), past polls