in reply to Parsing and Obtaining Values from output

Hi!

It would have been helpful if you have shown us the code you have already written. Otherwise it just could be general like "do it stepwise":

Of course there are many other ways to do it, and that's why it is so important for you to show us your tries - so we could give you specific help to the way you attack the problem ...

HTH, Rata

Update: replaced /[(.*?)]/ by /\[(.*?)\]/ to escape the metacharacters ... missed that point :-( Thanks AnomalousMonk for the correction!

Replies are listed 'Best First'.
Re^2: Parsing and Obtaining Values from output
by AnomalousMonk (Archbishop) on Apr 12, 2011 at 08:16 UTC

    /[(.*?)]/ won't match anything having to do with square brackets. It is a character set (the  [] metacharacters) consisting of the  ( ) . * ? characters.

    Update: Something like  m{ \[ ([^]]*) \] }xms might be useful:

    >perl -wMstrict -le "my $s = 'foo [bar baz] quux [%^&*] boff [] biff'; my @bracketed = $s =~ m{ \[ ([^]]*) \] }xmsg; print qq{'$_'} for @bracketed; @bracketed = $s =~ m{ \[ [^]]* \] }xmsg; print qq{'$_'} for @bracketed; " 'bar baz' '%^&*' '' '[bar baz]' '[%^&*]' '[]'
Re^2: (weird dup - please reap) Parsing and Obtaining Values from output
by AnomalousMonk (Archbishop) on Apr 12, 2011 at 08:28 UTC

    /[(.*?)]/ won't match anything having to do with square brackets. It is a character set (the  [] metacharacters) consisting of the  ( ) . * ? characters.

      Hi
      my @array1; my $data = "[0|0|{A=145,B=2,C=12,D=18}|!][0|0|{A=167,B=2,C=67,D=1 +7}|.1iit][196|0|{A=244,B=6,C=67,D=12}|10:48AM][204|0|{A=9,B=201,C=61, +D=11}|Calculator][66|0|{A=145,B=450,C=49,D=14}|phone]0|0|{A=145,B=2,C +=12,D=18}|!0|0|{A=167,B=2,C=67,D=17}|.1iit196|0|{A=244,B=6,C=67,D=12} +|10:48AM204|0|{A=9,B=201,C=61,D=11}|Calculator66|0|{A=145,B=450,C=49, +D=14}|phone"; my $high = 0; my @values = split(/\[([^\]]+)\]/,$data) ; print "Values is @values \n"; foreach(@values) { #I want the value that preceeds the first occurence of | in ea +ch array element, i.e 0,0,196,204,etc.. my ($conf,$rest)= split(/\|/,$_) ; print "Conf is $conf \n"; print "Rest is $rest \n"; push(@array1, $conf ); push (@array2, $rest); print "Array 1 is @array1 \n"; print "Array 2 is @array2 \n"; } $conf = highest(@array1); my $i=0; #I want the index value of the element that contains the highest conf +value..in this case 204 for (@myarray1) { last if $conf eq $_; $i++; }; print "$conf=$i\n"; #I want to print the rest of the string that was split in the sam +e index position, $rest = @array2[$i]; print "Rest is $rest \n"; # To get the higest conf value sub highest { my @data = @_; my $high = 0; for(@data) { $high = $_ if $_ > $high; } $high; }
      I tried this..but I'm not getting anywhere close to the output that I need... THanks, Perllace

        Hi

        note: the following is not intended to be a fix to your program; instead I try to show you a few steps you could have done to identify faulty/suspicious parts of your program...

        First, you have not followed the golden rule to

        use strict; use warnings;
        Then you would have found out some obvious mistakes like
        for (@myarray1) { last if $conf eq $_; $i++; };
        Secondly, you use debug-output, which is fine ... however it is not detailed enough; e.g.
        print "Values is @values \n";
        Here you can't easily see that the array @values might not contain what you want (but many empty elements addtionally). This leads to many unitialized values in the further run of your program. You could use something like print join("XXX\n", @values);

        If you look at your debug-output to more detail, you would see that the first (non-empty) element of @values is

        0|0|{A=145,B=2,C=12,D=18}|!
        and
        Conf is 0 Rest is 0
        ... so your split is not working as expected ...

        When debugging code, you should start from the beginning. Solve the points shown above. And only when you found a solution for those, continue by looking at the rest of the program. It will be much easier that way.

        HTH, Rata