Problem with Range Operator sequence number

Discussion in 'Perl' started by Paul Porcelli, Jul 14, 2004.

  1. I have the following code(excerpt) which grabs some lines from a
    syslog
    file and adds any found in the range to an array.

    @lines=();@vvlines=();
    $t = new Net::Telnet (Timeout => 30, Prompt => '/<\d+\>/');
    $t->open($t3);
    $t->login($username, $passwd);
    @lines=$t->cmd("tail -1000 syslog");
    $t->close;
    foreach (@lines) {
    push(@vvlines,$_) if /Volume vol[1-2] verification started/ ..
    /Volume vol[1-2] verification ended/;
    }

    This piece of code is part of a foreach loop which iterates two times.
    I have a problem with the following situation:

    Pass 1 of the foreach finds the left side of the range but never finds
    the right side. This means that the range operator is still true.

    Pass 2 of the foreach now pushes all the lines onto the vvlines array
    as the range operator is still true. This is not desired. I only want
    to push the lines after the left side is matched.

    How do I reset the range operator to false between each iteration of
    the foreach loop ?

    Many thanks.

    Paul Porcelli
     
    Paul Porcelli, Jul 14, 2004
    #1
    1. Advertising

  2. (Paul Porcelli) wrote in message news:<>...
    > I have the following code(excerpt) which grabs some lines from a
    > syslog
    > file and adds any found in the range to an array.
    >
    > @lines=();@vvlines=();
    > $t = new Net::Telnet (Timeout => 30, Prompt => '/<\d+\>/');
    > $t->open($t3);
    > $t->login($username, $passwd);
    > @lines=$t->cmd("tail -1000 syslog");
    > $t->close;
    > foreach (@lines) {
    > push(@vvlines,$_) if /Volume vol[1-2] verification started/ ..
    > /Volume vol[1-2] verification ended/;
    > }
    >
    > This piece of code is part of a foreach loop which iterates two times.
    > I have a problem with the following situation:
    >
    > Pass 1 of the foreach finds the left side of the range but never finds
    > the right side. This means that the range operator is still true.
    >
    > Pass 2 of the foreach now pushes all the lines onto the vvlines array
    > as the range operator is still true. This is not desired. I only want
    > to push the lines after the left side is matched.
    >
    > How do I reset the range operator to false between each iteration of
    > the foreach loop ?


    Its difficult for me to quite understand the problem correctly, but
    what I think you are asking is you want to push all the lines in
    @lines immediately following the first range and the last one before
    the end of the range. Richard Gration has posted one way to do this.

    However, your start and end regexes will never match your text the way
    they are now.

    /\QVolume vol[1-2] verification started\E/
    ^ ^
    You need to precede and end the regex with \Q and \E to escape the
    brackets or else, simply backslah the brackets, '\[1-2\]', because
    perl thinks they define a character class otherwise.

    Chris
     
    Chris Charley, Jul 14, 2004
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Paul Porcelli
    Replies:
    3
    Views:
    526
    Eric Amick
    Jul 16, 2004
  2. Replies:
    46
    Views:
    992
    Antoon Pardon
    Jul 25, 2006
  3. stef mientki
    Replies:
    13
    Views:
    677
    stef mientki
    Oct 20, 2007
  4. Paul Porcelli

    Problem with Range Operator sequence number

    Paul Porcelli, Jul 14, 2004, in forum: Perl Misc
    Replies:
    7
    Views:
    130
    Sandman
    Jul 15, 2004
  5. Paul Porcelli

    Problem with Range Operator sequence number

    Paul Porcelli, Jul 14, 2004, in forum: Perl Misc
    Replies:
    7
    Views:
    152
    Eric Amick
    Jul 16, 2004
Loading...

Share This Page