Newbie question - trying to get a handle on until text / line skipping

Discussion in 'Perl' started by Chris Vidal, Jul 15, 2003.

  1. Chris Vidal

    Chris Vidal Guest

    Lets say I have a ascii text file named sumfil and its contents are as
    follows :

    1
    2
    3
    a
    b
    c

    I dont want to act on any line before the line containing "a". The below
    doesnt work. I sit at the command line I think in an infinite loop.

    #! /opt/perl5/bin/perl
    $tfil = "sumfil";
    open (IN, "$tfil") or die;
    while (defined($line = <IN>)) {
    until ($line =~ "3") {
    next;
    } # end until
    chomp $line;
    print "$line\n"
    } #end while
     
    Chris Vidal, Jul 15, 2003
    #1
    1. Advertising

  2. Chris Vidal

    Guest

    "Chris Vidal" <> wrote in message news:<bf1f24$>...
    > Lets say I have a ascii text file named sumfil and its contents are as
    > follows :
    >
    > 1
    > 2
    > 3
    > a
    > b
    > c
    >
    > I dont want to act on any line before the line containing "a". The below
    > doesnt work. I sit at the command line I think in an infinite loop.
    >
    > #! /opt/perl5/bin/perl
    > $tfil = "sumfil";
    > open (IN, "$tfil") or die;
    > while (defined($line = <IN>)) {
    > until ($line =~ "3") {
    > next;
    > } # end until
    > chomp $line;
    > print "$line\n"
    > } #end while


    You have misunderstood what until means in Perl.

    until (EXPR) {BLOCK}

    is a _looping_ construct.

    _Each_ time the above is executed it will repeatedly do BLOCK until
    EXPR is true. If BLOCK cannot make EXPR become false and does not
    break out of the loop by some other means then this is an infinite
    loop.

    You you evidently believe until is a simple negated condition with
    memory. i.e. it does something once each time it is executed until
    some condition is true and thereafter never does it again.

    In Perl that would be written:

    unless ( EXPR .. 1 == 0 ) { BLOCK }

    Also you want the 'next' to go to the next line, i.e. the next
    iteration of the while loop. But by default it goes to the next
    iteration of the inner-most looping construct (the until). You could
    get around this by labling your loops (see perldoc -f next).

    But, of course, you didn't want the inner loop at all.

    This newsgroup does not exist (see FAQ). Please do not start threads
    here.
     
    , Jul 16, 2003
    #2
    1. Advertising

  3. Chris Vidal

    Chris Vidal Guest

    Yes you are right, thats why I posted my question here.

    ...cant figure it out or find a good example.

    I want to skip some lines ...


    <> wrote in message
    news:...
    > "Chris Vidal" <> wrote in message

    news:<bf1f24$>...
    > > Lets say I have a ascii text file named sumfil and its contents are as
    > > follows :
    > >
    > > 1
    > > 2
    > > 3
    > > a
    > > b
    > > c
    > >
    > > I dont want to act on any line before the line containing "a". The below
    > > doesnt work. I sit at the command line I think in an infinite loop.
    > >
    > > #! /opt/perl5/bin/perl
    > > $tfil = "sumfil";
    > > open (IN, "$tfil") or die;
    > > while (defined($line = <IN>)) {
    > > until ($line =~ "3") {
    > > next;
    > > } # end until
    > > chomp $line;
    > > print "$line\n"
    > > } #end while

    >
    > You have misunderstood what until means in Perl.
    >
    > until (EXPR) {BLOCK}
    >
    > is a _looping_ construct.
    >
    > _Each_ time the above is executed it will repeatedly do BLOCK until
    > EXPR is true. If BLOCK cannot make EXPR become false and does not
    > break out of the loop by some other means then this is an infinite
    > loop.
    >
    > You you evidently believe until is a simple negated condition with
    > memory. i.e. it does something once each time it is executed until
    > some condition is true and thereafter never does it again.
    >
    > In Perl that would be written:
    >
    > unless ( EXPR .. 1 == 0 ) { BLOCK }
    >
    > Also you want the 'next' to go to the next line, i.e. the next
    > iteration of the while loop. But by default it goes to the next
    > iteration of the inner-most looping construct (the until). You could
    > get around this by labling your loops (see perldoc -f next).
    >
    > But, of course, you didn't want the inner loop at all.
    >
    > This newsgroup does not exist (see FAQ). Please do not start threads
    > here.
     
    Chris Vidal, Jul 18, 2003
    #3
  4. Chris Vidal

    Guest

    "Chris Vidal" <> rudely spits TOFU in my face:

    > Yes you are right,


    I said a lot of things. As far as I know all of them were true.
    Without context I have no idea which to refer to.

    > thats why I posted my question here.


    None of the things I said could have accounted for your decision to
    post to a non-existant newsgroup.

    > ...cant figure it out or find a good example.


    I have no idea what you are talking about.

    > I want to skip some lines ...


    This was clear from your original post. And appart from your
    confusion about 'until' and 'unless' you were basically doing it right
    (i.e. using 'next') in your OP. Now I've cleared that up your code
    would almost work (except it would include in the output the line that
    triggered the state change).

    The obvious way to avoid that just to spell it out:

    use strict;
    use warnings;

    my $seen_trigger;
    while (<>) {
    unless ( $seen_trigger ) {
    $seen_trigger = /PATTERN/;
    next;
    }
    print;
    }

    If you still have a problem then I suggest you produce another minimal
    but complete script that illustrates your problem (see posting
    guidelines in comp.lang.perl.misc) and post it to that newsgroup
    because this one does not exist (see FAQ).

    If someone tries to help do not insult them by spitting TOFU in their
    faces (see guidelines). Doing so will rapidly exhaust your quota of
    good-will.
     
    , Jul 18, 2003
    #4
    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. Leon
    Replies:
    2
    Views:
    544
  2. Replies:
    0
    Views:
    568
  3. =?ISO-8859-1?Q?KLEIN_St=E9phane?=
    Replies:
    3
    Views:
    461
    hanumizzle
    Oct 6, 2006
  4. Ivan Liu
    Replies:
    3
    Views:
    458
    Jerry Coffin
    Sep 5, 2006
  5. Replies:
    27
    Views:
    430
    Peter J. Holzer
    May 18, 2007
Loading...

Share This Page